Spielereien mit WordPress 4.7 – eigenes Event-System mit WP_Hook

WordPress 4.7 – Event-System
Kommentare

WordPress 4.7 steht in den Startlöchern. Daher lohnt es sich bereits jetzt, ein bisschen damit zu experimentieren. Zum Teil direkt im Code und zum Teil in Form von ein paar Gedankenexperimenten, weil viele Features (Stand heute) noch nicht fertig sind. Im letzten Teil geht es um ein eigenes Event-System mit WP_Hook.

Jeder Theme- und Plug-in-Autor kennt bestimmt add_filter und add_action. Über diese Funktionen hängen wir uns in den WordPress-Kern und können ihn (fast) nach Belieben verändern. Im Hintergrund wird das System nun um die Klasse WP_Hook bereichert. Es können weiterhin add_action und add_filter benutzt werden, die alle Arbeit schlichtweg an eine WP_Hook-Instanz delegieren.

Event-driven: das Event-System

Das Ganze lehnt an eine Event-driven-Architektur an: Irgendwo im Kern passiert etwas, das den Event save_post aktiviert und alle von uns eingehängten Funktionen darüber benachrichtigt. Auch eigene Aktionen und Filter können dort per do_action und apply_filter eingebracht werden. Hier ein Beispiel:

function mein_plugin_superhash( $text ) {
  $hash = sha1( str_rot13( strrev( $text ) ) );

  return apply_filter( 'superhash', $hash, $text );
}

Der Superduper-Hash kann hier über den Filter superhash von jedem anderen Plug-in noch kryptischer gestaltet werden. So werden eigene Filter geschaffen und vergleichbar per do_action in eigene Actions umgewandelt.

Dieser Artikel ist der erste von fünf in unserer WordPress-Themenwoche. In anderen Artikeln geht es um allgemeine Neuerungen & Proposals, Bulk Actions, Shortcodes und die Theme-Vererbung in WordPRess 4.7.

Interne Actions und Filter

Jetzt möchten wir allerdings eigene Actions und Filter haben, in die sich keiner reinhängen soll. Interne Hooks sozusagen, die nicht über die beiden Funktionen erreichbar sind. Das ist eine Sache der Konvention und mithilfe der WP_Hook-Klasse schnell gemacht:

$_my_own_events = array();

// Aufgabe hinzufügen
function _my_own_add_task( $tag, $callable ) {
  global $_my_own_events;

  if ( ! isset( $_my_own_events[ $tag ] ) ) {
    // noch nicht registriert => neu erstellen
    $_my_own_events[ $tag ] = new WP_Hook();
  }

  $_my_own_events[ $tag ]->add_filter( $tag, $callable, 10, 0 );
}

// Aufgabe ausführen
function _my_own_do( $tag, $args ) {
  global $_my_own_events;

  if ( ! isset( $_my_own_events[ $tag ] ) ) {
    // Gibt es nicht => zurücklehnen und nichts tun
    return false;
  }

  $_my_own_events[ $tag ]->do_action( $args );
}

Die beiden Funktionen _my_own_add_task und _my_own_do deuten mit dem führenden Unterstrich an, dass sie rein zur internen Verwendung gedacht sind. Für das eigene Plug-in ergibt sich dadurch ein Eventsystem, das völlig losgelöst von WordPress existieren kann:

$_my_own_events = array();

// Funktionen reinhängen
_my_own_add_task( 'cat', 'purr_function' );
_my_own_add_task( 'cat', 'eat_function' );

// Hook ausführen
_my_own_do( 'cat' );

WordPress Spezial

Entwickler Magazin Spezial Vol. 10: WordPress
Alles rund um WordPress im Entwickler Spezial Vol. 10 – ab 18.11.2016 im Handel.

Genau wie Filter und Actions, nur in einer ganz eigenen Welt. Eine solche Spielerei ist sauber getrennt als eigener Event Broker denkbar; alternativ kann auch einfach ein normaler Filter mit führendem Unterstrich über den normalen Weg angelegt werden. Auch für die zuvor genannten Techniken und Beispiele gibt es Verbesserungen oder andere Möglichkeiten, die rückwärtskompatibel sind. Das ist immer so, dafür waren es auch nur Spielereien.

Mir als Entwickler machen solche Gedankenexperimente einfach Spaß. Am Ende war es eine Reise quer durch einige Neuerungen, die mit WordPress 4.7 kommen. Jetzt hoffe ich nur, dass nicht zu viele davon wieder revidiert werden und viele weitere Features noch hinzukommen.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -