Für Menschen · Seien Sie begeistert und Sie werden begeistern !
WordPress basiert auf dem sogenannten Hook-System. Dieses dient WordPress und allen Erweiterungen um Funktionen an bestimmter Stelle einzubringen. Hintergründe und Verständnis habe ich versucht in unzähligen Blogartikeln zu verbreiten und aktuell im t3n-Magazin. Die Hooks sind aber nicht nur zum einhaken, sondern können ebenso in eigene Erweiterungen genutzt werden und so mehr Übersicht schaffen und zusätzliche Schnittstellen für weitere Entwicklungen bieten. Gerade die zweite Möglichkeit ist interessant, wenn man ein Theme erstellt, welches diverse Schnittstellen bieten soll oder ein Plugin kreiert, was durch andere Autoren erweitert werden kann oder als Framework dienen soll.
Um die Möglichkeit der Hooks zu nutzen, kann man die gleiche Funktion wie WordPress (do_action()) einsetzen und muss sich nicht eigene Funktionen oder Methoden erstellen.
In der folgenden Beispiel-Funktion, welche ich beim Theme in der functions.php ablege, meines Footer my_footer() wird ein Hook definiert mit Hilfe der Funktion do_action(). Dieser kann nun genutzt werden und das einhaken ist von Außen möglich.
function my_footer() {
do_action('my_footer');
}
Die eigentliche Funktion rufen ich im Template des Theme auf, in diesem Fall natürlich in der footer.php des Themes, im Beispiel direkt vor dem schließenden body-Tag.
<?php my_footer(); ?>
</body>
</html>
Nun möchte ich bei einem Plugin oder einer beliebigen Funktion im Theme auf diesen Bereich zugreifen und hake mich dort ein. Dazu schreibe ich meine eigene Funktion, zum Beispiel eine Funktion um die ganzen Code-Schnipsel für die Statistik-Tools zu hinterlegen und lege diese Schnipsel in dieser einen Funktion ab. Diese neue Funktion nenne ich example_function(). Um nun diese Funktion an der betreffenden Stelle meines Hooks einzuhaken, muss ich lediglich die klassische Hook-Funktionalität von WordPress nutzen. Mit Hilfe von add_action() wähle ich also den Hook, der es sein soll und übergebe die Funktion, die ich erstellt habe. Im Anschluss gebe ich noch einen dritten Parameter mit, der mir die Priorität des Einhaken gewährleistet, was nicht zwingend ist. Der Standard-Wert für die Priorität ist 10 und hat hier weiter keinen Einfluss, da ich bisher nur diese eine Funktion via Hook anspreche.
add_action('my_footer', 'example_function', 1);
Um das Verständnis der Priorität besser zu verstehen, erstellen wir eine weitere Funktion, die mir weiteren Inhalt an die Stelle meines Hook bringt und haken diesen Funktion example_function_2() ebenso ein, aber mit einer niedrigeren Priorität als die erste Funktion und damit wird sie nach der Funktion example_function() gehakt.
add_action('my_footer', 'example_function_2', 2);
Nicht selten können mit Hilfe dieser Möglichkeit sehr saubere Lösungen geschaffen werden und so ist es vielleicht für den einen oder anderen Leser nützlich. Gerade viele kleine Code-Schnipsel, die man im Footer ablegt, können so sauber in eine Funktion ausgelagert werden und je nach Bedarf einfacher deaktiviert werden. gesteuert wird damit alles über Hooks und in der functions.php oder gar einer Options-Seite zum Theme im Backend.
Diese Möglichkeit steht im übrigen in allen WordPress Versionen zur Verfügung, einschließlich der kommenden Version 2.8.
bueltge.de [by:ltge.de] wird von Frank Bültge geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.
Das Weblog wird angetrieben von WordPress und aktuell gibt es 980 Beiträge, 18722 Kommentare in 14 Kategorien und 464 Tags.
Das Blog wird liebevoll mit xHTML & CSS in Handarbeit gestaltet. Erstellt mit ♥ zum Befüllen und Erhalten.
Design und Code ist unter Copyright
© 2001 - 2012 bueltge.de [by:ltge.de]
12. Juni 2009 um 08:10
I'm your user for wordpress theme.
Thank you for share.
12. Juni 2009 um 10:02
So einfach und doch so effektiv. Im Hybrid Framework von Justin Tadlock bin ich das erste mal auf diese "eigenen Hooks" gestoßen, da waren es aber auch schon wieder so viele Verschachtelungen, dass ich davon mehr als irritiert war.
Das mit der Anwendung in Plugins ist eine gute Idee auf die ich nicht gekommen bin. Bisher habe ich immer andere Plugins direkt in dessen Zeilen für mich erweitert, mit einem Hook ist das natürlich sauberer, gerade wenn es dann zu einem Update kommt, ist das dann sicher schneller angepasst. Danke!
16. Juni 2009 um 10:32
Ja ich hatte das selbe mal vor einem halben Jahr probiert und war erstaunt, aber auch Glücklich, das die Hooks und Actions so funktionieren. So kann man Schnittstellen in seinen eigenen Plugins möglich machen.
13. Juli 2009 um 10:39
Kann mir jemand sagen welchen Hook ich verwenden muss, damit meine Funktion aufgerufen wird, sobald ein Future-Post online geht?
27. Juli 2009 um 07:44
Besten Dank für die Tipps!
25. Oktober 2010 um 18:27
Gute Sache das, aber wie kann ich es anstellen, Core-Dateien zu erweitern, ohne dort direkt in den Code einzugreifen bzw. bei einem WP-Update jedes Mal wieder neu rum fummeln zu müssen?
Konkretes Beispiel: Ich möchte die wp-login.php (ab ca. Zeile 280) so erweitern, dass keine Unterstriche im Benutzernamen bei einer Registrierung möglich sind. Der PHP-Code ist mir klar:
// Check the username
if ( $sanitized_user_login == '' ) {
$errors->add( 'empty_username', __( 'ERROR: Please enter a username.' ) );
} elseif ( ! validate_username( $user_login ) ) {
$errors->add( 'invalid_username', __( 'ERROR: This username is invalid because it uses illegal characters. Please enter a valid username.' ) );
$sanitized_user_login = '';
/* ######## Einfügung von Torsten Kelsch ######################## */
} elseif ( stristr($user_login, "_" ) ) /* Unterstriche verbieten */ {
$errors->add( 'invalid_username', __( 'ERROR: This username is invalid because it uses illegal characters. Please enter a valid username.' ) );
$sanitized_user_login = '';
/* ######## Ende der Einfügung von Torsten Kelsch ############### */
} elseif ( username_exists( $sanitized_user_login ) ) {
$errors->add( 'username_exists', __( 'ERROR: This username is already registered, please choose another one.' ) );
}
Aber wie kann ich die Veränderung der Core-Datei verhindern? Das verstehe ich noch nicht so ganz.
Bin für Tipps und Tricks dankbar.
Torsten
28. Oktober 2010 um 15:56
@Torsten: du kannst über den Hook
register_postdeine Eigene Prüfung mitgeben. Lege sie in eine Funktion, Parameter mitgeben und diese an der Stelle einhaken. Da es hier mehrere Parameter (3) gibt, musst du die Anzahl im Wert mitgeben.add_action( 'register_post', 'my_check', 10, 3 );