WordPress wird recht häufig parallel zu Shops eingesetzt. Das hat viele Gründe; einer ist, dass Google frischen Content mag. Außerdem haben Shops häufig das generelle Problem, dass sie ziemlich Text-arm sind, da können Blogs für die Suchmaschinenoptimierung helfen.
In einem Projekt für einen neuen Shop auf Magento-Basis stand ich vor Kurzem vor genau dieser Aufgabe: ein Blog sollte aufgesetzt werden. Natürlich vom Look & Feel her an den Shop angelehnt. Also musste ein eigenes Theme her, so weit so gut. Aber es sollten auch einige Elemente des Shops im Blog genutzt werden. Zum einen die Menü-Struktur, die in diesem Shop den Kategorien entspricht. Zum anderen solche Dinge wie Footer, ein Bildwechsler und so weiter.
In diesem Artikel stelle ich vor, wie wir das Menü aus dem Shop im Blog verwenden. Die Idee funktioniert aber auch mit eigentlich allen denkbaren anderen Elementen des Magento-Shops, z. B. Produkte, Preise, Bewertungen, Warenkorb, Single-Sign-On mit dem Kundenkonto des Shops … eben alles, was man sich so an schönen Features überlegen könnte.
Zwei Lösungsansätze: Walker vs. Integration
Die erste Idee war es, die Kategorie-Struktur in WordPress als Seiten nachzubauen. Eine passende Ausgabe des HTML-Codes ließe sich über einen Walker realisieren. Man muss nicht in den Standard eingreifen und bleibt Update-fähig, das ist gut. Aber das Problem wird auch schnell klar: ändert sich eine Kategorie oder kommt eine dazu, muss die Änderung im auch Blog gemacht werden, manuell – eine typische Fehlerquelle. Außerdem bin ich kein Freund von Redundanz und habe nach einer besseren Lösung gesucht.
Eine technisch „schönere“ Lösung ist es, direkt auf die Funktionen von Magento zuzugreifen, statt Dinge nachbauen zu müssen. So muss jeder Content und jedes Feature nur einmal gepflegt werden. Ein weiterer absolut nicht zu unterschätzender Pluspunkt der Integrations-Lösung ist, dass man durch diese Lösung auch den Cache von Magento mit nutzt.
Wie so oft gibt es auch dafür schon ein Plugin, dass uns bei der Arbeit ein wenig unterstützt. Es heißt MageEnabler und ist von Richard Feraro entwickelt worden. Auf seiner Seite findet man auch einige weitere Beispiele, wie man das Plugin nutzen kann.
Funktionsweise des Plugins „MageEnabler“
Rein technisch gesehen stellt das Plugin eigentlich nur eine Maske im Admin-Panel von WordPress bereit, um den (absoluten) Pfad zur Mage.php einzugeben, z. B. /var/www/magento/app/Mage.php
Außerdem gibt es eine Methode mage_enabler(), die im Grunde nichts weiter tut, als die eingestellte Mage.php zu inkludieren, sofern sie vorhanden und lesbar ist, und über den Konstruktor eine Instanz zu erzeugen. Diese Methode wird automatisch aufgerufen; ab jetzt kann in der weiteren Logik die Magento-Klasse so verwendet werden, wie sie auch in der Magento- Template-Entwicklung genutzt werden kann. Die Klasse ist praktisch das Herzstück des Magento-Cores, daher ist nun praktisch alles möglich.
Die eigentliche Logik zur Nutzung von Magento-Features ist im Plugin nicht enthalten und muss selbst implementiert werden. Dafür sollte man sich ein wenig mit PHP und der Funktionsweise von Magento vertraut gemacht haben. Let’s get down to business: es folgt ein Beispiel, wie man Content-Elemente aus Magento in WordPress nutzen kann.
Nutzung von Magento-Funktionen in WordPress
Bevor wird das Plugin nutzen können, müssen wir einen Konflikt mit der Methoden-Benennung auflösen. Sowohl WordPress als auch Magento besitzen eine Methode __(). Die von Magento ist aber seit Ewigkeiten deprecated (seit Version 1.3), also zum Entfernen vorgemerkt. Sie wird auch nirgends mehr verwendet. Wir kopieren also die Magento-Datei app/code/core/Mage/Core/functions.php nach app/code/local/Mage/Core/functions.php, um keine Änderungen im Standard vorzunehmen. Anschließend ändern wir dort die Methoden-Definition so ab, dass sie nur greift, wenn die Funktion noch nicht von WordPress bereit gestellt wurde:
function __() {
return Mage::app()->getTranslator()->translate( func_get_args() );
}
Wird ersetzt durch:
if ( ! function_exists( '__' ) ) {
function __() {
return Mage::app()->getTranslator()->translate( func_get_args() );
}
}
Damit sind die notwendigen Vorbereitungen für die Nutzung des Plugins auch schon abgeschlossen. Nun können wir es in WordPress aktivieren und mit der Implementierung starten.
Nutzung des Magento-Menüs im Theme
Wie schon gesagt, wollten wir hauptsächlich das Menü in den Blog übernehmen. Einige weitere
Content-Elemente sind nettes Beiwerk. Dafür greifen wir aus den Theme-Dateien vonWordPress
heraus auf Magento zu (Auszug aus unserer header.php):
if ( class_exists( 'Mage' ) ) {
Mage::getSingleton( 'core/session', array( 'name' => 'frontend' ) );
$_layout = Mage::getSingleton( 'core/layout' );
$_block = $_layout->createBlock( 'catalog/navigation' )->setTemplate( 'catalog/navigation/top.phtml' );
echo $_block->toHtml();
}
Das äußere if-Statement ist wichtig, damit das WordPress-Theme auch weiterhin funktioniert, falls das Plugin deaktiviert wird oder der eingestellte Pfad zur Mage-Klasse nicht stimmt. Anschließend wird die Magento-Session aufgegriffen und weiter geführt, obwohl wir sie eigentlich hier nicht brauchen. So ist sichergestellt, dass die Laufzeit mit jedem Klick im Blog verlängert wird – es wäre ärgerlich, wenn wenn der Kunde seinen Warenkorb füllt, dann ins Blog geht und dort mehrere Artikel liest und dann seine Magento-Session abgelaufen ist.
Anschließend wird einfach nur ein Block erzeugt und ausgegeben. Die Füllung und das Rendering des Templates übernehmen die ganz normalen Magento-Mechanismen für uns. In diesem Block, den wir ins Magento in den Layout-XML-Dateien definiert haben, liegt bei uns das komplette Menü. Lediglich das CSS des Menüs haben wir noch in die Stylesheets des Themes übernommen. Wir wollten nicht die CSS-Dateien von Magento nutzen, weil die doch recht groß sind und wir unseren Besuchern ein wenig Ladezeit ersparen wollten.
Den Footer laden wir analog auf dieselbe Weise (footer.php):
if ( class_exists( 'Mage' ) ) {
$block = Mage::getSingleton( 'core/layout' );
$footer = $block->createBlock( 'Page/Html_Footer' );
$footer->setTemplate( 'page/html/footer.phtml' );
echo $footer->toHTML();
}
Die genauen Bezeichnungen der Blöcke und die Pfade der Templates können natürlich je Shop und eingesetztem Template in Magento abweichen. Aber eigentlich ziemlich easy, oder? Ich persönlich finde die Lösung sehr elegant.
Den Magento-Warenkorb in WordPress anzeigen
Wir wollten den Warenkorb bei uns im Blog nicht anzeigen, aber ich wollte trotzdem gerne wissen
ob und wie es gehen würde. Der Warenkorb wird in Magento per Default in der Sidebar angezeigt.
Es bietet sich also an, ihn als Widget einzubinden. So hat man in WordPress auch gleich noch die
Möglichkeit zu steuern, wo er angezeigt wird und wo nicht – und zwar ohne jedes Mal entwickeln zu
müssen.
Dafür genügen die beiden Funktionen in der functions.php im eigenen WordPress-Theme (bitte Browser neu starten oder eine neue Session beginnen, um Seiteneffekte zu vermeiden):
function widget_magento_cart() {
if ( class_exists( 'Mage' ) ) {
$app = Mage::app( 'default' )->getTranslator()->init( 'frontend' );
Mage::getSingleton( 'core/session', array( 'name' => 'frontend' ) );
Mage::getSingleton( 'checkout/session' );
$block = Mage::getSingleton('core/layout');
$cart = $block->createBlock('checkout/cart_sidebar');
$cart->setTemplate('checkout/cart/sidebar.phtml');
echo $cart->toHtml();
} else {
echo '<!-- CartWidget disabled, because Mage-Object is not intialised. -->';
}
}
if ( function_exists( 'wp_register_sidebar_widget' ) ) {
wp_register_sidebar_widget(
'SL_magentoCartWidget',
__( 'Magento Cart' ),
'widget_magento_cart',
array(
'description' => __( 'Displays the cart from Magentos\' sidebar in a WordPress-widget. Needs the Mage-Object, e. g. by MageEnabler plugin.' )
)
);
}
Fallbeispiel: dein-bikeshop.de
Der Motorrad-Fahrer findet im Shop unter dein-bikeshop.de Motorradbekleidung, Motorradhelme und Visiere, Motorradstiefel, Pflegemittel von der günstigen Einsteiger-Ausrüstung bis hin zu hochwertigen Premium-Marken wie Arai, Shoei oder für Stiefel daytona, deren Qualität auch den eingefleischten Rennfahrer beeindruckt.
Für den Fahrrad-Fan bietet dein-bikeshop.de Ausrüstung und Zubehör an – über Fahrradhelme bis hin zu Gepäckträger-Taschen und Fahrradkörben, aber auch bei Fahrrädern, Kinderfahrrädern und E-Bikes von Kreidler wird der Radler fündig.
Der Shop ist mit Magento umgesetzt und die hier vorgestellten Funktionen werden im Blog des Shops genutzt. Das Layout stammt von der Agentur „mit überblick“, einer Magento Agentur aus Bielefeld.
Hinweise zu Versionen
Bisher habe ich das Plugin nur in Kombination mit Magento 1.5 bzw. 1.5.0.1 in der Community Edition eingesetzt. Aber sowohl mit der Version 1.6 als auch mit 1.7 aus dem SVN dürfte es funktionieren. Jedenfalls sind alle genutzten Methoden genau wie benötigt vorhanden. Das Plugin arbeitet aus Erfahrung sowohl mit WordPress 2.9.x, 3.0 und auch der erschienen WordPress 3.3.2 sehr gut zusammen.
Gastbeitrag

