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
[php]
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’,
);
[/php]
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
[php]
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;
}
[/php]
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.
[php]
public function getValueFriendly($route) {
if( count($this->urlFriendly) > 0) {
if(in_array($route, array_keys($this->urlFriendly))){
return ‘/’.$this->urlFriendly[$route];
}
}
return false;
}
[/php]
Agora vamos adicionar os novos métodos nas partes responsáveis, dentro do método index(), você encontrará esse código:
[php]
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’;
}
[/php]
Você irá alterá-lo, ficando assim:
[php]
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’;
}
[/php]
Depois no método rewrite, depois de fechar o elseif ($key == ‘path’) { … }, adicionaria esse trecho
[php]
if( $_link = $this->getValueFriendly($data[‘route’]) ){
$url .= $_link;
unset($data[$key]);
}
[/php]
O código completo ficaria assim:
[php]
<?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;
}
}
?>
[/php]
A versão para Download – seo_url_modificado
Qual a versão do seu opencart?
Meu arquivo é muito diferente…
Realmente esqueci de informar a versão, já alterei no post, a versão q utilizei foi 1.5.1.3. Qual a versão q vc está utilizando ?
Estou usando a versao 1.5.3.1
Saberia me informar como faço essas alterações?
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.
olha o meu arquivo seguindo o mesmo diretorio que vc passou e na versao 1.5.1.3
http://www.4shared.com/zip/1oNCG1YR/seo_url.html
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
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
Ramon, o que mostrei, foi transformar as outras páginas, onde você não informar a URL, pra colocar como amigável. Eu tenho um tutorial, que faria basicamente isso, você coloca o nome, e clicaria fora do campo, ele adicionaria a forma de URL amigável.
https://www.davidchc.com.br/tutoriais/php-tutoriais/adicionar-slug-automatico-no-opencart/
Ah sim…
Perfeito o seu codigo, facilitou muito.
Obrigado pela ajuda!!!!
Deu erro..
Parse error: syntax error, unexpected T_STRING, expecting T_FUNCTION in catalog/controller/common/seo_url.php on line 3
Thiago, vc utilizou o código do download ou copiou do site mesmo?
utilizei o do download
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…
Thiago, baixe novamente ou copie do post (modifiquei os dois), que agora irá funcionar.
Agora funcionou perfeitamente, mas qual era o erro?
Fiquei curioso!!!
No mais obrigado pela ajuda!!!
Tinha faltado uma chaves.
Davi
Fiquei com uma duvida, voce saberia se tem como inserir essas “novas paginas” no arquivo de sitemap?
Thiago, tem sim, basta acessar o arquivo catalog/controller/feed/google_sitemap.php
E depois fazer essas modificações:
https://gist.github.com/4135338
Que isso cara, seu site ta melhor que o google.
Valeu pela ajuda
hehehe. abrs
não é mais fácil passar os arquivos online para baixar?
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
ola, ja possui a modificação para a versão 1.5.4?
Eduardo, ainda não testei nas versão mais novas.
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.
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
Valeu, no aguardo, abs.
Olá,
Adaptei esse tutorial para o formato VQMod.
Segue o código no pastebin.
http://pastebin.com/ansPitj2
Qualquer sugestão é bem vinda.
No meu caso troquei também o “common/home” ficando: ‘common/home’ => ”,
Testado no Opencart 1.5.5.1
@jroque, realmente nem testei em versões posteriores, mas bom q vc testou, e funcionou nessa versão.
@jroque show.
Muito bom! Obrigado aos dois que fizeram um ótimo trabalho!
Consigui modificar e deixar funcionando na versão 1.5.5.1
Poderia compartilhar o arquivo para funcionar na versão 1.5.5.1?
Diego, eu usei essa versão da tradução pra 1.5.5.1, e não tive problema.
Tem como postar o código parafuncionar na versão 1.5.5.1
A versão VQMOD funcionou perfeitamente!!!
Opencart 1.5.6
Obrigado!
Uso o OP 1.5.5.1 com o vqmod 2.4.1 e não funcionou já habilitei em configurações > Servidor > usar URL Amigavel.
Alguma dica?
As outras URL, como de produto, e categorias, quando adicionadas o slug, ele ficar como amigável ?
Sim, tanto de as do produto quanto as de categorias estão ok.
Vc tá usando vqmod q o jroque add nos comentários, ou código final q disponibilizei, ou vc mesmo fez as modificações?
https://www.davidchc.com.br/tutoriais/opencart-tutoriais/transformando-as-outras-url-do-opencart-em-amigaveis/#comment-2060
Estou a utilizar o código que o jroque publicou em http://pastebin.com/ansPitj2
Eu utilize esse código do jroque, do vQmod, e funcionou normalmente. Veja se no vqmod foi gerado o novo arquivo
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.
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
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