Ми в подібній ситуації, як ти, Джеймс. Після багатого копання ось що я придумав:
core_url_rewrite
Таблиця тепер засуджується, а Magento EE 1,13 тепер зберігає в переписує в enterprise_url_rewrite
.
Таблиці:
enterprise_*_category_rewrite
використовуйте catalog_*_entity_url_key
таблиці для відновлення двох таблиць перезапису при запускуphp indexer.php --reindex catalog_url_*
Коли ви додаєте "Перенаправлення URL-адрес" в адміністраторі Каталог-> Перенаправлення URL-адрес для користувацької URL-адреси, він додається до enterprise_url_rewrite_redirect
таблиці, а прапор Magento, що індекс зараз застарів, вводиться в enterprise_url_rewrite_redirect_cl
таблицю, яка під час запуску php indexer.php --reindex url_redirect
відновлює enterprise_url_rewrite_redirect_rewrite
таблицю.
Швидке зауваження: будь-яку таблицю, що закінчується на _cl, можна безпечно скоротити, "CL" означає "Журнал змін" і Magento використовується для перевірки, чи потрібна повторна індексація.
Що стосується таблиць з ключовими адресами URL, я все ще трохи зрозумілий, чому існують дві записи "Ключ URL", одна - catalog_*_entity_url_key
і одна - catalog_*_entity_varchar
(атрибут id 90), але я припускаю, що це відбувається:
Коли ви створюєте новий продукт / категорію, Magento використовує ім'я для створення url_key, який розміщується в catalog_*_entity_url_key
AND у catalog_*_entity_varchar
, але основна таблиця, яку використовує Magento, це catalog_*_entity_url_key
тому, що якщо ви врізаєте її та запустите php indexer.php --reindex catalog_url_*
ваші enterprise_*_category_rewrite
таблиці, вони будуть порожніми, а товари / категорії в frontend відображатиме некрасиві URL-адреси, тобто http://example.com/catalog/product/view/id/123/etc/etc
(не сприятливо до SOE). Я вважаю, що дві таблиці пов'язані та використовуються для створення enterprise_url_rewrite
таблиці, оскільки ця таблиця зберігає "request_path", швидше за все, url_key всередині catalog_*_entity_varchar
таблиці та "ідентифікатор", який є основним URL-ключ із catalog_*_entity_url_key
таблиці. Я можу бути абсолютно невірним щодо таблиць url_key та varchar, тому я просто роздумую вголос.
У будь-якому випадку для успішного обрізання та відновлення всіх таблиць перезапису, які ви можете виконати:
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;
а потім запустіть:
sudo php indexer.php --reindex catalog_url_product
sudo php indexer.php --reindex catalog_url_category
sudo php indexer.php --reindex url_redirect
Якщо ви також урізаєте, enterprise_url_rewrite_redirect
ви втратите всі свої власні переадресації, які ви бачите на панелі адміністратора, можливо, це ваша мета, оскільки вам залишилось безліч марних URL-адрес. Поки ви НЕ обрізаєте таблиці '* _entity_url_key', у вас все буде добре.
Наша історія була дещо іншою, тому що у нас були повторювані ключі URL-адрес і основні проблеми з іменами продуктів від імпорту excel після оновлення до 1,13 з 1,11, тому я написав цей швидкий сценарій, щоб скинути catalog_product_entity_url_key
таблицю та URL-адреси та URL-адреси в catalog_product_entity_varchar
таблиці за допомогою продукту імена. Я додав код нижче, але якщо ви його використовуєте, використовуйте його на свій страх і ризик.
<?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.']';
Код можна змінити, щоб використовувати метод Magentos formatKey тут: http://www.magentocommerce.com/wiki/3_-_store_setup_and_management/seo/url_key_characters_conversion, на жаль, я натрапив на вікі після оновлення всіх клавіш, тому я не турбувався повторним оновленням все знову.
Сподіваюся, що це допомагає :)!
core_url_rewrite
і це спрацювало.