add_filter与add_action之间的区别

问题描述 投票:6回答:1

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

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

代码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个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.