Chúng tôi đang ở trong tình huống tương tự như bạn James. Sau rất nhiều lần đào, đây là điều tôi nghĩ ra:
Các core_url_rewrite
bảng hiện đang bị phản đối, thay vì Magento EE 1,13 giờ lưu được ghi đè trong enterprise_url_rewrite
.
Bảng:
enterprise_*_category_rewrite
sử dụng catalog_*_entity_url_key
bảng để xây dựng lại hai bảng viết lại khi bạn chạyphp indexer.php --reindex catalog_url_*
Khi bạn thêm 'Chuyển hướng URL' trong Danh mục quản trị-> Chuyển hướng URL cho một URL tùy chỉnh, nó sẽ được thêm vào enterprise_url_rewrite_redirect
bảng và cờ cho Magento rằng chỉ mục hiện đã lỗi thời được nhập vào enterprise_url_rewrite_redirect_cl
bảng khi chạy php indexer.php --reindex url_redirect
lại enterprise_url_rewrite_redirect_rewrite
bảng.
Lưu ý nhanh, mọi bảng kết thúc bằng _cl đều an toàn để cắt bớt, 'CL' là viết tắt của Nhật ký thay đổi và được Magento sử dụng để kiểm tra xem có cần lập chỉ mục lại không.
Theo như các bảng Khóa URL, tôi vẫn không hiểu tại sao có hai mục nhập Khóa URL một catalog_*_entity_url_key
và một trong catalog_*_entity_varchar
(id thuộc tính 90), nhưng tôi cho rằng đây là những gì xảy ra:
Khi bạn tạo một sản phẩm / danh mục mới, Magento sử dụng tên để tạo url_key được đặt trong catalog_*_entity_url_key
AND catalog_*_entity_varchar
, nhưng bảng chính được Magento sử dụng là catalog_*_entity_url_key
vì nếu bạn cắt bớt nó và chạy php indexer.php --reindex catalog_url_*
các enterprise_*_category_rewrite
bảng của bạn sẽ trống và các sản phẩm / danh mục trong frontend sẽ hiển thị các url xấu xí, tức là http://example.com/catalog/product/view/id/123/etc/etc
(không thân thiện với SOE) Tôi tin rằng hai bảng có liên quan và được sử dụng để xây dựng enterprise_url_rewrite
bảng vì bảng này lưu trữ một 'request_path' rất có thể là url_key bên trong catalog_*_entity_varchar
bảng và một 'định danh' là chính Khóa URL từ catalog_*_entity_url_key
bảng. Tôi có thể hoàn toàn sai về các bảng url_key và varchar, vì vậy tôi chỉ nghĩ lớn.
Dù sao để cắt ngắn thành công và xây dựng lại tất cả các bảng viết lại, bạn có thể thực hiện:
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;
và sau đó chạy:
sudo php indexer.php --reindex catalog_url_product
sudo php indexer.php --reindex catalog_url_category
sudo php indexer.php --reindex url_redirect
Nếu bạn cũng cắt ngắn enterprise_url_rewrite_redirect
thì bạn sẽ mất tất cả các chuyển hướng tùy chỉnh mà bạn thấy trong bảng quản trị của mình, có lẽ đây là mục tiêu của bạn vì bạn còn lại rất nhiều URL vô dụng. Miễn là bạn KHÔNG cắt bớt các bảng '* _entity_url_key', bạn sẽ ổn.
Câu chuyện của chúng tôi hơi khác một chút, vì chúng tôi đã trùng lặp Khóa URL và các vấn đề lớn với tên sản phẩm từ nhập excel sau khi nâng cấp lên 1.13 từ 1.11 nên tôi đã viết tập lệnh nhanh này để đặt lại catalog_product_entity_url_key
bảng và các khóa URL và đường dẫn URL trong catalog_product_entity_varchar
bảng bằng sản phẩm tên. Tôi đã đính kèm mã dưới đây, nhưng nếu bạn sử dụng nó, bạn có thể tự chịu rủi ro khi sử dụng nó.
<?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.']';
Mã này có thể được điều chỉnh để sử dụng phương thức Magentos formatKey tại đây: http : //www.magentoc Commerce.com/wiki/3_-_store_setup_and_man Quản trị / seo / url mọi thứ một lần nữa.
Mong rằng sẽ giúp :)!
core_url_rewrite
và nó đã làm việc.