何时使用操作以及何时使用过滤器

时间:2012-11-24 作者:urok93

我试图了解在哪里使用过滤器以及在哪里使用操作。

假设我在插件中有一个查询,稍后附加模块可能会修改该查询以更改查询结果,从而修改参数。

这是这个概念的理想实现,还是我应该在这里使用操作?

//用于显示页面列表的函数

function get_page_list() {
    $pages_args = array(
        \'post_type\' => \'page\',
        \'posts_per_page\' => \'1\'
    );  
    $pages_query = new WP_Query( apply_filters( \'myfilter\', $pages_args ) );


    if( $pages_query->have_posts() ) {
        while ( $pages_query->have_posts() ) : $pages_query->the_post();  
            echo get_the_title();
        endwhile;
        // Reset Post Data
        wp_reset_postdata();
    } 


    else echo \'no results found\';                 

}
add_action( \'wp_footer\', \'get_page_list\', 1); 


function change_page_to_post( $pages_args ) {
    $pages_args = array(
        \'post_type\' => \'post\',
        \'posts_per_page\' => \'1\'
    );  
    return $pages_args;
}
add_filter(\'myfilter\', \'change_page_to_post\');

3 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

+其他两个答案的1,用于解释动作和过滤器之间的主要区别。

但是,要回答您的特定问题,请使用该问题修改查询:

正如您所猜测的,将自定义查询注入到模板中需要挂接到现有action. (无论是否wp_footer 操作是否正确/理想是另一回事,具体取决于您打算如何使用所述查询custom filter, 其他插件可以连接到

function get_page_list() {
    $pages_args = array(
        \'post_type\' => \'page\',
        \'posts_per_page\' => \'1\'
    );  
    $pages_query = new WP_Query( apply_filters( \'myfilter\', $pages_args ) );


    if( $pages_query->have_posts() ) {
        while ( $pages_query->have_posts() ) : $pages_query->the_post();  
            echo get_the_title();
        endwhile;
        // Reset Post Data
        wp_reset_postdata();
    } 


    else echo \'no results found\';                 

}
add_action( \'wp_footer\', \'get_page_list\', 1); 
如果希望此代码可扩展,则需要为其他人提供扩展它的方法。我建议通过以下方式使您的自定义查询参数可扩展:custom filter. e、 g.这:

$pages_args = array(
    \'post_type\' => \'page\',
    \'posts_per_page\' => \'1\'
);  
。。。很容易变成这样:

$pages_args = apply_filters( 
    \'custom_filter_name\', 
    array(
        \'post_type\' => \'page\',
        \'posts_per_page\' => \'1\'
    ) 
);  
这将允许其他插件修改您的查询参数。例如,如果插件想要返回两篇帖子,而不是一篇:

function wpse73840_modify_custom_filter_name( $args ) {
    // Modify posts_per_page
    $args[\'posts_per_page\'] = \'2\';
    // Return modified args
    return $args;
}
add_filter( \'custom_filter_name\', \'wpse73840_modify_custom_filter_name\' );
我想这就是你要问的。如果没有,请在评论中告诉我。

SO网友:Mridul Aggarwal

基本区别在于,过滤器旨在更改某些值&;行动是为了做一些工作。它们在代码中的工作方式几乎相同,但不同之处在于过滤器必须返回值,而操作则不返回值。

假设您的插件在数据库中创建了一个新页面。任务完成后,您想让其他人向新页面添加一些自定义字段。对于此任务,您需要发送操作。其他插件将连接到此&;仅在创建页面时添加字段

现在让我们假设您将向用户显示一些消息,但您希望其他插件可以自定义该消息。然后应用过滤器。其他挂接到过滤器的插件将更改此消息;把它还给你。现在,您将向用户显示新消息。不是你最初想要的。

因此,筛选器总是返回值,而忽略操作的返回值。

请注意,这不是编码方面的规则。您可以根据自己的喜好使用其中一种&;它不会抛出任何错误,但它们的命名方式不同&;wordpress打算如何实现这些目标(&P);强烈建议您遵循此模式。

SO网友:Oleg Butuzov

我的祝贺。你们完全理解这个话题。如果要更改传入内容,请进行筛选(这就是其筛选的原因)。如果你想做某事(这就是为什么它要行动)。

结束

相关推荐

Run shortcode before filters

我的用户在注释中发布代码片段。我为此创建了一个快捷码:function post_codigo($atts,$content=\"\"){ return \'<code>\'.$content.\'</code>\'; } add_shortcode(\'codigo\',\'post_codigo\'); 问题是html在打包到代码标记之前会被过滤掉。我想如果我能在过滤器之前运行短代码,那么我可以使用fun