哪里是使用add_filter的最佳位置


12

我应该add_filter在插件的init动作挂钩中还是在主插件脚本中使用函数?

由于有时我发现人们到处都在使用过滤器,因此如果init挂上钩子,在某些情况下为时已晚。

是否有关于actionfilter挂钩优先级的一般建议,以便我们可以使用更一致的代码样式?

Answers:


15

add_filter()并且add_action()在加载任何插件之前可用。因此,您可以在插件或主题的第一行中同时使用它们。

为了便于阅读,我建议将操作和过滤注册分组到主文件的最顶部:

  • 在插件中,带有插件头的文件
  • 在一个主题 functions.php

该规则有例外:

  • 链接的回调。在此示例中,shutdown仅在第一个过滤器wp_nav_menu_objects被调用时才注册一个动作。因此,第二个回调不能与第一个回调同时注册。
  • OOP风格。有时您必须先设置类成员,然后才能注册回调。用一个非常相似的例子 ……

    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并取消注册以前的任何挂钩。这样可以节省优先级的麻烦,并且我可以随时更改自己的回调优先级。

但是不要仅仅依靠源代码顺序。在文档块中记录正在使用的钩子。我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块即可。这需要付出一些努力,因为您必须使注册和评论保持同步,但从长远来看,这样可以节省宝贵的时间。


2
+1。对于“ OOP样式”,我的首选是将控制权交给类/对象,然后在其构造函数中注册操作/过滤器(或以后酌情注册)。它提供了更好的(OOP!)封装,并推迟了钩子的注册,直到使用/实例化类为止。
webaware
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.