Magento:删除产品,301重定向到相关的现有页面,例如,它的父类别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Magento:删除产品,301重定向到相关的现有页面,例如,它的父类别相关的知识,希望对你有一定的参考价值。
任何人都有针对Magento中已删除产品的301永久重定向的解决方案?
我有一个拥有5000种产品的商店。 4000已经售出,永远不会有库存。我想删除那些产品b / c我不再需要它们并想要清理/减少我的数据库,但我需要301永久地将它们重定向到适当的页面以保持我已经建立的SEO汁液。
为了清楚起见,我不希望已删除的产品页面再次生效,即使没有Out of Stock消息,我也不希望404 Page Not Founds。
理想情况下,我可以导出产品URL及其最低级别类别页面的URL,以便我可以通过.htaccess文件创建301重定向。但是从Magento导出只导出类别ID,而不是类别名称或URL,那么我如何以程序化方式获取这些ID?或其他解决方案?
我会创建一个利用观察者和Magento的URL Rewrite Manager的插件。
这个插件会观察catalog_controller_product_delete
事件,它会在产品删除时将array(’product’ ⇒ $product)
返回给Observer的$event
var - 这会在删除时创建自动重定向。
您可以使用它来获取有关产品的最新详细信息,包括其URL,然后执行以下操作以插入url重写:
Mage::getModel('core/url_rewrite')
->setIsSystem(0)
->setStoreId($storeId)
->setOptions('RP') //301 redirect perm
->setTargetPath($product->getUrlPath() . '.html')
->setRequestPath($newpage->getUrlPath() . '.html')
->save();
以下解决方案仅适用于您的产品只有一个类别的情况。此代码将在管理产品网格和管理产品视图中删除。
此代码将重定向到产品所在的类别。除非该类别在删除后没有产品,否则将使用产品类别的父类别。这会产生问题,因为许多重写仍将链接到没有产品的类别。如果这不是您的问题,请使用以下解决方案。
在./app/code/local/INPUTANAME/RewriteAfterDelete/etc/config.xml中
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<INPUTANAME_RewriteAfterDelete>
<version>0.0.1</version>
</INPUTANAME_RewriteAfterDelete>
</modules>
<global>
<models>
<inputaname_rewriteafterdelete>
<class>INPUTANAME_RewriteAfterDelete_Model</class>
</inputaname_rewriteafterdelete>
</models>
<events>
<catalog_product_delete_after>
<observers>
<inputaname_rewriteafterdelete>
<class>inputaname_rewriteafterdelete/observer</class>
<method>rewriteDelete</method>
<type>singleton</type>
</inputaname_rewriteafterdelete>
</observers>
</catalog_product_delete_after>
</events>
</global>
</config>
在./app/code/local/INPUTANAME/RewriteAfterDelete/Model/Observer.php
<?php
class BeoService_RewriteAfterDelete_Model_Observer
{
public function rewriteDelete(Varien_Event_Observer $observer)
{
$product = $observer->getEvent()->getProduct();
$storeId = Mage::app()->getStore()->getStoreId();
$categoryIds = $product->getCategoryIds();
if(count($categoryIds) ){
$firstCategoryId = $categoryIds[0];
$category = Mage::getModel('catalog/category')->load($firstCategoryId);
if($category->getProductCount()){
$newpage = $category->getUrlPath();
}else{
$newpage = $category->getParentCategory()->getUrlPath();
}
Mage::getModel('core/url_rewrite')
->setIsSystem(0)
->setStoreId($storeId)
->setOptions('RP') //301 redirect perm
->setTargetPath($newpage . '.html')
->setRequestPath($product->getUrlPath() . '.html')
->save();
}
}
}
在./app/etc/modules/INPUTANAME_RewriteAfterDelete.xml中
<?xml version="1.0" encoding="UTF-8"?>
<config>
<modules>
<INPUTANAME_RewriteAfterDelete>
<version>0.0.1</version>
</INPUTANAME_RewriteAfterDelete>
</modules>
<global>
<models>
<inputaname_rewriteafterdelete>
<class>INPUTANAME_RewriteAfterDelete_Model</class>
</inputaname_rewriteafterdelete>
</models>
<events>
<catalog_product_delete_after>
<observers>
<inputaname_rewriteafterdelete>
<class>inputaname_rewriteafterdelete/observer</class>
<method>rewriteDelete</method>
<type>singleton</type>
</inputaname_rewriteafterdelete>
</observers>
</catalog_product_delete_after>
</events>
</global>
</config>
要获取所需的数据,只需运行此查询即可
SELECT prod.request_path, cat.request_path FROM `core_url_rewrite` prod
LEFT JOIN core_url_rewrite cat ON prod.category_id = cat.category_id AND cat.id_path LIKE 'category/%'
WHERE prod.id_path LIKE 'product/%' AND prod.category_id IS NOT NULL
注意添加很多静态重定向到.htaccess会减慢apache。
使用这个你只能重定向活动类别这个功能仍然是所有的答案。希望所以任何人都可以帮助完成这一点。
<?php
class Meet_RewriteAfterDelete_Model_Observer
{
public function rewriteDelete(Varien_Event_Observer $observer)
{
$product = $observer->getEvent()->getProduct();
$storeId = Mage::app()->getStore()->getStoreId();
$categoryIds = $product->getCategoryIds();
if(count($categoryIds) ){
$categoryIds = $this->getActiveCategoryIds($categoryIds);
}
$requestPath = '';
if($product->getUrlPath() != ""){
$requestPath = $product->getUrlPath();
}else{
$requestPath = $product->getUrlKey();
}
if(count($categoryIds) ){
$firstCategoryId = $categoryIds[0];
$category = Mage::getModel('catalog/category')->load($firstCategoryId);
if($category->getProductCount()){
$newpage = $category->getUrlPath();
}else{
$newpage = $category->getParentCategory()->getUrlPath();
}
Mage::getModel('core/url_rewrite')
->setIsSystem(0)
->setStoreId($storeId)
->setOptions('RP')
->setTargetPath($newpage)
->setIdPath(uniqid(delete_))
->setRequestPath($requestPath)
->save();
}else{
Mage::getModel('core/url_rewrite')
->setIsSystem(0)
->setStoreId($storeId)
->setOptions('RP')
->setTargetPath('index.php')
->setIdPath(uniqid(delete_))
->setRequestPath($requestPath)
->save();
}
}
protected function getActiveCategoryIds($catIds){
$catCollection = Mage::getResourceModel('catalog/category_collection')
->addAttributeToSelect('entity_id')
->addAttributeToFilter('entity_id', $catIds)
->addIsActiveFilter();
return $catCollection->getAllIds();
}
}
以上是关于Magento:删除产品,301重定向到相关的现有页面,例如,它的父类别的主要内容,如果未能解决你的问题,请参考以下文章
使用 301 重定向重定向 404 是将现有页面重定向到主页
将“添加到购物车”按钮重定向到 Magento 中的不同自定义页面/在 Magento 的产品页面中添加新按钮