防止在产品URL中创建包含类别URL密钥的自动URL重写

时间:2015-04-07 22:05:20

标签: magento url-rewriting

每当我创建新产品时,Magento会自动创建包含每个类别和子类别组合的不必要的URL重写,这些重写使用产品路径中的类别URL键。例如,对于具有以下类别的产品product-name

category category > subcategory category > subcategory > third

... Magento将使用以下请求路径自动创建URL重写:

/category/product-name /category/subcategory/product-name /category/subcategory/third/product-name

...以及使用请求路径创建正在使用的URL重写:

/product-name

我的问题是,即使我将设置Use Categories Path for Product URLs设置为No

System > Configuration > Catalog > Search Engine Optimizations

...如何停止自动创建这些额外的网址重写?

现在,再次,我意识到网站没有链接到网站上任何地方的这些额外路径,但如果由于某种原因搜索引擎被选中:

http://example.com/category/subcategory/third/product-name

......这会加载!我很紧张,这会导致重复的内容被搜索引擎索引。由于Use Categories Path for Product URLs设置设置为No,因此网站上产品的所有链接都指向:

http://example.com/product-name

...我想阻止Magento自动创建这些不必要的URL重写。

作为参考,我尝试将core_url_rewrite表截断为零(基本上将其清空)并​​在System > Index Management中重新编制目录URL重写索引。这仍然导致Magento自动创建这些不必要的URL重写。

另外,作为参考,我使用的是Magento Community 1.9.1。

请指教!非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我建议而不是尝试禁用此内置功能,而不是turn on canonical links。如果你有没有此选项的旧版Magento,there are other ways to implement it

但是,如果有人仍然倾向于删除它,他们可能会创建一个扩展Mage_Catalog_Model_Url以执行以下操作:

class My_Catalog_Model_Url extends Mage_Catalog_Model_Url
{
     public function refreshProductRewrite($productId, $storeId = null)
     {
         if (is_null($storeId)) {
             foreach ($this->getStores() as $store) {
                 $this->refreshProductRewrite($productId, $store->getId());
             }
             return $this;
         }

         $product = $this->getResource()->getProduct($productId, $storeId);
         if ($product) {
             $store = $this->getStores($storeId);
             $storeRootCategoryId = $store->getRootCategoryId();

             // List of categories the product is assigned to, filtered by being within the store's categories root
             // CUSTOMIZATION: Ignore product categories if the 'catalog/seo/product_use_categories' config setting is false.
             if (Mage::getStoreConfigFlag('catalog/seo/product_use_categories', $storeId)) {
                 $categories = $this->getResource()->getCategories($product->getCategoryIds(), $storeId);
             } else {
                 $categories = array();
             }
             $this->_rewrites = $this->getResource()->prepareRewrites($storeId, '', $productId);

             // Add rewrites for all needed categories
             // If product is assigned to any of store's categories -
             // we also should use store root category to create root product url rewrite
             if (!isset($categories[$storeRootCategoryId])) {
                 $categories[$storeRootCategoryId] = $this->getResource()->getCategory($storeRootCategoryId, $storeId);
             }

             // Create product url rewrites
             foreach ($categories as $category) {
                 $this->_refreshProductRewrite($product, $category);
             }

             // Remove all other product rewrites created earlier for this store - they're invalid now
             $excludeCategoryIds = array_keys($categories);
             $this->getResource()->clearProductRewrites($productId, $storeId, $excludeCategoryIds);

             unset($categories);
             unset($product);
         } else {
             // Product doesn't belong to this store - clear all its url rewrites including root one
             $this->getResource()->clearProductRewrites($productId, $storeId, array());
         }

         return $this;
     }
}

答案 1 :(得分:0)

问题不仅仅与规范链接有关,另一个主要问题是:抓取预算。您不想浪费您的抓取预算,因此不需要使用不必要的网址。

您应该使用以下shell脚本修改core_url_rewrite中的每个条目:

  • is_system = 1
  • product_id不为空
  • category_id不为空

您已设置:

  • target_path =直接产品网址
  • 选项= RP

现在您创建了301重定向到真实页面,只剩下一个问题:

如果产品没有category-product-urls,那么通过后端配置设置关闭该功能将不会创建其他url,这就是我们想要的。 但是,如果产品还具有category-product-url,并且您将该产品添加到类别中,仍然会创建新的category-product-url。因此,您需要通过重写/扩展Mage_Catalog_Model_Url来更改一种方法:

 /**
     * Refresh product rewrite
     *
     * @param Varien_Object $product
     * @param Varien_Object $category
     * @return Mage_Catalog_Model_Url
     */
    protected function _refreshProductRewrite(Varien_Object $product, Varien_Object $category)
    {
        //FIX: DONT ADD CATEGORY-PRODUCT-URL - MIGHT HAPPEN IF CATEGORY-PRODUCT-URL EXIST YET FOR THIS PRODUCT
        if (Mage::getStoreConfigFlag('catalog/seo/product_use_categories')) {
            if ($category->getId() && $product->getId()) {
                return $this;
            }
        }

        parent::_refreshProductRewrite($product, $category);
    }