Очистить все перезаписи URL - Enterprise (1.13)

27

После нескольких испорченных импортов у меня осталась куча переписываний URL, которые мне нужно удалить.

Я использую Enterprise 1.13

Когда у меня возникла эта проблема в сообществе, я просто core_url_rewriteобрезал и переиндексировал.

Однако в Enterprise я заметил, что существует ряд различных таблиц, которые управляют перезаписью.

  • 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
источник
Что вы подразумеваете под «множеством разных таблиц, которые управляют перезаписью»? На EE я обычно делал то же самое, что и на CE. Усек core_url_rewriteи все заработало.
Мариус
Привет Мариус. Эти таблицы предназначены для контроля над перезаписью. Я урезал 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. Игнорируйте меня сейчас.
Мариус
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 /… В сообщении внизу страницы есть перевод на английский язык.
user2830524 30.09.13

Ответы:

30

Мы в той же ситуации, что и вы, Джеймс. После долгих копаний вот что я придумал:

Теперь core_url_rewriteтаблица устарела, вместо этого Magento EE 1.13 теперь сохраняет изменения в enterprise_url_rewrite.

Таблицы: enterprise_*_category_rewriteиспользуйте catalog_*_entity_url_keyтаблицы для перестройки двух таблиц перезаписи при запускеphp indexer.php --reindex catalog_url_*

Когда вы добавляете 'URL Redirect' в каталоге администратора-> URL Redirects для пользовательского 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_keyAND в catalog_*_entity_varchar, но основная таблица, используемая Magento, это 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-адресов в 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_catalogдолжно быть sudo php indexer.php --reindex catalog_url_category.
Матиас Цейс
Я пытаюсь сделать то же самое прямо сейчас. После усечения всех таблиц переиндексируются только прямые URL-адреса категорий и продуктов. Я не могу найти записи для продуктов в таких категориях, как catalog/product/view/id/XXX/category/YYY. Можете ли вы подтвердить, что это то же самое для вас? Я немного не понимаю этого ... Это ошибка или я что-то не так делаю? Я попытался сделать то же самое на новой установке 1.13.0.2, произошло то же самое. Перезаписывает все хорошо во внешнем интерфейсе, но никакая категория не установлена.
13.10
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

Дайте нам знать ваши результаты ... как и Мариус, я еще не создал сайт EE 1.13 и имею только опыт возиться с ним со времен Imagine. :)

davidalger
источник
1
Привет Дэвид, спасибо за ваш подробный ответ. Я попробовал ваши инструкции, но, к сожалению, не повезло. Он все очистил, но запуск indexer.php не восстановил ничего. Ночью, поддержка Magento фактически вернулась ко мне, и их совет состоял в том, что перезаписи URL теперь сохраняются в: - catalog_product_entity_url_key для продуктов; опять удача Я попросил у них дальнейших разъяснений, поэтому я дам вам знать, как только они вернутся ко мне.
Джеймс Эллвуд
Одна вещь, которую я заметил, глядя на это, была то, что переписанные URL-адреса хранятся в enterprise_url_rewritevs, core_url_rewriteкак они были раньше. В catalog_*_entity_url_keyтаблицах , как представляется, реплицируются таблица с URL-ключей для использования индексатор, и они также являются таблицы с триггерами , связанных с URL переписывания.
Давиджер
@Francesco, вы ранее запускали этот скрипт после обновления с 1.12? Если нет, то можно ожидать, что вам нужно его запустить, и я бы не назвал эту ошибку, поскольку она является частью документированного процесса обновления с 1.12 до 1.13.
Давидгер
@davidalger: вы правы, скрипт работает почти хорошо (он создает несколько странных URL, но только несколько). Однако в этом выпуске EE функциональность перезаписи URL довольно слабая (например, изменение URL-ключа для продукта и сохранение его, не t работает, как и ожидалось)
Fra
Этот ответ должен быть принят. Я могу подтвердить, что это работает на 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 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`;
Sven
источник
Используйте SET FOREIGN_KEY_CHECKS = 0;до TRUNCATE ...и SET FOREIGN_KEY_CHECKS = 1;в самом низу, послеDELETE FROM ...
Олег
4

Ответ прост: нет, урезать эти таблицы небезопасно, по крайней мере, если вы не знаете последствия:

  • Усечение всех таблиц перезаписи и выполнение переиндексирования приводит к работающему сайту

Тем не мение:

  • Вы потеряете все пользовательские изменения (это нормально)
  • Catalog -> Url Redirectбудет пустым (в EE 1.13.1) (это выглядит как ошибка в соответствии с Magento, это ожидаемое поведение в 1.13.1) (см. также комментарий ниже)
От
источник
2
Я просто хотел бы добавить, что Catalog -> Url Redirectпоказывает только несистемные переписывает. Таким образом, здесь будут показаны только ваши пользовательские изменения. то есть строки с enterprise_url_rewrite.system = 0.
musicliftsme
да, вы правы, я улучшил ответ с помощью последней информации, полученной от службы поддержки Magento. Не стесняйтесь улучшать мой ответ, если хотите
Fra