it-swarm.com.de

Wo ist der beste Ort, um add_filter zu verwenden

Soll ich die Funktion add_filter im Aktions-Hook init meines Plugins oder nur im Haupt-Pluginskript verwenden?

Da ich manchmal fand, dass Leute überall Filter benutzen und wenn ich den Haken für init einsetze, wäre es für einige Fälle zu spät.

Gibt es allgemeine Hinweise zum Vorrang von action & filter hook, damit wir einen einheitlicheren Codestil haben können?

10
Yoga

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.

Aus Gründen der 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 der functions.php

Es gibt Ausnahmen für diese Regel:

  • Verkettete Rückrufe . In diesem Beispiel registriere ich eine Aktion für shutdown nur, wenn der erste Filter für wp_nav_menu_objects aufgerufen wurde. Daher kann der zweite Rückruf nicht gleichzeitig mit dem ersten registriert werden.
  • OOP-Stil. Manchmal müssen Sie Klassenmitglieder einrichten, bevor Sie die Rückrufe registrieren können. Mit 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 jetzt in die Aktion t5_theme_hooks_registered einhängen und die Registrierung aller vorherigen Hooks aufheben. Das erspart das Kämpfen mit Prioritäten und es steht mir frei, meine Rückrufprioritäten jederzeit zu ändern.

Verlassen Sie sich aber nicht nur auf die Quellcode-Reihenfolge. Dokumentieren Sie die von Ihnen verwendeten Hooks in Ihrem doc-Block. 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 sparen.

12
fuxia