add_filter()
和add_action()
在加载任何插件之前可用。因此,您可以在插件或主题的第一行中使用这两个选项。
为了便于阅读,我建议在主文件的顶部分组操作和筛选注册:
在插件中,主题中带有插件头的文件functions.php
该规则也有例外:
- Chained callbacks. 在里面this example 我为注册操作
shutdown
仅当第一个过滤器wp_nav_menu_objects
已调用。因此,第二个回调不能与第一个回调同时注册very similar example …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
}
}
…我们看到该类的实例化可以被另一个插件停止,子类可以注册更多或不同的过滤器和操作。
除了分组之外,您还可以更进一步,提供自定义操作,使其他开发人员的自定义更容易
下面是我正在研究的主题的一个示例:
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\' );
最后一句话很重要:子主题或插件可以挂接到动作中
t5_theme_hooks_registered
现在,取消注册以前的任何挂钩。这样可以节省
struggling with priorities, 我可以随时更改我的回调优先级。
但不要仅依赖源代码顺序。记录您在doc块中使用的挂钩。我正在使用自定义标记wp-hook
为此。下面是一个来自同一主题的链式挂钩示例:
/**
* 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 );
}
您不必向上滚动查看这些函数的调用位置,只需查看doc块即可。这需要一些努力,因为你必须保持注册和评论的同步,但从长远来看,这会节省宝贵的时间。