Elimina index.php? Route=common/home de OpenCart
seo sem (13)
Actualmente tengo User SEO URL''s
configurada en Sí en OpenCart Admin.
System -> Settings -> Store -> Server -> User SEO URL''s
Hasta ahora, todas las etiquetas y enlaces de SEO están funcionando; El comando ha hecho el efecto deseado.
Sin embargo, para la página de inicio y algunos otros enlaces; ¿Cómo elimino?
index.php? route = common / home
De la URL? ¿Tengo que buscar y reemplazar literalmente en los archivos PHP de código fijo y las actualizaciones de riesgo o hay alguna otra forma?
(Sin rendimiento de hinchamiento, es decir, no hay herramientas de aficionados pobres como vQmod)
¿Qué tal reemplazar un enlace en el logotipo con <?php echo $base; ?>
<?php echo $base; ?>
. Hará un enlace al dominio base y eliminará index.php?route=common/home
.
/catalog/controller/common/seo_url.php
Abra el archivo y reemplace el siguiente código
<?php
class ControllerCommonSeoUrl extends Controller {
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'';
}
}
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'';
}else {
$this->request->get[''route''] = $this->request->get[''_route_''];
}
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/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]);
}else {
$url .= ''/''.$value;
}
}
}
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;
}
}
}
?>
------------------ DONDE EL CAMBIO -------------------------
La siguiente línea i agregada en el índice de función pública () también reescribe la función pública.
else {
this->request->get[''route''] = $this->request->get[''_route_''];
}
Función de índice () Ejecutar así
- Obtenga la consulta de htaccss "? Route = $ 1" (Ejemplo: la url se parece a site.com/shirts)
- así que la ruta es camisetas
- ahora, la función comprobar las "camisetas" se encuentra en la tabla url_alias si se encuentra, entonces se puede hacer una variable como index.php? categoryID = Valor de la tabla url_alias.
- O bien, si no hay registros en la tabla url_alias para las camisas, entonces se comprueba si hay otras páginas, como información o fabricante, si se encuentra una variable de obtención Ejemplo index.php? Route = information / information o index.php? Route = producto / fabricante / info.
- Pero no se comprueba si se encuentra en diseños. Así que agregué el código en el bloque else que establece la ruta en la variable get como este index.php? Route = < route >
- Así que en funciones de index () funciona bien. Igual que hice en reescribir la función.
Conseguí este http://www.antropy.co.uk/index.php/blog/one-quick-opencart-seo-tip-to-avoid-a-duplicate-home-page/ trabajado para mí en la eliminación del código para mi página de inicio
En el archivo / system / library / response.php, agregue la siguiente línea al comienzo de la salida de la función pública ()
if (!defined(''HTTP_CATALOG'')) $this->output = str_replace(array(''index.php?route=common/home'', ''?route=common/home''), '''', $this->output);
Entonces, estoy usando 1.5.5.1 y ninguna respuesta a esta pregunta resolvió mi problema. Sin embargo, combinando las respuestas de , y @rkaartikeyen me ocurrió una solución totalmente funcional.
Recuerde habilitar las URL de seo como se muestra en .
Una explicación se puede encontrar debajo del código.
[php] class ControllerCommonSeoUrl extends Controller { 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''; } } 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''; }else { $this->request->get[''route''] = $this->request->get[''_route_'']; } 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]); } } } 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 { $link = str_replace(''index.php?route='', '''', $link); return $link; } } }
Aparentemente, y resuelven el problema de que las URL estén escritas correctamente en la página.
Line 113 $link = str_replace(''index.php?route='', '''', $link);
Pero parece romper las URL ya que el controlador no puede encontrar las páginas y, por lo tanto, vuelve a la página de error.
Line 38 - 40 } else { $this->request->get[''route''] = ''error/not_found''; }
@rkaartikeyen solución de @rkaartikeyen resuelve este problema configurando la ruta actual a la ruta solicitada
Line 51 - 53 else { $this->request->get[''route''] = $this->request->get[''_route_'']; }
He creado un VQMOD para esto. Descarga gratuita aquí: http://www.opencart.com/index.php?route=extension/extension/info&extension_id=14683
Funciona bien.
La solución de Jay no funciona para mí, después de la edición aparece la pantalla en blanco. Así que hice una nueva:
Ponga la línea antes:
return $link;
En lugar de después
public function rewrite($link) {
Las "soluciones" anteriores son incorrectas porque están atacando la traducción de la URL de SEO. Lo que quieres es lidiar con la generación de URL dentro de OpenCart.
Seamos sencillos. Vaya a /system/library/url.php
y vea el public function link
. Reemplace la función con esta versión:
<modification>
<file name="system/library/url.php">
<operation>
<search position="before"><![CDATA[$url .= ''index.php?route='' . $route;]]></search>
<add><![CDATA[
if (''common/home'' == $route) {
if ($args) {
$url .= ''?'' . str_replace(''&'', ''&'', ''&'' . ltrim($args, ''&''));
}
} else {
]]></add>
</operation>
<operation>
<search position="before"><![CDATA[foreach ($this->rewrite as $rewrite) {]]></search>
<add><![CDATA[
}
]]></add>
</operation>
</file>
<file name="catalog/controller/common/seo_url.php">
<operation>
<search position="replace"><![CDATA[parse_str($url_info[''query''], $data);]]></search>
<add><![CDATA[
if (isset($url_info[''query''])) parse_str($url_info[''query''], $data);
]]></add>
</operation>
</file>
</modification>
Tan simple como eso. No puedo creer por qué esto no está en el núcleo de OpenCart.
EDITAR:
Ejecuto algunas pruebas y, si las URL de SEO están habilitadas, es necesario realizar una única edición en el /catalog/controller/common/seo_url.php
para evitar un error de "índice no /catalog/controller/common/seo_url.php
".
Dentro de public function rewrite
, reemplace esta línea:
public function link($route, $args = '''', $connection = ''NONSSL'') {
if (''NONSSL'' == $connection) {
$url = $this->url;
} else {
$url = $this->ssl;
}
if (''common/home'' == $route) {
if ($args) {
$url .= ''?'' . str_replace(''&'', ''&'', ''&'' . ltrim($args, ''&''));
}
} else {
$url .= ''index.php?route='' . $route;
if ($args) {
$url .= str_replace(''&'', ''&'', ''&'' . ltrim($args, ''&''));
}
}
foreach ($this->rewrite as $rewrite) {
$url = $rewrite->rewrite($url);
}
return $url;
}
Con este:
parse_str($url_info[''query''], $data);
Ahora realmente funciona.
Llegué tarde pero mi solución podría ser útil para otros (probada en Opencart 2.0.3.1):
Abra su consola MySQL y ejecute esta consulta (cambie YOURDATABASE con su nombre de db):
INSERT INTO `YOURDATABASE`.`url_alias` (`url_alias_id`, `query`, `keyword`) VALUES (NULL, ''common/home'', '' '');
Cómo funciona:
El truco consiste en agregar un ESPACIO BLANCO ('''') para la columna "palabra clave", si inserta una cadena vacía ('''') esta solución no funciona y el reescritor de url devolverá nuevamente index.php? Route = common / casa.
Me gusta mucho la solución de Victor Schröder por su simplicidad. ¡Gracias! Creé un vQmod basado en sus modificaciones de código en caso de que fuera útil para alguien. Aquí está el código:
if (isset($url_info[''query''])) parse_str($url_info[''query''], $data);
Para eliminar index.php?route=
from urls, simplemente recomiendo editar el archivo .htaccess
.
Solo agrega esto:
RewriteCond %{THE_REQUEST} / /index/.php/?_route_=?([^&/ ]*)
RewriteRule ^ /%1? [L,R]
No encuentro ningún problema en absoluto. Solo recuerda que necesitas tener RewriteEngine habilitado. Busque esta línea: RewriteEngine On
. Si no está presente, pase el código anterior.
Para simplemente eliminar eso, puedes hacer un reemplazo básico en /catalog/controller/common/seo_url.php
Encontrar:
return $link;
Antes de que en una nueva línea poner:
$link = str_replace(''index.php?route=common/home'', '''', $link);
Edite por TheBlackBenzKid: Si desea un SEO completo, solo use esta línea en lugar de la anterior:
$link = str_replace(''index.php?route='', '''', $link);
También asegúrese de que las URL de SEO estén activadas en el panel de administración de la tienda.
Paso 01. Habilita las URL de USE SEO en la configuración del servidor de tu tienda
Vaya al "Sistema" y haga clic en "Configuración". Localice la tienda que desea modificar y haga clic en el enlace "Editar" a la derecha. Finalmente, haga clic en la pestaña "Servidor" y configure la radio de la URL de SEO en "Sí" y guarde su configuración.
Nota: Las palabras clave no se crearán automáticamente. También debe tener Apache mod_rewrite activado. La mayoría de los servidores web tendrán esto por defecto. El paso 3 de este tutorial explicará cómo agregar las palabras clave.
Paso 02. Cambie algo de contenido en su archivo .htaccess para hacer que su página de inicio sea compatible con la URL de SEO
Vaya al panel de control de su host y edite su archivo .htaccess. A veces, este archivo está oculto para mostrarlo, puede hacer clic en el administrador de archivos del panel de control de su host web y marcar la opción Mostrar archivos ocultos seguido del botón "Ir".
Una vez que localice el archivo .htaccess, cambie las siguientes líneas:
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*/.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
A:
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*/.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
RewriteCond %{QUERY_STRING} ^route=common/home$
RewriteRule ^index/.php$ http://www.yourwebsite.co.uk? [R=301,L]
Si realiza el paso anterior, su página de inicio cambiará de algo como esto: http://yourwebsite.com/index.php?route=common/home a esto: http://yourwebsite.com
Paso 03. Ingrese las palabras clave de SEO para las URL manualmente Finalmente, debe ingresar las palabras clave de SEO para cada página, información, producto y categoría que desea reescribir de la URL. Puede encontrar el campo para las palabras clave de SEO en la pestaña Datos al editar y crear elementos.
Una vez que haya ingresado las palabras clave de SEO, su URL estará funcionando.
Una vez que haya seguido todas estas instrucciones, puede comenzar a obtener los beneficios de una clasificación más alta, un mayor tráfico y más clientes.