Borrar todas las reescrituras de URL - Enterprise (1.13)

27

Después de varias importaciones en mal estado, me he quedado con una carga de reescrituras de URL que necesito eliminar.

Estoy ejecutando Enterprise 1.13

Cuando tuve este problema en la comunidad, simplemente core_url_rewritelo trunqué y lo reindexé.

Sin embargo, en Enterprise, noto que hay varias tablas diferentes que controlan las reescrituras.

  • enterprise_url_rewrite
  • enterprise_url_rewrite_category_cl
  • enterprise_url_rewrite_product_cl
  • enterprise_url_rewrite_redirect
  • enterprise_url_rewrite_redirect_cl
  • enterprise_url_rewrite_redirect_rewrite

¿Estoy seguro de truncarlos a todos?

Anticipo completamente que alguien me diga que nunca debería truncar estas tablas, por lo que pido disculpas de antemano por la ingenuidad.

JamesAllwood
fuente
¿Qué quiere decir con "varias tablas diferentes que controlan las reescrituras"? En EE usualmente hice lo mismo que en CE. Truncar core_url_rewritey funcionó.
Marius
Hola marius Estas son las tablas que buscan controlar reescrituras. Había truncado core_url_rewrites, pero no tuvo ningún efecto en los que figuran en admin. enterprise_url_rewrite enterprise_url_rewrite_category_cl enterprise_url_rewrite_product_cl enterprise_url_rewrite_redirect enterprise_url_rewrite_redirect_cl enterprise_url_rewrite_redirect_rewrite Gracias
JamesAllwood
Oh, lo siento. Mi error. Perdí esta línea "Estoy ejecutando Enterprise 1.13". No tengo experiencia (todavía) con EE 1.13. Ignórame por ahora.
Marius
1
Algo a considerar: gist.github.com/Vinai/5451584
B00MER
1
Recientemente actualizamos Magento EE 1.12 a EE 1.13 para una de nuestras tiendas y escribimos una publicación en nuestro sitio web sobre los cambios y problemas que podrían surgir: code4business.de/update-magento-enterprise-edition-1-13-0-2 / ... La publicación tiene una traducción al inglés en la parte inferior de la página.
user2830524

Respuestas:

30

Estamos en una situación similar a la tuya James. Después de mucho excavar esto es lo que se me ocurrió:

La core_url_rewritetabla ahora está en desuso, en cambio Magento EE 1.13 ahora almacena las reescrituras enenterprise_url_rewrite .

Tablas: enterprise_*_category_rewriteusocatalog_*_entity_url_key tablas para reconstruir las dos tablas de reescritura cuando ejecutephp indexer.php --reindex catalog_url_*

Cuando agrega una 'Redirección de URL' en el Catálogo de administración-> Redirecciona URL para una URL personalizada, se agrega a la enterprise_url_rewrite_redirecttabla y el indicador para Magento de que el índice ahora está desactualizado se ingresa en la enterprise_url_rewrite_redirect_cltabla que, cuando se ejecuta, php indexer.php --reindex url_redirectreconstruye elenterprise_url_rewrite_redirect_rewrite tabla.

Nota rápida, cualquier tabla que termine en _cl es segura de truncar, el 'CL' significa Registro de cambios y Magento lo utiliza para verificar si es necesario volver a indexar.

En lo que respecta a las tablas de clave de URL, todavía no tengo idea de por qué hay dos entradas de clave de URL una en catalog_*_entity_url_keyy una encatalog_*_entity_varchar (id. De atributo 90), pero supongo que esto es lo que sucede:

