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_rewrite
tableau est désormais obsolète, mais Magento EE 1.13 stocke désormais les réécritures dans enterprise_url_rewrite
.
Tables:
enterprise_*_category_rewrite
utilisez des catalog_*_entity_url_key
tables 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_redirect
table et l'indicateur pour Magento que l'index est désormais obsolète est entré dans la enterprise_url_rewrite_redirect_cl
table qui lors de l'exécution php indexer.php --reindex url_redirect
reconstruit la enterprise_url_rewrite_redirect_rewrite
table.
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_key
et 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_key
AND dans le catalog_*_entity_varchar
, mais la table principale utilisée par Magento est la catalog_*_entity_url_key
car si vous la tronquez et exécutez, php indexer.php --reindex catalog_url_*
vos enterprise_*_category_rewrite
tables 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_rewrite
table parce que cette table stocke un 'request_path' très probablement l'url_key à l'intérieur de la catalog_*_entity_varchar
table et un 'identifiant' qui est le principal Clé URL du catalog_*_entity_url_key
tableau. 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_redirect
vous 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_key
table et les clés URL et les chemins URL dans la catalog_product_entity_varchar
table 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é :)!
core_url_rewrite
et cela a fonctionné.