ล้างการเขียนซ้ำ URL ทั้งหมด - องค์กร (1.13)


27

หลังจากที่มีการนำเข้าเกิดความสับสนหลายครั้งฉันก็ถูกทิ้งให้โหลด URL ใหม่ที่ฉันต้องลบ

ฉันใช้ Enterprise 1.13

เมื่อฉันมีปัญหานี้ในชุมชนฉันเพิ่งตัดทอนcore_url_rewriteและทำดัชนีใหม่

อย่างไรก็ตามในองค์กรฉันสังเกตเห็นว่ามีตารางจำนวนมากที่ควบคุมการเขียนซ้ำ

  • 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

ฉันปลอดภัยที่จะตัดทอนทั้งหมดของพวกเขาหรือไม่

ฉันคาดหวังอย่างเต็มที่สำหรับใครบางคนที่จะบอกฉันว่าฉันไม่ควรตัดทอนตารางเหล่านี้ดังนั้นขอโทษสำหรับความไร้เดียงสาล่วงหน้า


คุณหมายถึงอะไรโดย 'ตารางที่แตกต่างกันจำนวนหนึ่งที่ควบคุมการเขียนใหม่'? ใน EE ฉันมักจะทำสิ่งเดียวกันกับ CE ตัดทอนcore_url_rewriteและใช้งานได้
Marius

สวัสดี Marius เหล่านี้เป็นตารางที่มีลักษณะการควบคุมการเขียนซ้ำ ฉันตัดทอน core_url_rewrites แล้ว แต่ไม่ส่งผลกระทบใด ๆ กับรายการที่อยู่ในผู้ดูแลระบบ 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 ขอบคุณ
JamesAllwood

โอ้ขอโทษ. ความผิดฉันเอง. ฉันพลาดสายนี้ "ฉันกำลังใช้งาน Enterprise 1.13" ฉันไม่มีประสบการณ์ (ยัง) กับ EE 1.13 ไม่สนใจฉันตอนนี้
Marius

1
สิ่งที่ต้องพิจารณา: gist.github.com/Vinai/5451584
B00MER

1
เราเพิ่งปรับปรุง Magento EE 1.12 เป็น EE 1.13 สำหรับหนึ่งในร้านค้าของเราและเราโพสต์โพสต์บนเว็บไซต์ของเราเกี่ยวกับการเปลี่ยนแปลงและปัญหาที่อาจเกิดขึ้น: code4business.de/update-magento-enterprise-edition-1-13-0-2 / …โพสต์มีคำแปลภาษาอังกฤษที่ด้านล่างของหน้า
2830524

คำตอบ:


30

พวกเราอยู่ในสถานการณ์ที่คล้ายกันกับคุณเจมส์ หลังจากขุดมาเยอะมากนี่คือสิ่งที่ฉันคิดขึ้นมา:

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_keyAND ใน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โชคไม่ดีที่ฉันมายุ่งเกี่ยวกับการอัพเดตใหม่ทั้งหมด ทุกอย่างอีกครั้ง

หวังว่าจะช่วย :)!


sudo php indexer.php --reindex catalog_url_catalogsudo php indexer.php --reindex catalog_url_categoryควรจะเป็น
Matthias Zeis

ตอนนี้ฉันกำลังพยายามทำสิ่งเดียวกัน หลังจากตัดทอนตารางทั้งหมดแล้วจะมีการทำดัชนีหมวดหมู่โดยตรงและ URL ของผลิตภัณฑ์อีกครั้ง ฉันไม่พบรายการสินค้าประเภทcatalog/product/view/id/XXX/category/YYYใด ๆ คุณช่วยยืนยันได้ไหมว่านี่เป็นสิ่งเดียวกันสำหรับคุณ ฉันรู้สึกไม่ดีเกี่ยวกับเรื่องนี้ ... มันเป็นข้อผิดพลาดหรือฉันกำลังทำอะไรผิดหรือเปล่า? ฉันพยายามทำแบบเดียวกันในการติดตั้งใหม่ที่ 1.13.0.2 สิ่งเดียวกันก็เกิดขึ้น เขียนซ้ำทำงานได้อย่างถูกต้องในส่วนหน้า แต่ไม่มีการตั้งหมวดหมู่
fmrng

9

จากสิ่งที่ฉันเห็นว่ายุ่งกับ EE 1.13 ในสภาพแวดล้อมการทดสอบและการทดสอบเล็ก ๆ น้อย ๆ ที่ฉันเพิ่งทำคุณควรจะสามารถตัดทอนตารางเหล่านั้นอย่างง่าย ๆ แล้วสร้างดัชนี URL ทั้งหมดจาก CLI ด้วยตนเอง

ตาราง * _cl ถูกใช้ใน TRIGGERS ที่พบในcatalog_product_entity_url_keyตาราง ระเบียนที่พวกเขาแทรกลงในตาราง * _cl เหล่านี้คือสิ่งที่ฉันคิดว่าใช้เพื่อระบุสิ่งที่ต้องทำดัชนีใหม่หลังจากบันทึก

