Eigenes Event-System mit WP_Hook erstellen

Jeder Theme- und Plugin-Autor kennt bestimmt add_filter und add_action. Über diese Funktionen hängen wir uns in den WordPress-Kern rein und können es (fast) nach belieben verändern. Im Hintergrund wird dieses System nun um die WP_Hook-Klasse bereichert. Zwar können weiterhin add_action und add_filter benutzt werden, jedoch leiten diese alle Arbeit schlichtweg an eine WP_Hook-Instanz weiter.

Event-Driven selbst machen

Das ganze lehnt sich an eine Event-Driven-Architecture 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 Plugin noch kryptischer gestaltet werden. So werden eigene Filter geschaffen und vergleichbar per „do_action“ eigene Actions.

Interne Actions und Filter mit WP_Hook

Jetzt möchten wir allerdings eigene Actions und Filter haben, in die sich keiner reinhängen soll. Interne Hooks sozusagen, welche 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 Plugin ergibt sich dadurch ein Event-System, welches völlig losgelöst von WordPress existieren kann:

$_my_own_events = array();

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

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

Genau wie Filter und Actions nur in einer ganz eigenen Welt.

Alles nur Spielerei

Eine solche Spielerei ist sauber getrennt von allen Filtern und Actions neben WordPress als eigener Event-Broker denkbar. Alternativ kann auch einfach ein 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 rückwärtskompatible Möglichkeiten.

Mir als Entwickler machen solche Gedankenexperimente einfach Spaß. Am Ende war es eine Reise quer durch ein paar der Neuerungen, welche mit WordPress 4.7 kommen werden. Jetzt hoffe ich nur, dass nicht zu viele davon wieder revidiert werden und viele weitere Features noch hinzukommen werden. Zudem wird noch ordentlich Aufgeräumt im Code und es sieht sogar so aus, als sei ein Autoloader für Klassen nicht mehr weit entfernt.

Die ersten Betas dürften mittlerweile schon zum Download bereit stehen. Viel Spaß beim Experimentieren!