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
shutdown
nur, wenn der erste Filter für wp_nav_menu_objects
aufgerufen 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_registered
jetzt 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.