清除所有URL重写-企业版(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

我可以全部截断吗?

我完全希望有人告诉我,我永远不要截断这些表,因此提前为您的幼稚而道歉。


“控制重写的许多不同表”是什么意思?在EE上,我通常做与在CE上相同的事情。截断core_url_rewrite并奏效。
马里斯(Marius)

嗨,马里乌斯。这些是用来控制重写的表。我已经截断了core_url_rewrites,但是对admin中列出的那些无效。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
我们最近将其中一家商店的Magento EE 1.12更新为EE 1.13,并在我们的网站上发布了有关可能出现的更改和问题的文章:code4business.de/update-magento-enterprise-edition-1-13-0-2 /…该帖子底部有英文翻译。
user2830524 2013年

Answers:


30

我们和您詹姆斯的处境相似。经过大量的挖掘,这是我想到的:

core_url_rewrite现在不推荐使用该表,而现在Magento EE 1.13将重写存储在中enterprise_url_rewrite

表:运行时 enterprise_*_category_rewrite使用catalog_*_entity_url_key表重建两个重写表php indexer.php --reindex catalog_url_*

当您在admin Catalog-> URL重定向中为自定义URL添加“ URL重定向”时,它将被添加到enterprise_url_rewrite_redirect表中,并且Magento标记现在已过时的标志被输入到enterprise_url_rewrite_redirect_cl表中,运行时php indexer.php --reindex url_redirectenterprise_url_rewrite_redirect_rewrite表将重建表。

快速说明,任何以_cl结尾的表都可以安全地截断,“ CL”代表更改日志,Magento使用它来检查是否需要重新索引。

至于URL Key表,我仍然不清楚为什么有两个URL Key项一进catalog_*_entity_url_key一出catalog_*_entity_varchar(属性ID 90),但是我认为这是会发生的:

当你创建一个新的产品/类别的Magento使用该名称生成被放置在一个url_key catalog_*_entity_url_key并在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” catalog_*_entity_varchar和“ identifier”,而“ identifier”是主要表catalog_*_entity_url_key表中的URL密钥。我可能对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”表,就可以了。

我们的故事有所不同,因为从1.11升级到1.13后,我们遇到了重复的URL键和excel导入产品名称的主要问题,所以我写了这个快速脚本来使用产品重置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不幸的是,在更新所有密钥之后,我遇到了Wiki,因此不必费心更新一切再次。

希望有帮助:)!


sudo php indexer.php --reindex catalog_url_catalog应该是sudo php indexer.php --reindex catalog_url_category
Matthias Zeis

我现在正尝试做同样的事情。但是,在截断所有表之后,仅对直接类别和产品URL重新编制索引。我找不到类似类别的产品条目catalog/product/view/id/XXX/category/YYY。您能否确认这对您一样?我对此一无所知...是一个错误,还是我做错了什么?我尝试在全新安装的1.13.0.2中执行相同的操作,但发生了相同的事情。重写可以在前端正常运行,但是没有设置类别。
2013年

9

根据我在测试环境中看到的有关EE 1.13的混乱情况以及我刚刚进行的一些简短测试,您应该能够简单地截断这些表,然后从CLI手动重建所有URL索引。

* _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站点,并且从想象起就只有从搞乱它获得的经验。:)


1
大卫,您好:感谢您的详细回复。我尝试了您的指示,但不幸的是没有运气。它确实清除了所有重写,但是运行indexer.php不会重新生成任何重写。一夜之间,Magento的支持实际上又回到了我,他们的建议是URL重写现在保存在:-产品的catalog_product_entity_url_key-产品类别的catalog_category_entity_url_key我也尝试清除这些内容,尽管实际上其中只有2个条目,但是现在再次幸运。我已要求他们提供进一步的说明,因此一旦他们回复我,我会立即通知您。
JamesAllwood

我注意到的一件事是URL重写存储在enterprise_url_rewritevs中,core_url_rewrite就像以前一样。这些catalog_*_entity_url_key表似乎是带有供索引器使用的url键的复制表,并且它们也是具有与URL重写相关的触发器的表。
davidalger

@Francesco,您以前是否从1.12升级后运行过该脚本?如果不是这样,那么就可以预期您需要运行它,而我也不会称其为越野车,因为它是从1.12到1.13的已记录升级过程的一部分。
davidalger 2014年

@davidalger:您是对的,脚本几乎可以正常工作(它会产生一些奇怪的Urls,但很少)。但是,此EE版本中的url重写功能非常薄弱(例如,更改产品的url-key并将其保存,不会。 (按预期工作))
2014年

这个答案应该被接受。我可以在EE 1.13上确认这一工作。
musicliftsme 2014年

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

使用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 2014年

是的,您是对的,我已经从Magento支持团队获得的最新信息改善了答案。如果愿意,请随时改善我的答案
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.