Cuando crea un nuevo producto / categoría, Magento usa el nombre para generar una url_key que se coloca en catalog_*_entity_url_keyAND en el catalog_*_entity_varchar, pero la tabla principal utilizada por Magento es catalog_*_entity_url_keyporque si la trunca y ejecuta, php indexer.php --reindex catalog_url_*sus enterprise_*_category_rewritetablas estarán vacías y los productos / categorías en la interfaz mostrará urls feas, es decir http://example.com/catalog/product/view/id/123/etc/etc(no compatible con SOE). Creo que las dos tablas están relacionadas y se utilizan para construir la enterprise_url_rewritetabla porque esta tabla almacena una 'request_path' muy probablemente la url_key dentro de la catalog_*_entity_varchartabla y un 'identificador' que es el primario Clave URL de la catalog_*_entity_url_keytabla. Podría estar completamente equivocado sobre las tablas url_key y varchar, así que solo estoy pensando en voz alta.

De todos modos, para truncar y reconstruir con éxito todas las tablas de reescritura que puede ejecutar:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE `core_url_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
SET FOREIGN_KEY_CHECKS = 1;

y luego ejecuta:

sudo php indexer.php --reindex catalog_url_product
sudo php indexer.php --reindex catalog_url_category
sudo php indexer.php --reindex url_redirect

Si también truncas enterprise_url_rewrite_redirect , perderá todas las redirecciones personalizadas que ve en su panel de administración, tal vez este sea su objetivo, ya que se quedó con un montón de URL inútiles. Mientras NO trunques las tablas '* _entity_url_key', estarás bien.

Nuestra historia era un poco diferente, porque teníamos claves de URL duplicadas y problemas importantes con los nombres de productos de las importaciones de Excel después de actualizar a 1.13 desde 1.11, así que escribí este script rápido para restablecer la catalog_product_entity_url_keytabla y las claves de URL y las rutas de URL en la catalog_product_entity_varchartabla usando el producto nombres Adjunto el código a continuación, pero si lo usa, úselo bajo su propio riesgo.

<?php
include_once('app/Mage.php');
Mage::app();

$dbHandle          = Mage::getSingleton('core/resource')->getConnection('core_write');
$productCounter    = 0;
$nameFixCounter    = 0;
$vUrlKeyFixCounter = 0;
$urlPathCounter    = 0;
$urlKeyCounter     = 0;
$productCollection = $dbHandle->query("SELECT entity_id, sku FROM catalog_product_entity");

while($product = $productCollection->fetch()) {    
  $dataString       = null;

  $oldProductName   = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 65")->fetch();
  $oldVarcharUrlKey = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 90")->fetch();
  $oldUrlPath       = $dbHandle->query("SELECT value FROM catalog_product_entity_varchar WHERE entity_id = '".$product['entity_id']."' AND store_id = 0 AND attribute_id = 91")->fetch();
  $oldUrlKey        = $dbHandle->query("SELECT value FROM catalog_product_entity_url_key WHERE entity_id = '".$product['entity_id']."'")->fetch();

  $newProductName   = preg_replace('/\s+/', ' ', trim(preg_replace('/[^\x20-\x21\x23-\x2B\x2D-\xE7]/', ' ', $oldProductName['value'])));
  $newUrlKey        = preg_replace('/\s+/', '-', trim(preg_replace('/[^\x30-\x39\x61-\x7A]/', ' ', strtolower($newProductName))));

  if (strcmp($oldProductName['value'], $newProductName)) {
    echo "-[".$oldProductName['value']."]\n";
    echo "+[".$newProductName."]\n";
    $dbHandle->query('UPDATE catalog_product_entity_varchar SET value = "'.$newProductName.'" WHERE entity_id = "'.$product['entity_id'].'" AND attribute_id = 65');
    ++$nameFixCounter;
  }

  if (strcmp($oldVarcharUrlKey['value'], $newUrlKey)) {
    echo "-[".$oldVarcharUrlKey['value']."]\n";
    echo "+[".$newUrlKey."]\n";
    if ($oldVarcharUrlKey['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '90', '0', '".$product['entity_id']."', '".$newUrlKey."')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_varchar SET value = '".$newUrlKey."' WHERE entity_id = '".$product['entity_id']."' AND attribute_id = 90");
    }
    ++$vUrlKeyFixCounter;
  }

  if (strcmp($oldUrlPath['value'], $newUrlKey.'.html')) {
    echo "-[".$oldUrlPath['value']."]\n";
    echo "+[".$newUrlKey.".html]\n";
    if ($oldUrlPath['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_varchar (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '91', '0', '".$product['entity_id']."', '".$newUrlKey.".html')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_varchar SET value = '".$newUrlKey.".html' WHERE entity_id = '".$product['entity_id']."' AND store_id = 0 AND attribute_id = 91");
    }
    ++$urlPathCounter;
  }

  if (strcmp($oldUrlKey['value'], $newUrlKey)) {
    echo "-[".$oldUrlKey['value']."]\n";
    echo "+[".$newUrlKey."]\n";
    if ($oldUrlKey['value'] === null) {
      $dbHandle->query("INSERT INTO catalog_product_entity_url_key (entity_type_id, attribute_id, store_id, entity_id, value) VALUES ('4', '90', '0', '".$product['entity_id']."', '".$newUrlKey."')");
    } else {
      $dbHandle->query("UPDATE catalog_product_entity_url_key SET value = '".$newUrlKey."' WHERE entity_id = '".$product['entity_id']."'");
    }
    ++$urlKeyCounter;
  }

  $report  = "[".++$productCounter."] ";
  $report .= "NAME: [".(strcmp($oldProductName['value'], $newProductName)?'!=':'==')."] ";
  $report .= "V_KEY: [".(strcmp($oldVarcharUrlKey['value'], $newUrlKey)?'!=':'==')."] ";
  $report .= "PATH: [".(strcmp($oldUrlPath['value'], $newUrlKey.'.html')?'!=':'==')."] ";
  $report .= "KEY: [".(strcmp($oldUrlKey['value'], $newUrlKey)?'!=':'==')."]\n";
  echo $report;

}
echo 'Total Products: ['.$productCounter.'] Names: ['.$nameFixCounter.'] V_Keys: ['.$vUrlKeyFixCounter.'] Paths: ['.$urlPathCounter.'] Keys: ['.$urlKeyCounter.']';

El código se puede modificar para usar el método de clave de formato Magentos aquí: http://www.magentocommerce.com/wiki/3_-_store_setup_and_management/seo/url_key_characters_conversion Desafortunadamente, encontré el wiki después de actualizar todas las claves, así que no me molesté en volver a actualizar todo de nuevo.

Espero que ayude :)!

Oleg
fuente
sudo php indexer.php --reindex catalog_url_catalogdebería ser sudo php indexer.php --reindex catalog_url_category.
Matthias Zeis
Estoy tratando de hacer lo mismo ahora. Sin embargo, después de truncar todas las tablas, solo se reindexan las URL directas de categoría y producto. No pude encontrar ninguna entrada para productos en categorías como catalog/product/view/id/XXX/category/YYY. ¿Puedes confirmar que esto es lo mismo para ti? No tengo ni idea de esto ... ¿Es un error o estoy haciendo algo mal? Traté de hacer lo mismo en una nueva instalación de 1.13.0.2, sucedió lo mismo. Reescribe funciona bien en la interfaz, pero no se establece ninguna categoría.
fmrng
9

Según lo que he visto jugando con EE 1.13 en un entorno de prueba y unas pequeñas pruebas rápidas que acabo de hacer, debería poder truncar esas tablas y luego reconstruir manualmente todos los índices de URL de la CLI.

Las tablas * _cl se utilizan en los DISPARADORES encontrados en el catalog_product_entity_url_key tabla. Los registros que insertan en esta tabla * _cl son los que, creo, se usan para indicar qué se debe volver a indexar después de guardar.

Aquí esta lo que hice. Después de usar la herramienta CLI para reconstruir los índices, todo parecía estar listo. Truncamiento de MySql ...

TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_url_rewrite`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `core_url_rewrite`;

