Transformando as outras URL do opencart em amigáveis

O opencart por padrão trabalhar com a URL amigáveis dos produtos, categorias, informações, mas alguns itens ele não modificar, como checkout, carrinho, etc. Vou mostrar algumas modificações para ele converta essas URL também.

A versão utilizada para o modificação foi a 1.5.1.3.

Acesse o arquivo catalog/controller/common/seo_url.php

Obs:. Lembre-se antes de fazer backup do arquivo antes de modificá-lo.

Vamos adicionar uma propriedade que terá o valor padrão e a forma amigável. Esses nomes amigáveis podem ser mudados de acordo com sua preferência

private $urlFriendly = array(
			'common/home'       => 'home',
			'checkout/cart'     => 'carrinho',
			'account/register'  => 'cadastre-se',
			'account/wishlist'  => 'lista-de-desejo',
			'checkout/checkout' => 'checkout',
			'account/logout'    => 'sair',
			'account/login'     => 'login',
			'product/special'   => 'especial',
			'affiliate/account' => 'afiliado',
			'checkout/voucher'  => 'vale-presente',
			'product/manufacturer' => 'fabricante',
			'account/newsletter'   => 'newsletter',
			'account/order'        => 'meus-pedidos',
			'account/account'      => 'minha-conta',
			'information/contact'  => 'contato',
			'information/sitemap'   => 'mapa-do-site',
			'account/forgotten'     => 'lembrar-senha',
			'account/download'     => 'meus-download',
			'account/return'     => 'minhas-devolucoes',
			'account/transaction'     => 'minhas-indicacoes',
			'account/password'     => 'alterar-senha',
			'account/edit'     => 'alterar-informacoes',
			'account/address'     => 'alterar-enderecos',
			'account/reward'     => 'pontos-de-fidelidade',
		);

Agora vamos criar dois métodos, o primeiro para dizer o valor correspondente da url amigável, exemplo, quando for digitado contato retornará o valor information/contact

public function getKeyFriendly($_route) {
       if( count($this->urlFriendly) > 0 ){
	  $key = array_search($_route, $this->urlFriendly);
	  if($key && in_array($_route, $this->urlFriendly)){
	    return $key;
	  }
       }
       return false;
}

Basicamente, ele pega valor, pesquisa no array com os valores, e retorna chave do array.

Agora vamos criar outro método, para fazer o processo inverso, pesquisar nas chaves, e retorna o valor correspondente, essa modificação será na hora que for gerar o link.

public function getValueFriendly($route) {
      if( count($this->urlFriendly) > 0) {
	  if(in_array($route, array_keys($this->urlFriendly))){
             return '/'.$this->urlFriendly[$route];
	  }
       }
      return false;
}

Agora vamos adicionar os novos métodos nas partes responsáveis, dentro do método index(), você encontrará esse código:

if (isset($this->request->get['product_id'])) {
    $this->request->get['route'] = 'product/product';
} elseif (isset($this->request->get['path'])) {
   $this->request->get['route'] = 'product/category';
} elseif (isset($this->request->get['manufacturer_id'])) {
   $this->request->get['route'] = 'product/manufacturer/product';
} elseif (isset($this->request->get['information_id'])) {
  $this->request->get['route'] = 'information/information';
}

Você irá alterá-lo, ficando assim:

if ($_key = $this->getKeyFriendly($this->request->get['_route_']) ) {
  $this->request->get['route'] = $_key;
}elseif (isset($this->request->get['product_id'])) {
  $this->request->get['route'] = 'product/product';
}elseif (isset($this->request->get['path'])) {
  $this->request->get['route'] = 'product/category';
} elseif (isset($this->request->get['manufacturer_id'])) {
  $this->request->get['route'] = 'product/manufacturer/product';
} elseif (isset($this->request->get['information_id'])) {
  $this->request->get['route'] = 'information/information';
}

Depois no método rewrite, depois de fechar o elseif ($key == ‘path’) { … }, adicionaria esse trecho

 if( $_link = $this->getValueFriendly($data['route']) ){
      $url .= $_link;
      unset($data[$key]);
 }

O código completo ficaria assim:

<?php 

class ControllerCommonSeoUrl extends Controller { 	

private $urlFriendly = array(
            'common/home'       => 'home',
            'checkout/cart'     => 'carrinho',
            'account/register'  => 'cadastre-se',
            'account/wishlist'  => 'lista-de-desejo',
            'checkout/checkout' => 'checkout',
            'account/logout'    => 'sair',
            'account/login'     => 'login',
            'product/special'   => 'especial',
            'affiliate/account' => 'afiliado',
            'checkout/voucher'  => 'vale-presente',
            'product/manufacturer' => 'fabricante',
            'account/newsletter'   => 'newsletter',
            'account/order'        => 'meus-pedidos',
            'account/account'      => 'minha-conta',
            'information/contact'  => 'contato',
            'information/sitemap'   => 'mapa-do-site',
            'account/forgotten'     => 'lembrar-senha',
            'account/download'     => 'meus-download',
            'account/return'     => 'minhas-devolucoes',
            'account/transaction'     => 'minhas-indicacoes',
            'account/password'     => 'alterar-senha',
            'account/edit'     => 'alterar-informacoes',
            'account/address'     => 'alterar-enderecos',
            'account/reward'     => 'pontos-de-fidelidade',
        );

