toscho.design

WordPress: Priorität eines Hooks ermitteln

Die WordPress-Plugin-API funktioniert im Groben so: Ein Schnipsel Code registriert eine Aktion oder einen Filter mit einer bestimmten Priorität (Standard: 10). Anderer Code kann diese Aktion oder diesen Filter dann wieder entfernen.
Beispiel:

remove_filter( 'the_content', 'wptexturize', 10 );

Das Problem: Das Entfernen funktioniert nicht, wenn man die exakte Priorität nicht kennt.

Wollen wir den Hook eines fremden Plugins entfernen, so wechselt dieses Plugin vielleicht nach einem Update die Priorität. Wir müssen das automatisieren, wenn wir nicht immer wieder fremden Code lesen wollen. Dafür gibt es in WordPress leider keine Funktion; also basteln wir uns eine eigene:

if ( ! function_exists( 'get_hook_priorities' ) )
{
    /**
     * Find all priorities for a given function to filter relation.
     *
     * @param  string $filter The filter to search for.
     * @param  string $function
     * @return array
     */
    function get_hook_priorities( $filter, $function )
    {
        $priorities = array ();
        foreach ( $GLOBALS['wp_filter'][$filter] as $priority => $data )
        {
            // Catch OOP filters.
            $find = _wp_filter_build_unique_id( $filter, $function, $priority );
            isset ( $data[ $find ] ) && $priorities[] = $priority;
        }
        return $priorities;
    }
}

Die Funktion berücksichtigt, daß ein Filter oder eine Aktion mehrmals mit unterschiedlichen Prioritäten registriert werden kann. Zum Entfernen laufen wir also durch den Array des zurückgegebenen Wertes:

$priorities = get_hook_priorities( 'the_content', 'wptexturize' );
foreach ( $priorities as $priority )
{
    remove_filter( 'the_content', 'wptexturize', $priority );
}