Sitemap mit Bildern Titel Bild

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.