Wie erstellt man Sitemaps mit Bildern im Magento Onlineshop (Multishop mit 2 Websites und 3 Sprachen / Store Views je Website) und schließt bestimmte Seitentypen für einzelne Store Views aus? Hier ein Lösungsweg: Zuerst erstellen wir Unterordner für jede Sitemap, z.B. /sitemaps/sitemap-websitename1-storeviewname1/, /sitemaps/sitemap-websitename1-storeviewname2/, usw.. Danach legen wir im Magento-Backend pro Storeview eine Sitemap an und führen die Erstellung durch, so dass wir dann als Ergebnis eine Sitemap pro Sitemap-Ordner zur Verfügung haben (/sitemaps/sitemap-websitename1-storeviewname1/sitemap.xml, /sitemaps/sitemap-websitename1-storeviewname2/sitemap.xml, etc.).
Damit die Crawler der Suchmaschinen nun wissen, welche Sitemap für welchen Shop gedacht ist, erstellen wir nun 2 robots.txt-Dateien (eine je Webseite, z.B. robots.website1.txt, robots.website2.txt) mit folgendem Inhalt:
Sitemap: https://website1/sitemaps/sitemap-websitename1-storeviewname1/sitemap.xml
Sitemap: https://website1/sitemaps/sitemap-websitename1-storeviewname2/sitemap.xml
Sitemap: https://website1/sitemaps/sitemap-websitename1-storeviewname3/sitemap.xml
bzw.
Sitemap: https://website2/sitemaps/sitemap-websitename2-storeviewname1/sitemap.xml
Sitemap: https://website2/sitemaps/sitemap-websitename2-storeviewname2/sitemap.xml
Sitemap: https://website2/sitemaps/sitemap-websitename2-storeviewname3/sitemap.xml
Diese beiden Robots-Dateien referenzieren wir dann in der .htaccess:
RewriteCond %{HTTP_HOST} ^.*?website1\.com$ [NC]
RewriteRule ^robots\.txt$ robots.website1.txt
RewriteCond %{HTTP_HOST} ^.*?website2\.de$ [NC]
RewriteRule ^robots\.txt$ robots.website2.txt
TLD (.de / .com) natürlich nach Bedarf! Wir können dann die Sitemap-Erstellung noch automatisieren unter System->Konfiguration->KATALOG->Katalog im Magento-Backend und sind dann quasi fertig, haben jedoch noch keine Bilder in der Sitemap und auch noch keine Ausschlussgruppen. Dies dann in den folgenden Schritten:
Wir erstellen hierzu eine Extension (Namensraum und Extensionname nach Belieben) unter
/app/code/local/Econcess/Sitemap/
, die wir dann mittels
/app/etc/modules/Econcess_Sitemap.xml
registrieren und aktivieren mit dem Inhalt:
<?xml version="1.0"?>
<config>
<modules>
<Econcess_Sitemap>
<active>true</active>
<codePool>local</codePool>
</Econcess_Sitemap>
</modules>
</config>
Die Extension selbst besteht dann nur aus 3 Dateien:
1) /app/code/local/Econcess/Sitemap/etc/config.xml
2) /app/code/local/Econcess/Sitemap/Model/Sitemap.php
3) /app/code/local/Econcess/Sitemap/Model/Resource/Catalog/Product.php
In der /app/code/local/Econcess/Sitemap/etc/config.xml geben wir bekannt, welche Models wir überschreiben möchten (um die Bilddaten zu generieren und Änderungen an der Produktauswahl vorzunehmen):
<?xml version="1.0"?>
<config>
<modules>
<Econcess_Sitemap>
<version>0.0.1</version>
</Econcess_Sitemap>
</modules>
<global>
<models>
<Econcess_Sitemap>
<class>Econcess_Sitemap_Model</class>
</Econcess_Sitemap>
<sitemap>
<rewrite>
<sitemap>Econcess_Sitemap_Model_Sitemap</sitemap>
</rewrite>
</sitemap>
<sitemap_resource>
<rewrite>
<catalog_product>Econcess_Sitemap_Model_Resource_Catalog_Product</catalog_product>
</rewrite>
</sitemap_resource>
</models>
</global>
</config>
Wie wir die Bilder (und CMS-Pages) dann generieren, legen wir fest in der /app/code/local/Econcess/Sitemap/Model/Sitemap.php. Die Basis dieser Datei bildete in unserem Projekt der Source Code aus dem Magento Core Team, der unter https://github.com/hans2103/Sitemap/blob/master/app/code/ community/Hans2103/Sitemap/Model/Sitemap.php einzusehen ist. Diesen haben wir dahin gehend erweitert, dass wir nach verschiedenen Kriterien (attribute_set_id und muster_art) ein Array zusammenstellen lassen, welches die Produkt-IDs enthält und dann die bereits vorbereitete Produktkollektion "ausdünnt":
$collection = Mage::getResourceModel('sitemap/catalog_product')->getCollection($storeId);
$excludeIds = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToFilter(
array(
array('attribute'=> 'attribute_set_id','eq' => 'xxx'),
)
)
->addAttributeToFilter(
array(
array('attribute'=> 'muster_art','neq' => 'yyy'),
)
)
->addAttributeToFilter(
array(
array('attribute'=> 'muster_art','neq' => 'zzz'),
)
)
->getAllIds();
foreach ($excludeIds as $id) {
unset($collection[$id]);
}
Um die benötigten Bildinformationen zu beschaffen müssen wir, wie oben erwähnt, auch die Produktresource erweitern in /app/code/local/Econcess/Sitemap/Model/Resource/Catalog/Product.php (hier auch Quelle: Magento Core Team) mit dem schlichten Inhalt (siehe auch https://github.com/hans2103/Sitemap/blob/master/app/code/ community/Hans2103/Sitemap/Model/Resource/Catalog/Product.php):
class Econcess_Sitemap_Model_Resource_Catalog_Product extends Mage_Sitemap_Model_Resource_Catalog_Product
{
protected function _prepareProduct(array $productRow)
{
$product = new Varien_Object();
$product->setId($productRow[$this->getIdFieldName()]);
$id = $product->getId();
$productMedia = Mage::getModel('catalog/product')->load($id)->getImage();
$product->setMedia($productMedia);
$productName = Mage::getModel('catalog/product')->load($id)->getName();
$product->setName($productName);
$productUrl = !empty($productRow['url']) ? $productRow['url']: 'catalog/product/view/id/' . $product->getId();
$product->setUrl($productUrl);
return $product;
}
}
Hiermit wird alles wunderbar erzeugt und wir sind fertig! Getestet in Magento 1.9.2.3.