任何人都可以阐明 Magento 如何确定是否为产品创建新的 URL 重写?每次我运行 Catalog URL Rewrite reindex 过程时,core_url_rewrite 中的行数都会增加大约 10,000 行。由于同时没有修改产品数据,为什么会生成一个新的 URL?
4 回答
这个问题在 Magento 1.7 中仍然存在,但我不知道 1.8 或 1.9。Magento 似乎不会删除旧条目。这会严重降低您的数据库速度。解决这个问题的最简单方法是截断表并重新索引它。
- 登录到 mysql 并选择(使用)正确的数据库
- 执行以下查询:
truncate table core_url_rewrite;
- 转到您的 magento 根目录(命令行)中的 shell 文件夹并执行以下命令:
php -f indexer.php -- -reindex catalog_url
- 或者,您可以在管理员中执行此操作:系统 > 索引管理;重新索引目录 URL 重写
然后在 admin 中检查:Catalog > URL Rewrite Management,并查看是否已创建新条目。如果这显示没有项目,则 URL 重写将不起作用!
您可以运行以下 SQL 来找出哪些 URL 属于不存在的产品:
SELECT `cur`.`product_id`
FROM `core_url_rewrite` AS `cur`
LEFT OUTER JOIN `catalog_product_entity` AS `cpe`
ON `cur`.`product_id` = `cpe`.`entity_id`
WHERE `cpe`.`entity_id` IS NULL
AND `cur`.`product_id` IS NOT NULL
...你应该看到一个不存在的 entity_ids 列表
`catalog_product_entity`
EcomDev 有一个免费的 URL 重写模块 ( http://shop.ecomdev.org/url-rewrite-indexer.html ),我发现它很有用。
编辑
为了回答这个问题,会生成新的 URL,因为当 URL 重新索引被触发时:
Mage_Catalog_Model_Indexer_Url::reindexAll()
...这是一个包装:
Mage_Catalog_Model_Url::refreshRewrites
...如果数据已更改,则不进行检查。如果这是您需要的,您可以覆盖该类并重新编写功能以比较差异。
我正在使用 Magento 1.8,我的 core_url_rewrite 表有大约 5 百万!!!!记录。最后,我覆盖了 Mage_Catalog_Model_Product_Attribute_Backend_Urlkey 中的 beforeSave 函数,并从产品名称的前五个单词中生成了我自己的 url 键。如果前 5 个单词不是唯一的,我会附加一些数字。如果有人对我的代码感兴趣,我可以发布一些片段。
在覆盖 Mage_Catalog_Model_Product_Attribute_Backend_Urlkey 后,我截断了 core_url_rewrite 并重建了索引。最后我得到了大约 60.000 个 URL...并且重新索引过程不会添加新的。
但是您必须记住,在截断和重建 core_url_rewrite 表时,自定义 url 重写会丢失。也许您的 seo 主管遇到了一些意想不到的问题。导致所有 302er 重定向都丢失了
干杯
此问题是由于 Magento 企业版和社区版的早期版本中产品和类别索引系统中的一个已知错误造成的。
可以在Magento core_url_rewrite table too large 中找到对根本原因分析的完整解释以及为 Category 和 Product URLs 提供的研究和解决方案的额外确认