Magento sitemap.xml生成から特定の製品を除外する


14

Magentoで生成されたファイルに少数の製品が含まれていないことを確認する必要がありSitemap.xmlます。私は、CMSページのようなもののいくつかの例を見つけましたが、製品ページを実行するためのものではなく、1つ以上の製品を見つけました。私はMagentoに新しいです

誰もがこれをどのように行うことができるか知っていますか?

回答:


7

箱から出して、いいえ、MagentoのCatalog -> Google Sitemap機能によって生成されたサイトマップから特定の製品を除外する方法はありません。

プログラムでこれを実行しようとした場合、Magentoの最新バージョン(1.7.xブランチで確認済み、これは以前/ EEバージョンで使用されている可能性があります)は次のリソースモデルクラスを使用します

Mage_Sitemap_Model_Resource_Catalog_Product

製品のリストを取得します。

#File: app/code/core/Mage/Sitemap/Model/Sitemap.php
$collection = Mage::getResourceModel('sitemap/catalog_product')->getCollection($storeId);

これは標準のMagento CRUDモデルでgetCollectionはなく、コレクションオブジェクトを返しません。代わりに、getCollectionこれらの製品のデータベースを手動で照会します。

特定の製品がサイトマップに表示されないようにする機能を実装する場合は、次のいずれかを試みます。

  1. クラスgetCollectionparent::getCollection、を呼び出すメソッドを書き直し、配列から製品を手動で除外します

  2. _addFilterparent :: _ addFilterメソッドを呼び出すクラスを書き換えてから、さらにWHERE句を追加して_select、特定の製品を除外します。ハッキングのようなものですが_select、データベースへのクエリに使用されるオブジェクトにアクセスできる唯一の方法です。理想的には、新しいWHERE句を一度だけ追加するために、何らかのグローバル/静的フラグが必要です。


8

Magento 1.9.0以降。コアファイルに触れることなくこれを行うことができます。

次の2つの新しいイベントを監視できます。

  • sitemap_categories_generating_before
  • sitemap_products_generating_before

属性に基づいて製品を除外するには、次を実行できます。

  1. にオブザーバーを追加する sitemap_products_generating_before

    app \ code \ community \ My \ Module \ etc \ config.xml

        <events>
            <sitemap_products_generating_before>
                <observers>
                    <my_module>
                        <class>my_module/observer</class>
                        <method>excludeProductsFromSitemap</method>
                    </my_module>
                </observers>
            </sitemap_products_generating_before>
        </events>

    app \ code \ community \ My \ Module \ Model \ Observer.php

    public function excludeProductsFromSitemap(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        $items = $collection->getItems();
    
        $excludeIds = Mage::getModel('catalog/product')
            ->getCollection()
            ->setStoreId($observer->getStoreId()) # requieres Magento 1.9.3.0
            ->addAttributeToFilter('use_in_sitemap', 0)
            ->getAllIds();
    
        foreach ($excludeIds as $id) {
            unset($items[$id]);
        }
    
        $collection->setItems($items);
    }
  2. 「yes / no」という名前の製品属性を追加しますuse_in_sitemap(デフォルト値は「yes」の場合があります)

  3. この属性をすべての属性セットに追加します
  4. 除外する製品を「いいえ」に設定します
  5. サイトマップを生成する

:Magento 1.9.3.0までは、属性をglobalスコープに設定する必要があります。


3

これを実現するには、次のことを実行できます。

  1. 製品に対して属性を作成しますexclude_from_sitemap(はい/いいえ)

  2. Mage_Sitemap_Model_Resource_Catalog_Productクラスを上書きgetCollectionし、新しい属性にフィルターを追加して機能を変更します。つまり、サイトマップから除外します

あなたが開発者ではない場合、次のモジュールは上記の達成に役立ちますが、もちろん有料の拡張機能です

http://www.scommerce-mage.co.uk/magento-extensions/magento-google-site-map-exclusion.html


1

これらの製品を無効にするか、可視性フィールドを「個別に表示しない」に設定できます。サイトマップには、有効で表示可能な製品のみがリストされます。
これらの製品を有効にする必要がある場合は、それらを無効にし、sitemap.xmlをビルドして再度有効にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.