Luego en la CLI ...

php shell/indexer.php --reindex catalog_url_product
php shell/indexer.php --reindex catalog_url_category
php shell/indexer.php --reindex url_redirect

Háganos saber sus resultados ... como Marius, todavía no he construido un sitio EE 1.13 y solo tengo la experiencia de jugar con él desde Imagine. :)

davidalger
fuente
1
Hola David, gracias por tu respuesta detallada. Intenté tus instrucciones, pero desafortunadamente no tuve suerte. Se borraron todas las reescrituras, pero ejecutar indexer.php no volvió a generar ninguna. Durante la noche, el soporte de Magento me ha respondido, y su consejo fue que las reescrituras de URL ahora se guardan en: - catalog_product_entity_url_key para productos - catalog_category_entity_url_key para categorías. de nuevo ahora suerte. Les pedí algunas aclaraciones adicionales, así que les haré saber tan pronto como me llamen.
JamesAllwood
Una cosa que noté al mirar esto fue que las reescrituras de URL se almacenan en enterprise_url_rewritevs core_url_rewritecomo estaban antes. Las catalog_*_entity_url_keytablas parecen ser una tabla replicada con las claves de url para uso del indexador, y también son las tablas con los desencadenantes relacionados con las reescrituras de URL.
davidalger
@Francesco, ¿había ejecutado anteriormente ese script después de actualizar desde 1.12? Si no es así, se esperaría que necesite ejecutarlo, y no llamaría a ese error ya que es parte del proceso de actualización documentado que va desde 1.12 a 1.13.
davidalger
@davidalger: tienes razón, el script funciona casi bien (crea algunas URL extrañas pero solo algunas) Sin embargo, la funcionalidad de reescritura de URL es bastante débil en esta versión de EE (por ejemplo, cambiar la clave de URL de un producto y guardarlo, no lo hace) t funciona como se esperaba)
Fra
Esta respuesta debe ser aceptada. Puedo confirmar que esto funciona en EE 1.13.
musicliftsme
4

