Neue Theme Vererbung in WordPress

Auf dem WordCamp Frankfurth habe ich bereits gezeigt, dass Vererbung in Themes per locate_template ganz leicht möglich ist. Darauf hat mich ein Core-Entwickler gebracht und nun wurde das Konzept vervollständigt.Read the more up to date and famous one afterwards!
Capabilities für einzelne Terms in WP 4.7
Open in new tab for later

Wie Theme-Vererbung funktionieren kann

In WordPress 4.7 wird der Community ein großer Wunsch erfüllt: Vererbung im Theme. Die Templates im Stammverzeichnis, wie „header.php“ oder „index.php“ vom Theme dürften vielen ein Begriff sein. An dieser Stelle hatte WordPress bereits einige Mechanismen für eine „Vererbung“, jedoch nicht für Verzeichnisse die weiter in die Tiefe gingen. Schade, dabei sehen Themes meist so aus:

 

bildschirmfoto-2016-10-09-um-20-29-34

Post-Types, Shortcodes und Widgets sind sauber getrennt in einzelnen Dateien und sogar im „inc“-Ordner. Nun fordert ein Stakeholder, dass das Widget „baz“ anders aussieht oder funktioniert als bisher. Natürlich wird ein Child-Theme angelegt, welches so aussieht:

bildschirmfoto-2016-10-09-um-20-32-28

Fertig, das war es! Etwas anderer Content in die „inc/widget-baz.php“ und schon sieht das Widget anders aus. Den Overhead mit der „functions.php“, deregistrieren vom Widget und neu registrieren eines eigenen möchte ich mir sparen. Viel lieber einfach die Datei anlegen und das (gekaufte) Parent-Theme soll von selbst merken was los ist. So bin ich es aus anderen Frameworks gewohnt und warum nicht genau so auch in WordPress. Das ist schon lange keine Utopie mehr und mit Version 4.7 wird es noch besser.

Vier neue Funktionen …

Für solche Fälle gibt es eine Hand voll neuer Funktionen mit etwas Magie:

  • get_theme_file_uri
  • get_parent_theme_file_uri
  • get_theme_file_path
  • get_parent_theme_file_path

Die Namen dürften für sich sprechen. Ein Aufruf wie get_theme_file_path( "inc/widget-baz.php" ) sucht die Datei zuerst im Child-Theme und falls sie dort nicht ist auch im Parent-Theme. Da diese Datei im Child-Theme abgelegt wurde greift das Theme dieses Widget ab.

Anders wäre es bei einem get_theme_file_path( "inc/shortcode-bar.php" ), da diese Datei nicht im Child-Theme existiert. Diese wird also aus dem Parent-Theme genommen und als Rückgabewert kommt der komplette Pfad zur Datei zurück. Jetzt müssten Theme-Autoren in Ihren „Premium“-Themes nur noch diese Jahre alten und nun neu polierten Techniken nutzen.

… und ein Filter

Zusätzlich gibt es noch ein Filter, welcher für Plugin-Autoren nützlich sein wird. Von WooCommerce ist zum Beispiel bekannt, dass es seine Templates für Warenkorb und Checkout mitbringt und diese von einem Theme überschrieben werden können. Dafür nutzt es eigene Funktionen und viel drum herum.

WordPress 4.7 hat in den zuvor genannten Funktionen Filter dafür. Einer davon kann für jedes Plugin eine vergleichbare Funktionsweise liefern:

add_filter(
  'theme_file_path',
  function ( $path, $file ) {
    if ( $path ) {
      // da wurde bereits was gefunden => lassen wir so
      return $path;
    }

    // Template aus eigenem Plugin anbieten.
    if ( file_exists ( WP_PLUGIN_DIR . '/' . $file ) ) {
      return WP_PLUGIN_DIR . '/' . $file;
    }
  }
);

Diese Funktion erlaubt einem Theme die zum Plugin mitgelieferten Dateien zu überschreiben. Als Beispiel soll dieser Aufruf im Plugin dienen:

if ( $path = get_theme_file_path( 'mein-plugin/ein-template.php' ) ) {
  require_once $path;
}

Schon rennt WordPress los und sucht die Datei wie folgt:

  • wp-content/themes/child-theme/mein-plugin/ein-template.php
  • wp-content/themes/parent-theme/mein-plugin/ein-template.php
  • wp-content/plugins/mein-plugin/ein-template.php

Aus Alt mach Neu

Das ist doch super, dass das Template vom Plugin direkt im Theme überschrieben werden kann! Am besten wäre dieser letzte Filter auch gleich im WordPress Core mit drin, damit Plugins und Themes sich gegenseitig viel besser ergänzen können. Ich werde in meinen Plugins und Themes fortan definitiv auf diese Technik zurückgreifen. Hoffentlich sind andere Theme-Autoren, ähnlich begeistert davon und bieten diese sehr bequemen Möglichkeiten ebenfalls an.

1 Gedanke zu „Neue Theme Vererbung in WordPress“

  1. Vielen Dank für diesen post, Mike!
    Ich war auch in Frankfurt zum WordCamp, haben Deinen Vortrag aber leider nicht gesehen/gehört. Unter Verwendung dieser neuen Funktionen kann ich Kunden nun guten Gewissens und mit einer weniger aufwändigen Dokumentation veränderte Templates überlassen. Sicher, es bleibt die Ungewissheit, ob bei einem Theme-Update das originale Template aktualisiert wurde, aber diese Recherche ist ja komfortabel zu gestalten (z.B. mit dem Plugin „Child Theme Check“).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *