哪里是使用Add_Filter的最佳位置

时间:2013-01-12 作者:Yoga

我应该使用该功能吗add_filter 在我的插件中init 动作挂钩还是仅仅是主插件脚本中的?

因为有时我发现人们到处都在使用过滤器init 胡克,对某些情况来说太晚了。

关于优先顺序有什么一般性建议吗action &;filter 这样我们就可以有一个更一致的代码风格?

1 个回复
最合适的回答,由SO网友:fuxia 整理而成

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块即可。这需要一些努力,因为你必须保持注册和评论的同步,但从长远来看,这会节省宝贵的时间。

结束

相关推荐

plugins_url vs plugin_dir_url

我看到WordPress插件在为一些文件夹创建常量时使用plugins\\u url或plugin\\u dir\\u url。一个比另一个好吗?示例:define( \'MEMBERS_URI\', trailingslashit( plugin_dir_url( __FILE__ ) ) ); define( \'WPACCESS_INC\', plugins_url( \'inc\', __FILE__ ) , true );