	public function index() {
		// Add rewrite to url class
		if ($this->config->get('config_seo_url')) {
			$this->url->addRewrite($this);
		}

		// Decode URL
		if (isset($this->request->get['_route_'])) {
			$parts = explode('/', $this->request->get['_route_']);

			foreach ($parts as $part) {
				$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");

				if ($query->num_rows) {
					$url = explode('=', $query->row['query']);

					if ($url[0] == 'product_id') {
						$this->request->get['product_id'] = $url[1];
					}

					if ($url[0] == 'category_id') {
						if (!isset($this->request->get['path'])) {
							$this->request->get['path'] = $url[1];
						} else {
							$this->request->get['path'] .= '_' . $url[1];
						}
					}

					if ($url[0] == 'manufacturer_id') {
						$this->request->get['manufacturer_id'] = $url[1];
					}

					if ($url[0] == 'information_id') {
						$this->request->get['information_id'] = $url[1];
					}
				} else {
					$this->request->get['route'] = 'error/not_found';
				}
			}

			/*Modificado*/
			if ($_key = $this->getKeyFriendly($this->request->get['_route_']) ) {
				$this->request->get['route'] = $_key;
			}elseif (isset($this->request->get['product_id'])) {
				$this->request->get['route'] = 'product/product';
			} elseif (isset($this->request->get['path'])) {
				$this->request->get['route'] = 'product/category';
			} elseif (isset($this->request->get['manufacturer_id'])) {
				$this->request->get['route'] = 'product/manufacturer/product';
			} elseif (isset($this->request->get['information_id'])) {
				$this->request->get['route'] = 'information/information';
			}

			if (isset($this->request->get['route'])) {
				return $this->forward($this->request->get['route']);
			}
		}
	}

	public function rewrite($link) {
		if ($this->config->get('config_seo_url')) {
			$url_data = parse_url(str_replace('&', '&', $link));

			$url = '';

			$data = array();

			parse_str($url_data['query'], $data);

			foreach ($data as $key => $value) {
				if (isset($data['route'])) {
					if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/product' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
						$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");

						if ($query->num_rows) {
							$url .= '/' . $query->row['keyword'];

							unset($data[$key]);
						}
					} elseif ($key == 'path') {
						$categories = explode('_', $value);

						foreach ($categories as $category) {
							$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");

							if ($query->num_rows) {
								$url .= '/' . $query->row['keyword'];
							}
						}

						unset($data[$key]);
					}
					//Modificado
					if( $_link = $this->getValueFriendly($data['route']) ){
					   $url .= $_link;
					   unset($data[$key]);
					}

				}
			}

			if ($url) {
				unset($data['route']);

				$query = '';

				if ($data) {
					foreach ($data as $key => $value) {
						$query .= '&' . $key . '=' . $value;
					}

					if ($query) {
						$query = '?' . trim($query, '&');
					}
				}

				return $url_data['scheme'] . '://' . $url_data['host'] . (isset($url_data['port']) ? ':' . $url_data['port'] : '') . str_replace('/index.php', '', $url_data['path']) . $url . $query;
			} else {
				return $link;
			}
		} else {
			return $link;
		}
	}

        //adicionado
	public function getKeyFriendly($_route) {
            if( count($this->urlFriendly) > 0 ){
		$key = array_search($_route, $this->urlFriendly);
		if($key && in_array($_route, $this->urlFriendly)){
	 	   return $key;
		}
          }
          return false;
       }

       //adicionado
	public function getValueFriendly($route) {
           if( count($this->urlFriendly) > 0) {
	      if(in_array($route, array_keys($this->urlFriendly))){
		 return '/'.$this->urlFriendly[$route];
	     }
          }
          return false;
	}

}

?>

A versão para Download – seo_url_modificado

46 comentários em “Transformando as outras URL do opencart em amigáveis”

    • Marcio, O arquivo está disponível para download no final do artigo, mas minha intenção é ensinar a como fazer, para que a pessoa possa fazer a alteração que quiser e não se prender numa solução pronta. abrs

      Responder
  1. Parece bom, pena que ainda não tem para 1.5.5.1, estou procurando a tempos por isso mas não encontro em lugar algum, exceto pagando e caro kkkk… já tentei adptação disso mas não rola, pelo menos não consegui.

    Responder
  2. There’s an error on line 80:

    $this->request->get[‘route’] = ‘product/manufacturer/product’;

    This should be:

    $this->request->get[‘route’] = ‘product/manufacturer/info’;

    Also I’ve been using this vQmod file for some time, but now and then some URLs stop working. Instead, the user is directed to index?route=common/home. Later it spontaneously starts working again, and I haven’t been able to figure out why.

    Responder
  3. Meu OC 1.5.5.1 e está ocorrendo este erro, baixei o arquivo e mesmo assim não funcionou.
    Alguém consegue ajudar?

    Parse error: syntax error, unexpected ‘return’ (T_RETURN), expecting function (T_FUNCTION) in /var/www/vhosts/mysite.com.br/httpdocs/mysite/vqmod/vqcache/vq2-catalog_controller_common_seo_url.php on line 252

    Responder
    • Leandro, pelo erro, você deve ter usando a modificação do VQmod, não sei se vc usou a modificação feita pelo @jroque e ainda usou a modificação feita diretamente no arquivo

      Responder

Deixe um comentário