Xóa tất cả các phần thưởng URL - Doanh nghiệp (1.13)


27

Sau nhiều lần nhập sai, tôi đã bị bỏ lại một tải lại URL mà tôi cần phải xóa.

Tôi đang điều hành Enterprise 1.13

Khi tôi gặp vấn đề này trong cộng đồng, tôi chỉ đơn giản là bị cắt cụt core_url_rewritevà được giới thiệu lại.

Tuy nhiên, trong Enterprise, tôi nhận thấy rằng có một số bảng khác nhau kiểm soát việc viết lại.

  • 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

Tôi có an toàn để cắt tất cả chúng không?

Tôi hoàn toàn dự đoán để ai đó nói với tôi rằng tôi không bao giờ nên cắt bớt các bảng này, vì vậy xin lỗi vì sự ngây thơ trước.


Ý bạn là gì khi 'một số bảng khác nhau kiểm soát việc viết lại'? Trên EE tôi thường làm điều tương tự như trên CE. Cắt ngắn core_url_rewritevà nó đã làm việc.
Marius

Chào Marius. Đây là các bảng tìm cách kiểm soát viết lại. Tôi đã cắt bớt core_url_rewrites, nhưng nó không có tác dụng với những người được liệt kê trong quản trị viên. 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 Cảm ơn
JamesAllwood

Ồ xin lỗi. Lỗi của tôi. Tôi đã bỏ lỡ dòng này "Tôi đang chạy Enterprise 1.13". Tôi chưa có kinh nghiệm (chưa) với EE 1.13. Mặc kệ tôi bây giờ.
Marius

1
Một cái gì đó để xem xét: gist.github.com/Vinai/5451584
B00mer

1
Gần đây chúng tôi đã cập nhật Magento EE 1.12 lên EE 1.13 cho một trong các cửa hàng của chúng tôi và chúng tôi đã viết một bài đăng trên trang web của chúng tôi về những thay đổi và vấn đề có thể xảy ra: code4business.de/update-magento-enterprise-edition-1-13-0-2 / Bài viết có một bản dịch tiếng Anh ở dưới cùng của trang.
dùng2830524

Câu trả lời:


30

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_rewritebả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_rewritesử dụng catalog_*_entity_url_keybả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_redirectbả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_clbảng khi chạy php indexer.php --reindex url_redirectlại enterprise_url_rewrite_redirect_rewritebả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_keyvà 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_keyAND catalog_*_entity_varchar, nhưng bảng chính được Magento sử dụng là catalog_*_entity_url_keyvì nếu bạn cắt bớt nó và chạy php indexer.php --reindex catalog_url_*các enterprise_*_category_rewritebả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_rewritebả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_varcharbảng và một 'định danh' là chính Khóa URL từ catalog_*_entity_url_keybả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_redirectthì 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_keybảng và các khóa URL và đường dẫn URL trong catalog_product_entity_varcharbả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 :)!


sudo php indexer.php --reindex catalog_url_catalognên sudo php indexer.php --reindex catalog_url_category.
Matthias Zeis

Tôi đang cố gắng làm điều tương tự ngay bây giờ. Sau khi cắt tất cả các bảng, chỉ có URL danh mục và sản phẩm trực tiếp được giới thiệu lại. Tôi không thể tìm thấy bất kỳ mục nào cho các sản phẩm trong danh mục như catalog/product/view/id/XXX/category/YYY. Bạn có thể vui lòng xác nhận rằng điều này là giống nhau cho bạn? Tôi không biết gì về điều này ... Đây có phải là một lỗi hay tôi đang làm gì đó sai? Tôi đã cố gắng làm tương tự trên bản cài đặt mới 1.13.0.2, điều tương tự đã xảy ra. Viết lại hoạt động tất cả ngay trong frontend, nhưng không có thể loại nào được thiết lập.
fmrng

9

Dựa trên những gì tôi đã thấy lộn xộn với EE 1.13 trong môi trường thử nghiệm và một thử nghiệm nhỏ mà tôi vừa thực hiện, bạn sẽ có thể cắt ngắn các bảng đó và sau đó xây dựng lại tất cả các chỉ mục URL từ CLI.

