Ich bin ein großer Freund von Child-Themes (und versuche das Konzept auch weiter zu verbessern). Daher ist es immer schön, wenn Themes sauber programmiert sind, um über ein Child-Themes angepasst zu werden. Aber wie entferne ich zum Beispiel eine Funktion, die das Eltern-Theme per Action Hook einhängt?
WordPress hat dafür die Funktion remove_action
vorgesehen. Doch dabei gibt es ein paar Faktoren zu berücksichtigen.
Im Prinzip sucht man einfach den Tag des Action Hook und die aufzurufende Funktion raus. Also im Prinzip genau die Zeile im Eltern-Theme, wo mit add_action
die Funktion hinzugefügt wird, nur dass wir jetzt statt add_action
einfach remove_action
nutzen.
remove_action( 'the_content', 'class_filter_function' );
Ist die Funktion jedoch in einer Klasse, muss die in einem Array zusammen mit der Funktion angegeben werden:
remove_action( 'the_content', array( $my_class, 'class_filter_function' ) );
Klappt dies immer noch nicht, kann dies daran liegen, dass auch die Priorität exakt der aus dem Aufruf entsprechen muss, wie der Codex als wichtigen Hinweis mitgibt:
Important: To remove a hook, the $function_to_remove and $priority arguments must match when the hook was added. This goes for both filters and actions. No warning will be given on removal failure.
Auf Stackoverflow habe ich dazu eine smarte Lösung gefunden, die einfach die Priorität vorher ausliest:
$priority = has_action('action_name', 'function_name'); remove_action('action_name', 'function_name', $priority);
Nun hatte ich aber den Fall, dass nach all diesen Informationen, das Entfernen des Action Hooks immer noch nicht geklappt hat. Das lag an der Lade-Reihenfolge. Die functions.php
des Child-Theme wird ja zuerst geladen (so können zum Beispiel „pluggable functions“ im Child-Theme überschrieben werden). Möchte ich allerdings eine Funktion an einem Action Hook entfernen, so ist er im Moment des Ladevorgangs der functions.php
ja noch gar nicht eingebaut …
Die Lösung ist daher den remove_action
-Aufruf selbst an einen Action Hook zu hängen (Quelle: Themeshaper). Zum Beispiel den init
-Hook. Welcher nach dem after_setup_theme
-Hook kommt und somit das Theme (und die Funktion am Action Hook) nun geladen sind.
function unhook_function() { // priority has to match remove_action('hook_name','function_name', priority); } add_action('init','unhook_function');
Bei Filter-Hooks ist dies einfacher zu lösen, da durch ein Abändern der Priorität vom Standardwert 10 sehr einfach die Ausführung des Filtern in der Reihenfolge geändert werden kann. Wobei folgendes gilt:
Lower numbers correspond with earlier execution, and functions with the same priority are executed in the order in which they were added to the filter.
Damit und mit „pluggable functions“ lassen sich Child-Themes extrem gut anpassen. Schade, dass es immer noch Theme-Entwickler gibt, die nicht darauf achten, ob ihr Theme auch Child-Theme-fähig ist.
Was ist deine Erfahrung mit der Anpassung von Child-Themes? Hattest Du auch Probleme? Vermisst du standardisierte Filter- oder Action-Hooks, die jeder Theme-Entwickler einbauen sollte (Stichwort: Theme Hook Alliance)? Ich freue mich über deinen Input in den Kommentaren!
Pingback: Jetpack ohne WordPress.com-Verbindung und ohne Development-Mode-Hinweis › Torsten Landsiedel
Hallo lieber Torsten,
Deine Tutorial Beschreibungen sind wirklich sehr gut verständlich geschrieben und die von Torsten Landsiegel auch, aber irgendwie vermisse ich ein wenig wie man die Basis für entsprechendes überschreiben, entweder per functions.php oder per Plugintemplate an der richtigen Stelle vor nimmt. Ich bin in den letzten Tagen auf fieberhaft auf der Suche nach einer Möglichkeit gewesen, wie ich ein Plugin über das Child-Theme überschreiben kann.
Die erste Lösung habe ich über die functions.php und entsprechendem remove_action oder add_action realisiert.
Nun ist es so das ich gerne einen Hook am besten über das Template überschreiben möchte. Dabei handelt es sich um das Email Subscribers & Newsletters Plugin.
Könntest Du mir einen Tipp geben, wie ich es über ein eigens Child- Plugin vornehmen kann?
Es geht darum dem Formular eine zusätzliche Checkbox für die Datenschutzerklärung mit einzuhängen.
In dem ursprünglichen Template habe ich das eingebunden, aber ich bekomme es nicht hin, diese Änderung sinnvoll in ein Child Plugin zu schreiben.
viele Grüße Jens August