在操作初始化中添加筛选器

时间:2017-05-04 作者:jcarlosweb

你好,在init 操作,我想向一个相当大的函数添加一个过滤器,以修改$vars 数组,例如Wordpress post ID。

也就是说:

    add_action( \'init\',function(){
        //code
    
        add_filter( \'query_vars\',function($vars){
            $vars[] = array(\'ID\' => $myid);
             return $vars;
    
        });
    });
这可能吗?

编辑:我正在对页面进行A/B/C测试,并使用相同的url显示另一个ID的页面(即编辑当前帖子的ID以显示另一篇帖子的完整内容)。

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

要在运行查询之前更改页面ID,请钩住request 滤器

如果你用的是很好的permalinks,pagename 将设置,您可以覆盖pagename 使用另一个页面段塞:

function wpd_265903_request( $request ) {
    if( isset( $request[\'pagename\'] ) ){ // any page
        $request[\'pagename\'] = \'some-other-slug\';
    }
    return $request;
}
add_filter(\'request\', \'wpd_265903_request\');
或者您可以取消设置pagename并设置page_id:

function wpd_265903_request( $request ) {
    if( isset( $request[\'pagename\'] ) ){
        unset( $request[\'pagename\'] );
        $request[\'page_id\'] = 106;
    }
    return $request;
}
add_filter( \'request\', \'wpd_265903_request\' );

SO网友:Nathan Johnson

是的,这样做是可能的。事实上,如果您想删除操作/过滤器,那么几乎肯定需要使用一个钩子来删除它。

例如,插件在主题之前加载。所以如果一个主题在init 从函数挂钩。php文件如下:

add_action( \'init\', \'wpse_265903_init\' );
在主题设置完成之前,插件无法删除该操作:

add_action( \'after_setup_theme\', function() {
  remove_action( \'init\', \'wpse_265903_init\' );
} );
类似地,如果希望某些挂钩仅在admin_init hook,然后你可以这样做:

add_action( \'admin_init\', function() {
  add_action( \'the_post\', function() {
    do_something();
  } );
} );
Theinit 不过,钩子会在每个请求上激发,所以我不确定从特定钩子添加钩子的目的。

相关推荐

为内置钩子调用do_action和Apply_Filters是否安全?

我正在开发一个插件,它需要复制一些内置的WordPress逻辑。(此逻辑不能用任何内置方法调用,也不能独立连接到。)在这个动作序列中,WordPress的正常行为是调用动作挂钩(do_action(\'wp_login\', ...)) 和过滤器挂钩(apply_filters(\'login_redirect\', ...)).如果在对应于在Core中调用它们的时间点调用它们,那么直接从我的插件调用这些内置钩子是否安全(并且是可以接受的做法)?或者,其他与此相关的开发人员期望在非常特定的时间执行操作的风