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?
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:
functions.php
Es gibt Ausnahmen für diese Regel:
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.