Sidebar
ein-/ausblenden

WordPress Hooks definieren und nutzen

Plugin für WordPress SEO

Anzeige

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.

7 Kommentare zu „WordPress Hooks definieren und nutzen“

  1. 1
    Kommentar von Streaker blog

    I'm your user for wordpress theme.
    Thank you for share.

  2. 2
    Kommentar von Steffen

    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!

  3. 3
    Kommentar von Ralf Hortt

    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.

  4. 4
    Kommentar von Andreas

    Kann mir jemand sagen welchen Hook ich verwenden muss, damit meine Funktion aufgerufen wird, sobald ein Future-Post online geht?

  5. 5
    Kommentar von Susanne

    Besten Dank für die Tipps!

  6. 6
    Kommentar von Torsten

    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

  7. 7
    Kommentar von Frank Bültge

    @Torsten: du kannst über den Hook register_post deine 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 );

Kommentare sind geschlossen.