Wo kann man add_filter am besten verwenden?

12

Soll ich die Funktion add_filterim initAction-Hook meines Plugins oder nur im Haupt-Plugin-Skript verwenden?

Da ich manchmal festgestellt habe, dass überall Filter verwendet werden, und wenn ich den initHaken einsetze, wäre es für einige Fälle zu spät.

Gibt es allgemeine Hinweise zur Priorität von action& filterhook, damit wir einen konsistenteren Codestil haben können?

Yoga
quelle

Antworten:

15

add_filter()und add_action()sind verfügbar, bevor ein Plugin geladen wird. Sie können also beide in der ersten Zeile Ihres Plugins oder Themas verwenden.

Zur besseren Lesbarkeit empfehle ich, Aktionen zu gruppieren und Registrierungen ganz oben in Ihrer Hauptdatei zu filtern:

  • in einem Plugin die Datei mit dem Plugin-Header
  • in einem Thema die functions.php

Es gibt Ausnahmen für diese Regel:

  • Verkettete Rückrufe . In diesem Beispiel registriere ich eine Aktion shutdownnur, wenn der erste Filter für wp_nav_menu_objectsaufgerufen wurde. Der zweite Rückruf kann also nicht gleichzeitig mit dem ersten registriert werden.
  • OOP-Stil. Manchmal müssen Sie Klassenmitglieder einrichten, bevor Sie die Rückrufe registrieren können. An einem sehr ähnlichen Beispiel

    add_action(
        'plugins_loaded',
        array ( T5_Plugin_Class_Demo::get_instance(), 'plugin_setup' )
    );
    class T5_Plugin_Class_Demo
    {
        public function plugin_setup()
        {
            $this->plugin_url    = plugins_url( '/', __FILE__ );
            $this->plugin_path   = plugin_dir_path( __FILE__ );
            $this->load_language( 'plugin_unique_name' );
    
            // more stuff: register actions and filters
        }
    }

    … Wir sehen, dass die Instanziierung der Klasse durch ein anderes Plugin gestoppt werden kann und eine untergeordnete Klasse mehr oder andere Filter und Aktionen registrieren kann.

Zusätzlich zur Gruppierung können Sie noch einen Schritt weiter gehen und eine benutzerdefinierte Aktion anbieten, um Anpassungen für andere Entwickler zu vereinfachen.
Hier ist ein Beispiel aus einem Thema, an dem ich arbeite:

add_action( 'activate_header',      't5_activate_screen' );
// wp_loaded is too late, WP customizer would not detect the features then.
add_action( 'after_setup_theme',    't5_setup_custom_background' );
add_action( 'after_setup_theme',    't5_setup_custom_header' );
add_filter( 'body_class',           't5_enhance_body_class' );
add_action( 'comment_form_before',  't5_enqueue_comment_reply' );
add_action( 'content_before',       't5_frontpage_widget' );
add_action( 'footer_before',        't5_loop_navigation' );
add_action( 'get_the_excerpt',      't5_excerpt_clean_up', 1 );
add_action( 'header_before',        't5_skiplink', 0, 0 );
add_filter( 'the_title',            't5_fill_empty_title', 20, 1 );
add_action( 'wp_enqueue_scripts',   't5_enqueue_style' );
add_action( 'wp_enqueue_scripts',   't5_enqueue_script' );
add_action( 'wp_loaded',            't5_setup' );
add_action( 'wp_loaded',            't5_page_enhancements' );
add_action( 'wp_loaded',            't5_post_format_support' );
add_action( 'wp_loaded',            't5_load_theme_language' );
add_action( 'wp_loaded',            't5_setup_sidebars' );
add_filter( 'wp_nav_menu_items',    't5_customize_top_menu', 10, 2 );
add_filter( 'wp_nav_menu_args',     't5_nav_menu_args', 10, 1 );
add_filter( 'wp_title',             't5_wp_title_filter', 20, 2 );

add_shortcode( 'gallery',    't5_shortcode_gallery' );
add_shortcode( 'wp_caption', 't5_shortcode_img_caption' );
add_shortcode( 'caption',    't5_shortcode_img_caption' );

// Use this action to unregister theme actions and filters.
do_action( 't5_theme_hooks_registered' );

Die letzte Zeile ist wichtig: Ein untergeordnetes Thema oder ein Plugin kann sich t5_theme_hooks_registeredjetzt in die Aktion einbinden und die Registrierung aller vorherigen Hooks aufheben. Das erspart Ihnen das Kämpfen mit Prioritäten , und ich kann meine Rückrufprioritäten jederzeit ändern .

Verlassen Sie sich jedoch nicht nur auf die Reihenfolge des Quellcodes. Dokumentieren Sie die Hooks, die Sie in Ihrem Dokumentblock verwenden. Ich verwende dafür ein benutzerdefiniertes Tag wp-hook. Hier ist ein Beispiel mit verketteten Haken aus demselben Thema:

/**
 * Register handler for auto-generated excerpt.
 *
 * @wp-hook get_the_excerpt
 * @param   string $excerpt
 * @return  string
 */
function t5_excerpt_clean_up( $excerpt )
{
    if ( ! empty ( $excerpt ) )
        return $excerpt;

    add_filter( 'the_content', 't5_excerpt_content' );

    return $excerpt;
}
/**
 * Strip parts from auto-generated excerpt.
 *
 * @wp-hook the_content
 * @param   string $content
 * @return  string
 */
function t5_excerpt_content( $content )
{
    remove_filter( current_filter(), __FUNCTION__ );

    return preg_replace( '~<(pre|table).*</\1>~ms', '', $content );
}

Sie müssen nicht nach oben scrollen, um zu sehen, wo diese Funktionen aufgerufen werden. Ein Blick auf den Dokumentblock reicht aus. Dies erfordert einige Anstrengungen, da Sie sowohl die Registrierung als auch den Kommentar synchron halten müssen, aber auf lange Sicht wertvolle Zeit spart.

Fuxia
quelle
2
+1. Für "OOP-Stil" ist es meine Präferenz, die Steuerung an die Klasse / das Objekt zu übergeben, die dann Aktionen / Filter in ihrem Konstruktor registriert (oder gegebenenfalls später). Es bietet eine bessere (OOP!) Kapselung und verschiebt die Registrierung von Hooks, bis die Klasse verwendet / instanziiert wird.
webaware