Các bảng * _cl được sử dụng trong TRIGGERS được tìm thấy trên catalog_product_entity_url_keybảng. Các bản ghi họ chèn vào các bảng * _cl này là những gì, tôi nghĩ, được sử dụng để chỉ ra những gì cần được lập chỉ mục lại sau khi lưu.

Đây là những gì tôi đã làm. Sau khi sử dụng công cụ CLI để xây dựng lại các chỉ mục, mọi thứ dường như đều ổn. MySql cắt ngắn

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

Sau đó, trên CLI

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

Hãy cho chúng tôi biết kết quả của bạn như Marius, tôi chưa xây dựng trang web EE 1.13 và chỉ có kinh nghiệm từ việc làm hỏng nó kể từ khi tưởng tượng. :)


1
Xin chào David, Cảm ơn bạn đã phản hồi chi tiết. Tôi đã thử hướng dẫn của bạn, nhưng không may mắn. Nó đã xóa tất cả các bản ghi lại, nhưng chạy indexer.php không tạo lại bất kỳ. Qua một đêm, bộ phận hỗ trợ Magento đã thực sự quay trở lại với tôi và lời khuyên của họ là các bản ghi lại URL hiện được lưu trong: - catalog_product_entity_url_key cho các sản phẩm - catalog_carget_entity_url_key cho các danh mục tôi đã thử xóa chúng, mặc dù thực tế chỉ có 2 mục trong đó, lại may mắn bây giờ. Tôi đã hỏi họ để làm rõ thêm, vì vậy tôi sẽ cho bạn biết ngay khi họ quay lại với tôi.
James ALLwood

Một điều tôi nhận thấy khi nhìn vào điều này là các URL viết lại được lưu trữ enterprise_url_rewriteso với core_url_rewritetrước đây. Các catalog_*_entity_url_keybảng dường như là một bảng được sao chép với các phím url để người lập chỉ mục sử dụng và chúng cũng là các bảng có các kích hoạt liên quan đến việc viết lại URL.
davidalger

@Francesco, trước đây bạn có chạy tập lệnh đó sau khi nâng cấp từ 1.12 không? Nếu không, thì bạn cần phải chạy nó và tôi sẽ không gọi lỗi đó vì đó là một phần của quá trình nâng cấp tài liệu đi từ 1.12 đến 1.13.
davidalger

@davidalger: bạn nói đúng kịch bản hoạt động gần như tốt t làm việc như mong đợi)
Fra

Câu trả lời này nên được chấp nhận. Tôi có thể xác nhận điều này hoạt động trên EE 1.13.
nhạcliftsme

4

Một lưu ý liên quan đến việc sử dụng TRUNCATE:

TRUNCATE TABLE `enterprise_url_rewrite`;

đưa ra lỗi vì tham chiếu khóa ngoài:

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)

Chạy các lệnh cắt / xóa như thế này sẽ hoạt động:

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

Sử dụng SET FOREIGN_KEY_CHECKS = 0;trước TRUNCATE ...SET FOREIGN_KEY_CHECKS = 1;dưới cùng của bạn, sauDELETE FROM ...
Oleg

4

Câu trả lời đơn giản là Không an toàn khi cắt các bảng này, ít nhất là nếu bạn không biết hậu quả:

  • Cắt ngắn tất cả các bảng viết lại và chạy chỉ mục lại dẫn đến một trang web làm việc

Tuy nhiên:

  • Bạn sẽ mất tất cả các viết lại tùy chỉnh (đó là bình thường)
  • Catalog -> Url Redirectsẽ trống (trên EE 1.13.1) (có vẻ như là một lỗi theo Magento, đây là hành vi dự kiến ​​trên 1.13.1) (xem thêm bên dưới bình luận)

2
Tôi chỉ muốn thêm rằng Catalog -> Url Redirectchỉ hiển thị các phần không viết lại hệ thống. Vì vậy, chỉ viết lại tùy chỉnh của bạn sẽ hiển thị ở đây. tức là hàng với enterprise_url_rewrite.system = 0.
nhạcliftsme

vâng bạn đúng, tôi đã cải thiện câu trả lời với thông tin cuối cùng tôi nhận được từ Nhóm hỗ trợ Magento. Vui lòng cải thiện câu trả lời của tôi nếu bạn muốn
Fra
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.