Child Plugins: Templates eines Plugins überschreiben

In den letzten Beiträgen zu dieser Artikelreihe ging es meistens um technische Anpassungen an Plugins. Heute möchte ich mich mit Änderungen an Template Dateien beschäftigen und an einem Beispiel zeigen, wie oft dies bei gute programmierten Plugins möglich ist.

Templates: Im Theme oder im Plugin?

Als Beispiel habe ich mir WooCommerce vorgenommen. Es war das erste Mal, dass ich es installiert habe und ich war recht beeindruckt, wie gut man durch die ersten Einrichtungsschritte geführt wird. Aber darum soll es ja heute nicht gehen.

Viele Plugins haben die Eigenschaft “Kompatibel mit WooCommerce”. Ein passendes Theme zu wählen, dass für die Darstellung von Shops erstellt wurde bietet sich auf jeden Fall an. Aber selbst mit dem TwentySixteen Theme konnte ich alle Schritte einer Bestellung durchgehen.

Wenn es nun um das Anpassen von Templates für WooCommerce geht, dann stellt sich natürlich die Frage, wieso man das in einem Plugin tun sollte und nicht besser im Theme. Das ist eine sehr berechtigte Frage und die Antwort ist: im Theme (oder noch besser Child Theme) ist eine solche Anpassung besser aufgehoben.

Aber dennoch kann es Anwendungsfälle geben, bei denen man ein Template aus einem Plugin für alle Themes überschreiben möchte, die dieses Plugin verwenden. Stehen diese Anpassungen nicht im Konflikt zu dem Theme, macht es durchaus Sinn, dies in einem Child Plugin zu tun.

Und außerdem brauchte ich einfach für den Artikel ein schönes Beispiel und da hat sich WooCommerce angeboten 🙂

Die WooCommerce Template-Suche

Wann immer WooCommerce eines seiner Templates rendert, sucht es standardmäßig an drei Orten und in der folgenden Reihenfolge:

  1. In einem Unterordner im Child Theme
  2. In einem Unterordner im Parent Theme
  3. In einem Unterordner des WooCommerce Plugins

Wenn man also ein Template überschreiben möchte, kann man dieses ganz einfach dadurch tun, dass man einen Ordner /woocommerce/templates/ im Child Theme oder Parent Theme anlegt und darin die entsprechende Ordner- und Dateistruktur übernimmt. Das erste gefundene Template wird dann verwendet. Man sollte natürlich nur solche Templates kopieren, die man wirklich verändern möchte. Stichwort Child Theme Dilemma.

Die Template-Suche erweitern

Da WooCommerce nicht ebenfalls in allen Plugins nach der Template-Struktur sucht, müssen wir unseren Ordner selbst registrieren. Hierzu bietet es einen Filter an:

function my_custom_wc_locate_template( $template, $template_name, $template_path ) {

	$template_overwrite = dirname( __FILE__ ) .  '/templates/' . $template_name;

	if ( file_exists( $template_overwrite ) ) {
		$template = $template_overwrite;
	}

	return $template;
}

add_filter( 'woocommerce_locate_template', 'my_custom_wc_locate_template', 10, 3 );

Wir verwenden hier den Filter woocommerce_locate_template und versuchen darin, die gesuchte Template-Datei im Unterordner templates unseres Plugins zu finden. Das ist wirklich schon alles 🙂

Fazit

Wie ihr also sehen könnt, ist es bei einem gut programmierten Plugin sehr einfach, die Templates zu überschreiben. Ich habe genau dieser Technik auch schon bei Plugins wie BuddyPress oder einigen Premium Plugins verwenden könnten. Natürlich müsst ihr herausfinden, wie der entsprechende Filter dazu heißt. Ob nun das Überschreiben der Plugins wirklich in einem Plugin oder doch besser in einem (Child) Theme passiert, solltet ihr vorher gut überlegen. Und vergesst nicht, dass ihr eure kopierten Templates bei Updates des Plugins eventuell ebenfalls aktualisieren müsst.

Falls ihr bei einem Plugin bisher keinen Erfolg hattet, die Templates zu überschreiben, würde ich mich sehr über ein Beispiel freuen. Vielleicht findet sich ja hierfür ein anderer Trick. Eventuell ja der aus dem letzten Beitrag 😉

Weitere Artikel zu Themenreihe

Dies ist der sechste Teil der Themenreihe “Child Plugins”. Hier findest du die anderen Beiträge:

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugin, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

10 Kommentare » Schreibe einen Kommentar

  1. Hallo, leider hab ich kein Plan, wo ich den PHP Code hinschreiben soll ?!?!
    Welchen Ordner / Welche Datei ??? Das wäer super hilfreich. Danke.

  2. Ein Plugin. Die Reihenfolge der Daten soll geändert werden.
    z.B.
    Alt: Überschrift, Foto, Datum, Beschreibung.

    Neu: Foto, Überschrift, Beschreibung, Datum.

    • OK. Also im Beitrag habe ich ja beschrieben, wie man die Templates von WooCommerce anpassen kann und welchen Filter WooCommerce dabei anbietet. Hat denn das Plugin auch Template-Dateien und einen solchen Filter?

      Wäre es vielleicht auch möglich die Reihenfolge nur per CSS zu verändern?

  3. Ja das Plugin hat Template Dateien, deswegen bin ich mir nicht sicher, wo ich dann die selbst geschriebene Datei ablegen soll, damit diese nicht bei einem Update zerschossen wird.

    • Also wenn es Templates im Plugin gibt würde ich, wie oben im Artikel beschrieben, einfach einen Unterordner in deinem Child-Theme anlegen, in das du dann das Template mit genau der gleichen Ordnerstruktur kopierst. Wenn das Plugin ordentlich geschrieben ist, sollte das schon ausreichen. Genaueres kann ich dir auch nicht sagen, wenn ich das Plugin nicht kenne.

  4. hallo bernhard, auf der suche nach einer lösung bin ich hier gelandet und schon sehr nah dran, allerdings verstehe ich auch nicht, wo und wie genau man den php-code einfügt.
    ich benutze ein child-theme und möchte die php-datei eines plugins ändern.

    so sieht meine ordner-struktur zum plugin aus:
    wordpress/wp-content/plugins/wp-event-manager/templates/content-event-listing.php

    und so zum child-theme:
    wordpress/wp-content/themes/child-theme

    und das ist der filter:

    return apply_filters( 'event_manager_locate_template', $template, $template_name, $template_path );
    

    muss der filter in die php-datei, die ich ändern will?

    wäre super, wenn du mir weiterhelfen kannst!

    • Hallo Sobo,

      in der Dokumentation des Event Managers wird eigentlich recht gut erklärt, wie die Ordnerstruktur aussehen muss. Im Child-Theme muss du einen Ordner wp-event-manager erstellen und dort die geänderten Plugin-Template-Dateien ablegen. Die von dir genannte Datei müsste folgenden Pfad haben: wordpress/wp-content/themes/child-theme/wp-event-manager/templates/content-event-listing.php.

      Ich hoffe damit klappt es bei dir.

      • danke für deine antwort! so habe ich es schon versucht, aber mein child-theme übernimmt die veränderungen einfach nicht…

      • ich habe die geänderte datei via ftp hochgeladen. wenn ich sie aber im wp-editor aktualisieren will, kommt diese fehlermeldung:
        Kommunikation mit der Website, um auf fatale Fehler zu prüfen, nicht möglich, daher wurde die PHP-Änderung rückgängig gemacht. Du wirst deine veränderte PHP-Datei mit anderen Mitteln hochladen müssen, wie per SFTP.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.