ストアにフロントエンド ページを持つカスタム モジュール (購入または開発したもの) があります。これらのページを Magento が生成する Google サイトマップに含めるにはどうすればよいですか?
2 に答える
サイトマップを生成する関数は次のとおりです。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 サイトマップ ファイルを生成できます。
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 を取得します。したがって、値がより適切なイベントを選択するだけです。