Dieser Artikel stammt aus der Feder von Sebastian Leitner. Er ist eCommerce Consultant bei der Lynx-Consulting GmbH und betreut das Projekt dein-bikeshop.de privat.
Vielen Dank auch hier nochmal von meiner Seite an Sebastian.
Ich nutze WordPress meistens in einer eigenen Subdomain. Ein Theme kann man selber sehr schön selber bauen in der CI vom Shop. Es ist nicht besonders schwer und daher für mich immer die optimale Lösung.
Vielleicht ist für einen oder anderen auch Extension von Magento http://www.magentocommerce.com/magento-connect/wordpress-integration.html sinnvoll.
Hallo Sebastian,
vielen Dank für den Hinweis. Auf die Idee WordPress mit Magento zu knüpfen wäre ich nicht gekommen. Aber du hast natürlich recht, dass der fehlende Content meinst ein Problem für Online Shops ist.
Werde mir den Link speichern. Mal sehen wie es mit Magento weiter geht, Magento (Ex Varien) scheint ja nicht mehr so großes Interesse an der Community Edition zu haben und ob genug Entwickler beim Fork mitmachen muss sich noch beweisen.
Thomas
Vielen Dank. Ich hatte bisher nur einmal das Vergnügen ein WordPress in einem Magento zu integrieren, was nicht so viel Spaß machte. Durch den fehlenden Autoloader von WordPress zog das bei jedem Request erstmal ordentlich an der Performance, so dass man es dann gezielt initialisieren musste. Diese Variante hier ist wesentlich sauberer, hübscher und übersichtlicher!
Danke für den tollen Beitrag!
Ich werde mir den ganzen Artikel nochmal in Ruhe zu Hause durchlesen da ich genau das was hier beschrieben wird vor habe!
Cheers
Hallo und danke für deine niedergeschriebene Meinung zu WordPress in connection mit Magento. Ich kann mir vorstellen das diese Lösung für viele Blogger sehr interessant sein kann. Mich eingeschlossen natürlich;) LG
Ich habe jetzt schon 2 Bücher über WordPress gelesen und habe immer noch das Gefühl, das ich im netz beim Stöbern auf Neuland stoße. Coole Ausarbeitung zum Thema Magento. Das freut uns Blogger.
Sehr coole Beschreibung, ich habe das mal eben in einem Blog eines Kunden umgesetzt. Allerdings ist es schade das eigene Statische Seiten nicht mit in die Navi eingebunden werden. Oder habt ihr dafür noch einen Tipp?
Schöne Beschreibung - gleich mal ausprobiert
Ich habe aber leider das problem das die blöcke zwar gezogen werden und auch rendern, aber danach wird nichts mehr ausgeführt.
Wenn ich zB. die Navigation laden will wird diese angezeigt aber es geht nicht weiter.
Könnt ihr vielleicht mal den kompletten Code für die Header Datei posten.
Vielen Dank
rkoppik