【问题标题】:Difference between add_filter versus add_actionadd_filter 与 add_action 之间的区别
【发布时间】:2014-10-20 03:12:01
【问题描述】:

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

add_action用于CODE A是否正确
add_filter 代码B?



代码 A:显示主页的特定类别(称为“精选”),而不是“最新帖子”

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:在搜索结果中排除“赞助帖子类别”

function search_filter($query) {

    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');

【问题讨论】:

    标签: php wordpress add-filter


    【解决方案1】:

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

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

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

    add_actionadd_filter 用于不同的上下文,但代码相同(add_actionadd_filter 的别名)。虽然发布的两组代码都可以正常工作,但正确的用法是add_action

    【讨论】:

    • 谢谢,我会用add_action。但只是好奇,就网站速度而言,哪个会更快地加载网站,add_actionadd_filter ? ---- 另外,请注意我在上面使用了三个$query->set - 这么多$query->set 会导致网站速度变慢吗?
    • add_action vs add_filter 对速度没有影响。正在执行完全相同的过程。您正在使用 set 方法。如果这些是您需要设置的选项,那么这就是您需要做的。你不能以某种方式将它们组合成一个电话。我必须查看 set 方法才能确定,但​​我看不出它对性能有任何影响(当然不包括最终运行的数据库查询)。
    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2014-10-30
    • 2021-12-07
    • 2016-02-09
    相关资源
    最近更新 更多