2

任何人都有针对 Magento 中已删除产品的 301 永久重定向的解决方案?

我有一家商店,有 5000 种产品。4000 件已售出,并且永远不会有库存。我想删除那些产品 b/c 我不再需要它们并想清理/减少我的数据库,但我需要 301 将它们永久重定向到适当的页面以保持我建立的 SEO 汁液。

需要明确的是,我不希望已删除的产品页面继续存在,即使出现缺货消息,我也不希望出现 404 Page Not Founds。

理想情况下,我将能够导出产品 URL 及其最低级别类别页面的 URL,以便我可以通过 .htaccess 文件创建 301 重定向。但是从 Magento 导出只导出类别 ID,而不是类别名称或 URL,那么我如何以编程方式获取这些?或者其他解决方案?

4

4 回答 4

3

我将创建一个利用观察者和 Magento 的 URL 重写管理器的插件。

此插件将观察在产品删除时catalog_controller_product_delete返回array(’product’ ⇒ $product)到观察者$eventvar 的事件 - 这将在删除时创建自动重定向。

您可以使用它来获取有关产品的最新详细信息,包括其 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();
于 2012-05-01T04:00:29.217 回答
1

以下解决方案仅适用于您的产品只有 1 个类别。此代码将在管理产品网格和管理产品视图中删除。

此代码将重定向到产品所在的类别。除非该类别删除后没有产品,否则它将使用产品类别的父类别。这会产生一个问题,因为许多重写仍将链接到没有产品的类别。如果这对您来说不是问题,请使用以下解决方案。

在 ./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>
于 2015-02-11T14:08:55.760 回答
0

使用这个你只能重定向活动类别这个功能保留给所有的答案。希望任何人都可以帮助完成这个。

<?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();
    }

}
于 2017-12-23T11:32:33.647 回答
0

要获取您想要的数据,您可以简单地运行此查询

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。

于 2017-12-21T13:22:28.017 回答