php - ¿Cómo puedo crear URL personalizadas para SEO en OpenCart?
.htaccess (7)
¿Cómo se pueden personalizar las URL del sistema en OpenCart? Por ejemplo, me gustaría que http://example.com/index.php?route=checkout/cart se muestre como http://example.com/cart
Sé que OpenCart proporciona URL SEO para productos, categorías, fabricantes y páginas de información, pero no parece que haya nada incorporado (al menos antes de la versión 1.5.0) para nada más.
Coloque esto cerca de la parte superior de su archivo index.php. Fue la única solución que funcionó para mí.
switch($_SERVER["REQUEST_URI"])
{
case ''/old-url'': $three01 = "/new-url"; break;
}
if($three01)
{
header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$three01); exit;
}
Estoy usando la versión 1.5.5.1 de Opencart y este es el código exacto que funcionó para mí:
<?php
class ControllerCommonSeoUrl extends Controller {
/* SEO Custom URL */
private $url_list = array (
''common/home'' => '''',
''checkout/cart'' => ''cart'',
''account/register'' => ''register'',
''account/wishlist'' => ''wishlist'',
''checkout/checkout'' => ''checkout'',
''account/login'' => ''login'',
''product/special'' => ''special'',
''affiliate/account'' => ''affiliate'',
''checkout/voucher'' => ''voucher'',
''product/manufacturer'' => ''brand'',
''account/newsletter'' => ''newsletter'',
''account/order'' => ''order'',
''account/account'' => ''account'',
''information/contact'' => ''contact'',
''account/return/insert'' => ''return'',
''information/sitemap'' => ''sitemap'',
);
/* SEO Custom URL */
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'';
}
}
/* SEO Custom URL */
if ( $_s = $this->setURL($this->request->get[''_route_'']) ) {
$this->request->get[''route''] = $_s;
}/* SEO Custom URL */
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/info'';
} 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) {
$url_info = parse_url(str_replace(''&'', ''&'', $link));
$url = '''';
$data = array();
parse_str($url_info[''query''], $data);
foreach ($data as $key => $value) {
if (isset($data[''route''])) {
if (($data[''route''] == ''product/product'' && $key == ''product_id'') || (($data[''route''] == ''product/manufacturer/info'' || $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]);
}
/* SEO Custom URL */
if( $_u = $this->getURL($data[''route'']) ){
$url .= $_u;
unset($data[$key]);
}/* SEO Custom URL */
}
}
if ($url) {
unset($data[''route'']);
$query = '''';
if ($data) {
foreach ($data as $key => $value) {
$query .= ''&'' . $key . ''='' . $value;
}
if ($query) {
$query = ''?'' . trim($query, ''&'');
}
}
return $url_info[''scheme''] . ''://'' . $url_info[''host''] . (isset($url_info[''port'']) ? '':'' . $url_info[''port''] : '''') . str_replace(''/index.php'', '''', $url_info[''path'']) . $url . $query;
} else {
return $link;
}
}
/* SEO Custom URL */
public function getURL($route) {
if( count($this->url_list) > 0) {
foreach ($this->url_list as $key => $value) {
if($route == $key) {
return ''/''.$value;
}
}
}
return false;
}
public function setURL($_route) {
if( count($this->url_list) > 0 ){
foreach ($this->url_list as $key => $value) {
if($_route == $value) {
return $key;
}
}
}
return false;
}/* SEO Custom URL */
}
?>
OpenCart SEO para OpenCart 1.5.X gratis :)
Puede usar como lo desee. Nombre de la categoría / ID / ID para una resolución de SEO más rápida
<?php
class ControllerCommonSeoUrl extends Controller {
/* SEO Custom URL */
private $url_list = array (
''common/home'' => ''home'',
''checkout/cart'' => ''cart'',
''account/register'' => ''register'',
''account/wishlist'' => ''wishlist'',
''checkout/checkout'' => ''checkout'',
''account/login'' => ''login'',
''product/special'' => ''special'',
''affiliate/account'' => ''affiliate'',
''checkout/voucher'' => ''voucher'',
''product/manufacturer'' => ''brand'',
''account/newsletter'' => ''newsletter'',
''account/order'' => ''order'',
''account/account'' => ''account'',
''information/contact'' => ''contact'',
''account/return/insert'' => ''return/insert'',
''information/sitemap'' => ''sitemap'',
);
/* SEO Custom URL */
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_'']);
if ( count($parts) > 1 ) {
if ($parts[1] == ''category''){
$this->request->get[''path''] = $parts[2];
for ( $i = 3 ; $i < count($parts); $i++) {
$this->request->get[''path''] .= ''_'' . $parts[$i];
}
}elseif( $parts[1] == ''item'' ) {
$this->request->get[''product_id''] = $parts[2];
}
}
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'';
}
}
/* SEO Custom URL */
if ( $_s = $this->setURL($this->request->get[''_route_'']) ) {
$this->request->get[''route''] = $_s;
}/* SEO Custom URL */
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'';
}
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/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 == ''product_id'' ) {
$url = ''/shop/item/''.$value;
unset($data[$key]);
}elseif ($key == ''path'') {
$categories = explode(''_'', $value);
$url = ''/shop/category'';
foreach ($categories as $category) {
$url .= ''/''.$category;
}
unset($data[$key]);
}//
/* SEO Custom URL */
if( $_u = $this->getURL($data[''route'']) ){
$url .= $_u;
unset($data[$key]);
}/* SEO Custom URL */
}
}
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;
}
}
/* SEO Custom URL */
public function getURL($route) {
if( count($this->url_list) > 0) {
foreach ($this->url_list as $key => $value) {
if($route == $key) {
return ''/''.$value;
}
}
}
return false;
}
public function setURL($_route) {
if( count($this->url_list) > 0 ){
foreach ($this->url_list as $key => $value) {
if($_route == $value) {
return $key;
}
}
}
return false;
}/* SEO Custom URL */
}
?>
Resulta que esto se puede hacer con un cambio relativamente simple en un solo archivo. Sin reglas de reescritura de .htaccess, simplemente parchee el archivo catalog / controller / common / seo_url.php y agregue sus URL bonitas a una tabla de base de datos existente.
El parche para seo_url.php:
Index: catalog/controller/common/seo_url.php
===================================================================
--- catalog/controller/common/seo_url.php (old)
+++ catalog/controller/common/seo_url.php (new)
@@ -48,7 +42,12 @@
$this->request->get[''route''] = ''product/manufacturer/product'';
} elseif (isset($this->request->get[''information_id''])) {
$this->request->get[''route''] = ''information/information'';
- }
+ } else {
+ $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = ''" . $this->db->escape($this->request->get[''_route_'']) . "''");
+ if ($query->num_rows) {
+ $this->request->get[''route''] = $query->row[''query''];
+ }
+ }
if (isset($this->request->get[''route''])) {
return $this->forward($this->request->get[''route'']);
@@ -88,7 +87,15 @@
}
unset($data[$key]);
- }
+ } else {
+ $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = ''" . $this->db->escape($data[''route'']) . "''");
+
+ if ($query->num_rows) {
+ $url .= ''/'' . $query->row[''keyword''];
+
+ unset($data[$key]);
+ }
+ }
}
}
Se requieren dos ediciones. El primero amplía la función index()
para buscar en la tabla url_alias
cualquier palabra clave que coincida $this->request->get[''_route_'']
.
El segundo extiende la función rewrite()
para buscar en la tabla url_alias
todas las rutas, no solo aquellas para productos, fabricantes y páginas de información.
Agregar entradas a la base de datos:
INSERT INTO `url_alias` (`url_alias_id`, `query`, `keyword`) VALUES
(NULL, ''checkout/cart'', ''cart'');
Eso es. http://example.com/cart debería devolver lo mismo que http://example.com/index.php?route=checkout/cart y OpenCart debería reconocer $this->url->link(''checkout/cart'');
y devuelve un enlace a la bonita URL http://example.com/cart
Según el nivel de personalización que necesite, hay algunas extensiones disponibles, incluidas las gratuitas.
Éste funciona tanto en OpenCart 1.5 como en OpenCart 2 y parece bastante personalizable. Sin embargo, no es compatible con la personalización de partes de URL codificadas como "pago / compra" o "cuenta / lista de deseos".
Here hay un vQmod para OpenCart 2.0 (podría funcionar con 1.5, no probado) que se aplica a la extensión mencionada anteriormente y permite cambiar estas cadenas codificadas en lo que desee y admite sitios web en varios idiomas.
Por ejemplo, "checkout / cart" se convertirá en "cart" para inglés, "panier" para francés, etc.
Un método simple de "sin código" es instalar vQmod. Instrucciones aquí: vQmod install wiki
Y luego cargue el archivo xml disponible en este hilo del foro de Opencart a la carpeta vqmod / xml /.
El xml contiene un script relativamente fácil de leer que mapea las direcciones URL similares a las dos respuestas anteriores, pero sin modificar los archivos centrales. Así que las actualizaciones del sitio no lo matarán.
vQmod archivo xml
<modification>
<id>Seo All Alias</id>
<version>1.0</version>
<vqmver>2.1.7</vqmver>
<author>noname</author>
<file name="catalog/controller/common/seo_url.php">
<operation>
<search position="after" offset="2"><![CDATA[
$this->request->get[''route''] = ''information/information'';
]]></search>
<add><![CDATA[
else {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = ''" . $this->db->escape($this->request->get[''_route_'']) . "''");
if ($query->num_rows) {
$this->request->get[''route''] = $query->row[''query''];
}
}
]]></add>
</operation>
<operation>
<search position="after" offset="1" index="2"><![CDATA[
unset($data[$key]);
]]></search>
<add><![CDATA[
else {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = ''" . $this->db->escape($data[''route'']) . "''");
if ($query->num_rows) {
$url .= ''/'' . $query->row[''keyword''];
unset($data[$key]);
}
}
]]></add>
</operation>
</file>