Auf dem WordCamp Frankfurt habe ich bereits gezeigt, dass Theme-Vererbung – oder besser: 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.
Theme-Vererbung in WordPress 4.7
In WordPress 4.7 wird der Community ein großer Wunsch erfüllt: Theme-Vererbung. Die Templates im Stammverzeichnis, wie header.php oder index.php vom Theme dürften vielen ein Begriff sein. Auch, dass WordPress an dieser Stelle bereits einige Mechanismen für eine Vererbung hat, jedoch nicht für Verzeichnisse, die weiter in die Tiefe gingen. Schade, dabei sehen Themes meist so aus:
Post Types, Shortcodes und Widgets sind sauber im /inc/-Ordner in einzelnen Dateien untergebracht. Nun fordert ein Stakeholder, dass das Widget „baz“ anders aussehen oder funktionieren soll als bisher. Natürlich wird ein Child Theme angelegt, welches in etwa so aussieht:
Fertig, das war es! Etwas anderer Content in die /inc/widget-baz.php, und schon sieht das Widget anders aus. Der Overhead mit der functions.php, deregistrieren des Widgets und neu registrieren eines eigenen – das alles soll erspart bleiben. Besser ist es, einfach die Datei anzulegen, und das (gekaufte) Parent Theme soll von selbst merken, was los ist. So bin ich es aus anderen Frameworks gewohnt, warum also nicht 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 sprechen für sich. Ein Aufruf wie get_theme_file_path("inc/widget-baz.php")
sucht die Datei zuerst im Child Theme, und falls sie dort nicht gefunden werden kann auch im Parent Theme. Da diese Datei im Child Theme abgelegt wurde, wird sie auch von dort bezogen.
Anders wäre es bei einem get_theme_file_path("inc/shortcode-bar.php")
… und ein Filter
Zusätzlich gibt es noch einen Filter, der für Plug-in-Autoren nützlich sein wird. Von WooCommerce ist zum Beispiel bekannt, dass es eigene Templates für Warenkorb und Check-out mitbringt und diese von einem Theme überschrieben werden können. Dafür nutzt es eigene Funktionen und viel drumherum.
WordPress 4.7 hat in den zuvor genannten Funktionen Filter dafür. Einer davon kann für jedes Plug-in 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 Plug-in mitgelieferten Dateien zu überschreiben. Als Beispiel soll dieser Aufruf im Plug-in 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
WordPress Spezial
Alles rund um WordPress im Entwickler Spezial Vol. 10 – ab 18.11.2016 im Handel.
Ist doch super, dass das Template vom Plug-in direkt im Theme überschrieben werden kann! Am besten wäre dieser letzte Filter auch gleich im WordPress-Core enthalten, damit Plug-ins und Themes sich gegenseitig viel besser ergänzen können.
Ich werde in meinen Plug-ins und Themes fortan definitiv auf diese Technik zurückgreifen. Hoffentlich sind andere Theme-Autoren ähnlich begeistert davon und bieten die sehr bequeme moderne Vererbung von Templates ebenfalls an.
Nach diesem Ausflug in die Welt der Themes beschäftigen wir uns morgen im letzten Teil unserer WordPress-Themenwoche mit einem Event-System, das wir mit WP_Hook realisieren werden.
Alles rund um WordPress 4.7

Alles zu WordPress 4.7

React Fiber, Neues aus dem IoT & neue Windows 10 Insider Preview Builds – unser Wochenrückblick KW 16

Angular 4, Alexa Skill & Windows 10 Mobile Insider Preview – unsere Top-Themen im Dezember

Wochenrückblick KW 46: Neue Windows 10 Insider Preview, Symfony 3.2 & User Stories

WordPress 4.7 – Event-System

WordPress 4.7 – Theme-Vererbung

WordPress 4.7 – Shortcodes

WordPress 4.7 – Bulk Actions

WordPress 4.7 – die Neuerungen
