Effacer toutes les réécritures d'URL - Entreprise (1.13)

27

Après plusieurs importations foirées, il me reste une charge de réécritures d'URL que je dois supprimer.

J'utilise Enterprise 1.13

Quand j'ai eu ce problème dans la communauté, j'ai simplement tronqué core_url_rewriteet réindexé.

Cependant, dans Enterprise, je remarque qu'il existe un certain nombre de tables différentes qui contrôlent les réécritures.

  • 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

Suis-je sûr de les tronquer tous?

J'anticipe pleinement que quelqu'un me dise que je ne devrais jamais tronquer ces tableaux, donc excuses pour la naïveté à l'avance.

JamesAllwood
la source
Qu'entendez-vous par «un certain nombre de tables différentes qui contrôlent les réécritures»? Sur EE, je fais généralement la même chose que sur CE. Tronquer core_url_rewriteet cela a fonctionné.
Marius
Salut Marius. Ce sont les tableaux qui cherchent à contrôler les réécritures. J'avais tronqué core_url_rewrites, mais cela n'a eu aucun effet sur ceux répertoriés dans 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 Merci
JamesAllwood
Oh pardon. Ma faute. J'ai raté cette ligne "J'utilise Enterprise 1.13". Je n'ai pas (encore) d'expérience avec EE 1.13. Ignorez-moi pour l'instant.
Marius
1
Quelque chose à considérer: gist.github.com/Vinai/5451584
B00MER
1
Nous avons récemment mis à jour Magento EE 1.12 vers EE 1.13 pour l'une de nos boutiques et nous avons écrit un article sur notre site Web sur les changements et les problèmes qui pourraient survenir: code4business.de/update-magento-enterprise-edition-1-13-0-2 /… Le post a une traduction en anglais en bas de la page.
user2830524

Réponses:

30

Nous nous sommes dans la même situation que toi James. Après beaucoup de fouilles, voici ce que j'ai trouvé:

Le core_url_rewritetableau est désormais obsolète, mais Magento EE 1.13 stocke désormais les réécritures dans enterprise_url_rewrite.

Tables: enterprise_*_category_rewriteutilisez des catalog_*_entity_url_keytables pour reconstruire les deux tables de réécriture lorsque vous exécutezphp indexer.php --reindex catalog_url_*

Lorsque vous ajoutez une `` redirection d'URL '' dans le catalogue d'administration -> URL redirige pour une URL personnalisée, elle est ajoutée à la enterprise_url_rewrite_redirecttable et l'indicateur pour Magento que l'index est désormais obsolète est entré dans la enterprise_url_rewrite_redirect_cltable qui lors de l'exécution php indexer.php --reindex url_redirectreconstruit la enterprise_url_rewrite_redirect_rewritetable.

Remarque rapide, toute table se terminant par _cl est sûre à tronquer, le «CL» signifie Change Log et est utilisé par Magento pour vérifier si une réindexation est requise.

En ce qui concerne les tables de clés d'URL, je ne sais toujours pas pourquoi il y a deux entrées de clé d'URL une catalog_*_entity_url_keyet une catalog_*_entity_varchar(attribut id 90), mais je suppose que c'est ce qui se passe:

Lorsque vous créez un nouveau produit / catégorie, Magento utilise le nom pour générer une clé url qui est placée dans catalog_*_entity_url_keyAND dans le catalog_*_entity_varchar, mais la table principale utilisée par Magento est la catalog_*_entity_url_keycar si vous la tronquez et exécutez, php indexer.php --reindex catalog_url_*vos enterprise_*_category_rewritetables seront vides et les produits / catégories dans le frontend affichera des URL moche c'est-à-dire http://example.com/catalog/product/view/id/123/etc/etc(pas SOE amical) Je crois que les deux tables sont liées et sont utilisées pour construire la enterprise_url_rewritetable parce que cette table stocke un 'request_path' très probablement l'url_key à l'intérieur de la catalog_*_entity_varchartable et un 'identifiant' qui est le principal Clé URL du catalog_*_entity_url_keytableau. Je peux me tromper complètement sur les tables url_key et varchar, donc je pense juste à haute voix.

Quoi qu'il en soit, pour tronquer et reconstruire toutes les tables de réécriture, vous pouvez exécuter:

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;

puis exécutez:

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

Si vous tronquez également, enterprise_url_rewrite_redirectvous perdrez toutes vos redirections personnalisées que vous voyez dans votre panneau d'administration, c'est peut-être votre objectif puisque vous vous retrouvez avec une tonne d'URL inutiles. Tant que vous NE tronquerez PAS les tables '* _entity_url_key', tout ira bien.

Notre histoire était un peu différente, car nous avons eu des clés URL en double et des problèmes majeurs avec les noms de produits des importations Excel après la mise à niveau vers 1.13 à partir de 1.11, j'ai donc écrit ce script rapide pour réinitialiser la catalog_product_entity_url_keytable et les clés URL et les chemins URL dans la catalog_product_entity_varchartable en utilisant le produit noms. J'ai joint le code ci-dessous, mais si vous l'utilisez, utilisez-le à vos risques et périls.

<?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.']';

Le code peut être modifié pour utiliser la méthode Magentos formatKey ici: http://www.magentocommerce.com/wiki/3_-_store_setup_and_management/seo/url_key_characters_conversion malheureusement, je suis tombé sur le wiki après avoir mis à jour toutes les clés, donc je n'ai pas pris la peine de mettre à jour tout à nouveau.

J'espère que ça t'as aidé :)!

Oleg
la source
sudo php indexer.php --reindex catalog_url_catalogdevrait être sudo php indexer.php --reindex catalog_url_category.
Matthias Zeis
J'essaie de faire la même chose en ce moment. Après avoir tronqué toutes les tables, seules les URL de catégorie et de produit directes sont réindexées. Je n'ai trouvé aucune entrée pour des produits dans des catégories comme catalog/product/view/id/XXX/category/YYY. Pouvez-vous confirmer que c'est la même chose pour vous? Je suis un peu ignorant à ce sujet ... Est-ce un bug, ou est-ce que je fais quelque chose de mal? J'ai essayé de faire la même chose sur une nouvelle installation de 1.13.0.2, la même chose s'est produite. Réécrit fonctionne bien en frontend, mais aucune catégorie n'est définie.
fmrng
9

Sur la base de ce que j'ai vu déconner avec EE 1.13 dans un environnement de test et de petits tests rapides que je viens de faire, vous devriez être en mesure de tronquer ces tables simplement, puis de reconstruire manuellement tous les index d'URL à partir de la CLI.

Les tables * _cl sont utilisées dans les TRIGGERS trouvés sur la catalog_product_entity_url_keytable. Les enregistrements qu'ils insèrent dans ces tables * _cl sont ce qui, je pense, est utilisé pour indiquer ce qui doit être réindexé après les sauvegardes.

Voici ce que j'ai fait. Après avoir utilisé l'outil CLI pour recréer les index, tout semblait bien fonctionner. Troncature 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`;

Puis sur 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

Faites-nous part de vos résultats… comme Marius, je n'ai pas encore construit de site EE 1.13 et je n'ai que l'expérience de jouer avec lui depuis Imagine. :)

davidalger
la source
1
Salut David, Merci pour votre réponse détaillée. J'ai essayé vos instructions, mais malheureusement pas de chance. Il a effacé toutes les réécritures, mais l'exécution de indexer.php n'en a régénéré aucune. Du jour au lendemain, le support de Magento est revenu vers moi, et leur conseil était que les réécritures d'URL sont désormais enregistrées dans: - catalog_product_entity_url_key pour les produits - catalog_category_entity_url_key pour les catégories que j'ai essayé de supprimer aussi, bien qu'il n'y ait en fait que 2 entrées, mais encore une fois maintenant la chance. Je leur ai demandé des éclaircissements supplémentaires, alors je vous le ferai savoir dès qu'ils me reviendront.
JamesAllwood
Une chose que j'ai remarquée en regardant cela, c'est que les réécritures d'URL sont stockées dans enterprise_url_rewritevs core_url_rewritecomme avant. Les catalog_*_entity_url_keytables semblent être une table répliquée avec les clés url à utiliser par l'indexeur, et ce sont aussi les tables avec les déclencheurs liés aux réécritures d'URL.
davidalger
@Francesco, aviez-vous déjà exécuté ce script après la mise à niveau de 1.12? Sinon, on s'attendrait à ce que vous deviez l'exécuter, et je n'appellerais pas ce buggy car il fait partie du processus de mise à niveau documenté allant de 1.12 à 1.13.
davidalger
@davidalger: vous avez raison, le script fonctionne presque bien (il crée des URL étranges mais seulement quelques-unes) Cependant, la fonctionnalité de réécriture d'URL est assez faible dans cette version EE (par exemple, changer la clé url d'un produit et l'enregistrer, ne fonctionne pas) t fonctionne comme prévu)
Fra
Cette réponse doit être acceptée. Je peux confirmer que cela fonctionne sur EE 1.13.
musicliftsme
4

Une note concernant l'utilisation de TRUNCATE:

TRUNCATE TABLE `enterprise_url_rewrite`;

donne une erreur à cause des références de clés étrangères:

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)

L'exécution de commandes de troncature / suppression comme celle-ci fonctionnerait:

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
la source
À utiliser SET FOREIGN_KEY_CHECKS = 0;avant TRUNCATE ...et SET FOREIGN_KEY_CHECKS = 1;tout en bas, aprèsDELETE FROM ...
Oleg
4

La réponse simple est non, il n'est pas sûr de tronquer ces tableaux, du moins si vous ne connaissez pas la conséquence:

  • Tronquer toutes les tables de réécriture et exécuter des pistes de réindexation sur un site de travail

Toutefois:

  • Vous perdrez toutes les réécritures personnalisées (c'est normal)
  • Catalog -> Url Redirectsera vide (sur EE 1.13.1) (qui ressemble à un bug selon Magento c'est le comportement attendu sur 1.13.1) (voir aussi commentaire ci-dessous)
Fra
la source
2
Je voudrais juste ajouter que Catalog -> Url Redirectseules les réécritures non système sont affichées. Ainsi, seules vos réécritures personnalisées s'afficheront ici. c'est-à-dire des lignes avec enterprise_url_rewrite.system = 0.
musicliftsme
oui vous avez raison, j'ai amélioré la réponse avec les dernières informations que j'ai reçues de l'équipe d'assistance de Magento. N'hésitez pas à améliorer ma réponse si vous le souhaitez
Fra