Una nota sobre el uso de TRUNCATE:

TRUNCATE TABLE `enterprise_url_rewrite`;

da un error debido a referencias de clave externa:

ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`customerx_dev`.`enterprise_catalog_category_rewrite`, CONSTRAINT `FK_415B32DA3DF924D5C803CF24EB3AC1D9` FOREIGN KEY (`url_rewrite_id`) REFERENCES `customerx_dev`.`enterprise_url_rewrite` (`url_rewrite_i)

Ejecutar comandos truncar / eliminar como este funcionaría:

TRUNCATE TABLE `enterprise_url_rewrite_redirect_rewrite`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_redirect`;
TRUNCATE TABLE `enterprise_url_rewrite_product_cl`;
TRUNCATE TABLE `enterprise_url_rewrite_category_cl`;
TRUNCATE TABLE `enterprise_catalog_product_rewrite`;
TRUNCATE TABLE `enterprise_catalog_category_rewrite`;
TRUNCATE TABLE `core_url_rewrite`;
DELETE FROM `enterprise_url_rewrite`;
Sven
fuente
Úselo SET FOREIGN_KEY_CHECKS = 0;antes de TRUNCATE ...y SET FOREIGN_KEY_CHECKS = 1;en la parte inferior, despuésDELETE FROM ...
Oleg
4

La respuesta simple es No, no es seguro truncar estas tablas, al menos si no sabe la consecuencia:

  • Truncar todas las tablas de reescritura y ejecutar las pistas de reindexación a un sitio de trabajo

Sin embargo:

  • Perderá todas las reescrituras personalizadas (eso es normal)
  • Catalog -> Url Redirectestará vacío (en EE 1.13.1) (que parece un error de acuerdo con Magento, este es el comportamiento esperado en 1.13.1) (ver también el comentario a continuación)
Fra
fuente
2
Solo me gustaría agregar que Catalog -> Url Redirectmuestra solo reescrituras que no son del sistema. Entonces, solo tus reescrituras personalizadas se mostrarán aquí. es decir, filas con enterprise_url_rewrite.system = 0.
musicliftsme
Sí, tienes razón, he mejorado la respuesta con la última información que recibí del equipo de soporte de Magento. Siéntase libre de mejorar mi respuesta si lo desea
Fra