2014-10-20 67 views
4

我正在查看我的functions.php并想知道为什么代码A使用add_action,而代码B使用add_filter
CODE A的主要目标是对都包含和排除特定类别。
CODE B的主要目标是排除特定类别。add_filter与add_action之间的区别

对于代码B,使用add_action代码A
add_filter是否正确?


代码:显示特定类别(称为 “特色”)的网页,而不是 “最近的帖子”

function featured_category($query) { 
    if ($query->is_home() && $query->is_main_query()) { 
    $query->set('category_name', 'featured'); 
    $query->set('category__not_in', array(60, 61)); 
    $query->set('posts_per_page', 5); 
    } 
} 
add_action('pre_get_posts', 'featured_category'); 



代码B:排除 “主办的岗位类别” 的搜索结果

功能search_filter($查询){

if ($query->is_search && $query->is_main_query()) { 
    $query->set('post_type', 'post'); 
    $query->set('category__not_in', array(60, 61)); 
    $query->set('posts_per_page', 20); 
    } 

    return $query; 
}  
add_filter('pre_get_posts', 'search_filter'); 

回答

1

pre_get_posts是一个动作,而不是一个过滤器。 $query通过引用传递,这就是为什么CODE A可以在不返回任何内容的情况下工作。

代码B返回$query但该代码再次工作,因为查询已通过引用传递。钩子的返回值没有分配给任何东西。

do_action_ref_array('pre_get_posts', array(&$this)); 

add_actionadd_filter在不同的上下文中使用,但该代码是相同的(add_actionadd_filter的别名)。虽然发布的这两套代码都可以正常使用,但它的作用是add_action

+0

谢谢,我将使用'add_action'。但只是好奇,就网站速度而言,这会加快网站速度,'add_action'或'add_filter'? ----另外,请注意我在上面使用了三个'$ query-> set' - 做了很多'$ query-> set'导致一个缓慢的网站? – leko 2014-10-20 17:14:44

+1

'add_action' vs'add_filter'对速度没有影响。执行完全相同的过程。你正在使用set方法。如果这些是你需要设置的选项,那么这就是你需要做的。你不能以某种方式将它们组合成一个电话。我不得不看看set方法,但是我看不出它对性能有任何影响(不包括当然最终运行的数据库查询)。 – 2014-10-20 17:38:46

相关问题