นี่คือสิ่งที่ฉันทำ หลังจากใช้เครื่องมือ CLI เพื่อสร้างดัชนีใหม่ทุกสิ่งดูเหมือนจะดี การตัดทอน 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`;

จากนั้นใน CLI ...

php shell/indexer.php --reindex catalog_url_product
php shell/indexer.php --reindex catalog_url_category
php shell/indexer.php --reindex url_redirect

แจ้งให้เราทราบถึงผลลัพธ์ของคุณ…เช่น Marius ฉันยังไม่ได้สร้างเว็บไซต์ EE 1.13 และมีเพียงประสบการณ์จากการยุ่งกับมันตั้งแต่ Imagine :)


1
สวัสดีเดวิดขอบคุณสำหรับการตอบรับอย่างละเอียด ฉันลองทำตามคำแนะนำของคุณ แต่โชคไม่ดี มันล้างการแก้ไขทั้งหมด แต่การรัน indexer.php ไม่ได้สร้างใหม่ ค้างคืนการสนับสนุนวีโอไอพีได้กลับมาหาฉันจริง ๆ และคำแนะนำของพวกเขาคือตอนนี้การเขียน URL ใหม่จะถูกบันทึกใน: - catalog_product_entity_url_key สำหรับผลิตภัณฑ์ - catalog_category_entity_url_key สำหรับหมวดหมู่ที่ฉันพยายามล้างสิ่งเหล่านี้ด้วยซ้ำ ตอนนี้โชคดีอีกครั้ง ฉันขอให้พวกเขาชี้แจงเพิ่มเติมดังนั้นฉันจะแจ้งให้คุณทราบทันทีที่พวกเขากลับมาหาฉัน
JamesAllwood

สิ่งหนึ่งที่ผมสังเกตเห็นเมื่อมองไปที่นี้คือการที่ปรับเปลี่ยน URL ที่ถูกเก็บไว้ในenterprise_url_rewriteเทียบcore_url_rewriteกับพวกเขาก่อน catalog_*_entity_url_keyตารางดูเหมือนจะเป็นตารางการจำลองแบบด้วย URL คีย์สำหรับใช้งานโดยทำดัชนีและพวกเขายังมีตารางกับทริกเกอร์ที่เกี่ยวข้องกับการปรับเปลี่ยนของ URL
davidalger

@Francesco คุณเคยเรียกใช้สคริปต์นั้นหลังจากอัปเกรดจาก 1.12 หรือไม่ ถ้าไม่เช่นนั้นก็คาดว่าคุณจะต้องเรียกใช้และฉันจะไม่เรียก buggy นั้นเพราะมันเป็นส่วนหนึ่งของกระบวนการอัพเกรดที่ทำเป็นเอกสารตั้งแต่ 1.12 ถึง 1.13
davidalger

@davidalger: คุณพูดถูกสคริปต์ทำงานได้ค่อนข้างดี (มันสร้าง URL แปลก ๆ แต่มีเพียงไม่กี่) อย่างไรก็ตามการทำงานของ url rewrite นั้นค่อนข้างอ่อนแอในรุ่น EE นี้ (เช่นการเปลี่ยน url-key สำหรับผลิตภัณฑ์และบันทึกไม่ได้ ' เสื้อทำงานตามที่คาดไว้)
รา

คำตอบนี้ควรได้รับการยอมรับ ฉันสามารถยืนยันการใช้งานได้กับ EE 1.13
musicliftsme

4

หมายเหตุเกี่ยวกับการใช้ TRUNCATE:

TRUNCATE TABLE `enterprise_url_rewrite`;

ให้ข้อผิดพลาดเนื่องจากการอ้างอิงคีย์ต่างประเทศ:

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)

การรันคำสั่ง truncate / delete เช่นนี้จะทำงาน:

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`;

ใช้SET FOREIGN_KEY_CHECKS = 0;ก่อนTRUNCATE ...และSET FOREIGN_KEY_CHECKS = 1;ด้านล่างสุดหลังDELETE FROM ...
Oleg

4

คำตอบง่ายๆคือไม่ไม่ปลอดภัยที่จะตัดทอนตารางเหล่านี้อย่างน้อยถ้าคุณไม่รู้ผลลัพธ์:

  • ตัดทอนตารางการเขียนซ้ำทั้งหมดและเรียกใช้การจัดทำดัชนีใหม่นำไปสู่ไซต์ที่ใช้งานได้

อย่างไรก็ตาม:

  • คุณจะหลวมงานเขียนที่กำหนดเองทั้งหมด (นั่นเป็นเรื่องปกติ)
  • Catalog -> Url Redirectจะว่างเปล่า (ใน EE 1.13.1) (ดูเหมือนว่าข้อผิดพลาด ตาม Magento นี้เป็นพฤติกรรมที่คาดหวังใน 1.13.1) (ดูด้านล่างความคิดเห็น)

2
ฉันแค่อยากจะเพิ่มที่Catalog -> Url Redirectแสดงเฉพาะการเขียนที่ไม่ใช่ระบบ ดังนั้นเฉพาะการเขียนใหม่ที่คุณกำหนดเองเท่านั้นที่จะแสดงที่นี่ enterprise_url_rewrite.system = 0แถวคือมี
musicliftsme

ใช่คุณพูดถูกฉันได้ปรับปรุงคำตอบด้วยข้อมูลล่าสุดที่ฉันได้รับจากทีมสนับสนุนของ Magento อย่าลังเลที่จะปรับปรุงคำตอบของฉันหากคุณต้องการ
Fra
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.