lek*_*eko 6 php wordpress add-filter
我正在查看我的functions.php并想知道为什么CODE A add_action在CODE B使用时会使用add_filter?
CODE A的主要目标是包括和排除特定类别.
CODE B的主要目标是排除特定类别.
使用add_actionCODE A
和add_filterCODE 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' );
Run Code Online (Sandbox Code Playgroud)
代码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');
Run Code Online (Sandbox Code Playgroud)
pre_get_posts是一个动作而不是一个过滤器。$query通过引用传递,这就是 CODE A 工作而不返回任何内容的原因。
代码 B 返回$query,但该代码再次有效,因为查询已通过引用传递。挂钩的返回值未分配给任何内容。
do_action_ref_array( 'pre_get_posts', array( &$this ) );
Run Code Online (Sandbox Code Playgroud)
add_action和add_filter用于不同的上下文,但代码是相同的(add_action是 的别名add_filter)。虽然发布的两组代码都可以工作,但正确的用法是add_action。