พวกเราอยู่ในสถานการณ์ที่คล้ายกันกับคุณเจมส์ หลังจากขุดมาเยอะมากนี่คือสิ่งที่ฉันคิดขึ้นมา:
core_url_rewrite
ตารางจะเลิกตอนนี้แทนที่จะวีโอไอพี EE 1.13 enterprise_url_rewrite
ตอนนี้เก็บเขียนใหม่ใน
ตาราง:
enterprise_*_category_rewrite
ใช้catalog_*_entity_url_key
ตารางเพื่อสร้างตารางการเขียนซ้ำสองตารางใหม่เมื่อคุณเรียกใช้php indexer.php --reindex catalog_url_*
เมื่อคุณเพิ่ม 'URL เปลี่ยนเส้นทางในการดูแลระบบ Catalog-> URL เปลี่ยนเส้นทาง URL ที่กำหนดเองได้รับการเพิ่มเข้าไปในenterprise_url_rewrite_redirect
ตารางและธงสำหรับวีโอไอพีที่ดัชนีจะล้าสมัยในขณะนี้จะเข้าสู่enterprise_url_rewrite_redirect_cl
ตารางซึ่งเมื่อทำงานphp indexer.php --reindex url_redirect
จะสร้างenterprise_url_rewrite_redirect_rewrite
ตาราง
บันทึกย่อด่วนตารางใด ๆ ที่ลงท้ายด้วย _cl ปลอดภัยที่จะตัดทอน 'CL' ย่อมาจาก Change Log และใช้โดย Magento เพื่อตรวจสอบว่าจำเป็นต้องมีการทำดัชนีใหม่หรือไม่
เท่าที่ตาราง URL ที่สำคัญไปฉันยังคง clueless นิดว่าทำไมมีรายการหนึ่งในสอง URL ที่สำคัญcatalog_*_entity_url_key
และเป็นหนึ่งในcatalog_*_entity_varchar
(แอตทริบิวต์ ID 90) แต่ผมถือว่านี่คือสิ่งที่เกิดขึ้น:
เมื่อคุณสร้างผลิตภัณฑ์ / หมวดหมู่ใหม่วีโอไอพีใช้ชื่อเพื่อสร้าง url_key ซึ่งอยู่ในcatalog_*_entity_url_key
AND ในcatalog_*_entity_varchar
แต่ตารางหลักที่ใช้โดยวีโอไอพีนั้นเป็นcatalog_*_entity_url_key
เพราะหากคุณตัดทอนและเรียกใช้ตารางphp indexer.php --reindex catalog_url_*
ของคุณenterprise_*_category_rewrite
จะว่างเปล่าและผลิตภัณฑ์ / หมวดหมู่ใน ส่วนหน้าจะแสดง 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
และใช้งานได้