0

ストアにフロントエンド ページを持つカスタム モジュール (購入または開発したもの) があります。これらのページを Magento が生成する Google サイトマップに含めるにはどうすればよいですか?

4

2 に答える 2

0

サイトマップを生成する関数は次のとおりです。Mage_Sitemap_Model_Sitemap::generateXml()

これは次のことを行います:

  • ファイルを開き、xml ヘッダーを書き込む
  • カテゴリ コレクションを取得し、サイトマップ ファイルに書き込みます
  • 製品コレクションを取得し、サイトマップ ファイルに書き込みます
  • CMS コレクションを取得し、サイトマップ ファイルに書き込みます
  • サイトマップ xml ファイルを閉じる

xml ファイルを閉じる前にイベントはディスパッチされません... この場合、これを拡張し、独自のカスタム URL を追加Mage_Sitemap_Model_Sitemapして関数をオーバーライドできgenerateXml()ます (これらの URL が上記のコレクションのいずれにも含まれていない場合: カテゴリ、製品、cms ページ)

問題に対する別のアプローチは、複数のサイトマップ ファイルとサイトマップ インデックス ファイルを使用することです (Google はこれをサポートしています: http://googlewebmastercentral.blogspot.co.uk/2006/10/multiple-sitemaps-in-same-directory.html )。この場合、別のモジュールを使用して、2 番目の xml サイトマップ ファイルを生成できます。

于 2012-10-23T16:17:08.147 に答える
0

Magento は、後のバージョンでイベントsitemap_products_generating_beforeおよびsitemap_categories_generating_beforeを追加しました(時期はわかりませんが、私のバージョンは 1.9.2 です)。したがって、カスタム モジュールのページを Google サイトマップに追加する最良の方法を探して、私のようにこのスレッドに出くわした場合は、これらのイベントを使用すると簡単です。

私の場合、動的な「ニュース」ページを作成するカスタム モジュールがあるため、モジュールの config.xml の <global> タグにイベント リスナーを追加します。私は製品サイトマップ イベントを使用することにしました*:

    <events>
        <sitemap_products_generating_before>
            <observers>
                <{your_unique_event_observer_name}>
                    <class>{Brand}_{Module}_Model_Observer</class>
                    <method>addPagesToSitemap</method>
                </{your_unique_event_observer_name}>
            </observers>
        </sitemap_products_generating_before>
    </events>

次に、私のモジュールのオブザーバーで、メソッドaddPagesToSitemapを使用して、製品コレクション (カテゴリ サイトマップ イベントを使用した場合はカテゴリ コレクション) にアイテムを追加します。

class {Brand}_{Module}_Model_Observer
{   
    function addPagesToSitemap(Varien_Event_Observer $observer){

        $sitemapItems = $observer->getEvent()->getCollection()->getItems();

        // Get your module's page collection including their urls
        // Adjust the following lines to your needs
        $collection = Mage::getModel('{brand}_{module}/pages')->getCollection()
            ->addFieldToSelect(array('page_id','url'))
            ->addFieldToFilter('display', 1);
        // My module stores the page path separately,
        // you might don't need this:
        $modulePagePath = Mage::helper('{my-modules-helper}')->getNewsPath();

        foreach($collection as $_item){
            $varienObject = new Varien_Object();
            // We don't want to override 
            // any existing product/category items
            $uniqueId = '{module}'.$_item->getPageId();         
            $varienObject->setId($uniqueId);

            // You might want to adjust this if your item
            // stores the complete url. Don't add the base url tho,
            // Mage_Sitemap_Model_Sitemap::generateXml adds it
            $varienObject->setUrl($modulePagePath . DS . $_item->getUrl());

            $sitemapItems[$uniqueId] = $varienObject;
        }
        $observer->getEvent()->getCollection()->setItems($sitemapItems);

        return $this;
    }
}

それでおしまい。[カタログ] > [Google サイトマップ] でサイトマップを手動で生成してテストできます。


*何らかの理由で、Magento は「sitemap_pages_generating_before」イベントを追加しなかったため、製品またはカテゴリのイベントを選択する必要があります。両方のイベントで、Magento は、Magento 構成のカテゴリと製品ページに設定されたそれぞれの changefreq- と priority-value を取得します。したがって、値がより適切なイベントを選択するだけです。

于 2017-06-04T12:25:42.983 に答える