WordPress und Magento – ein Lösungsansatz

Magento und WordPress in Teilen verbinden, die insbesondere für das Layout relevant sind ist das Ziel dieses Artikels. In einem Livebeispiel werden die Lösungen vorgestellt und laden vielleicht ein, die beiden Systeme ab und an ihren Referenzen zu verwenden und trotzdem in Teilen eine gemeinsame Datenbasis zu haben.

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 8 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

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

Sebastian Leitner
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.

Kommentare sind geschlossen.