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 thoughts on “Transformando as outras URL do opencart em amigáveis

        1. Thiago, baixei essa versão, e o arquivo é mesmo, será feita as mesmas modificações. Irei disponibilizar o arquivo para ser baixado, depois basta descompactar enviar a pasta catalog.

          1. Thiago, é o mesmo arquivo, apenas o seu está com espaçamento a mais. Lembrando q último código, já está com a a modificação

          2. cara desculpa ressuscitar o topico , mas preciso muito de um programa que faça isso ! ele pega o nome e transforma em url amigavel ? nome-do-produto isso ? esse codigo esta funcionando ? aguardo obrigado

          1. e copiei tambem, mas continua o erro.

            Olhei o arquivo do download e vi que tirando os espaços alguns erros desaparecem, mas os if continua mostrando erros, é como se a tags de fechamento nao estivessem sendo reconhecidas. Nunca vi isso…

    1. 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

  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.

    1. Realmente Rafael não tive tempo pra testar as novas versões, terminando alguns serviços meus, vou dá uma analisar, e fazer as adaptações, e disponibilizar aqui no site. abrs

  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.

  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

    1. 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

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *