[英]WP Search page posts count conditional display based on post type
我正在尝试根据帖子类型在搜索页面上实现帖子数量(帖子计数)的条件显示。
我正在寻找这样的东西:
add_action( 'pre_get_posts', function ( $query ) {
if( ! is_admin() && $query->is_search() && $query->is_main_query() && is_post_type == 'MY_POST_TYPE' ) {
$query->set( 'posts_per_page', 1 );
};
} );
我可以在哪里使用is_post_type == 'MY_POST_TYPE'
来指定帖子类型......我一直在环顾四周,但无法找到答案......这有点令人不安,因为它听起来像是一个基本功能......有任何想法吗 ?
编辑 1:像这样的东西,根据帖子类型显示不同数量的帖子
add_action( 'pre_get_posts', function ( $query ) {
if( ! is_admin() && $query->is_search() && $query->is_main_query() && is_post_type == 'MY_POST_TYPE_1' ) {
$query->set( 'posts_per_page', 1 );
} elseif ( ! is_admin() && $query->is_search() && $query->is_main_query() && is_post_type == 'MY_POST_TYPE_2' ) {
$query->set( 'posts_per_page', 10 );
};
} );
要根据查询 CPT 添加额外的条件查询参数,我们可以使用pre_get_posts
钩子来做到这pre_get_posts
,就像你正在做的那样。
我们将创建一个自定义函数,该函数将挂接到此操作并检查$query
包含 CPT,如果包含则添加额外的参数。 正如您所提出的,这将起作用:
add_action( 'pre_get_posts', 'add_cpt_query_args');
function add_cpt_query_args( $query ) {
// If this isn't the main search query on the site, then do nothing.
if( is_admin() || !$query->is_search() || !$query->is_main_query() )
return;
// Check if the query is for any of our CPTs
if (in_array ( $query->get( post_type'), array('YOUR_CPT_SLUG', 'ANOTHER_CPT') ) ){
// set the args for this CPT
$query->set( 'posts_per_page', 1 );
$query->set( 'orderby', 'rand' );
}
}
由于您想为多个 CPT 执行此操作并为它们提供不同的参数(例如posts_per_page
),您必须为上面代码中的每个添加单独的if
。
一种更灵活和可维护的方法是使用数组将每个 CPT 的所有查询参数信息保存在一个数组中。 这意味着:
if
检查每个 CPT 来检查pages_per_post
、 order_by
等),每个 CPT 可以有不同的 args,并且不必将它们硬编码到代码中,或者手动检查我们是否有对他们的价值。我们可以用这段代码做到这一点——下面有一个关于它是如何工作的完整解释(注意——这是未经测试的,但基本逻辑就在那里!):
add_action( 'pre_get_posts', 'add_cpt_query_args');
function add_cpt_query_args( $query ) {
// If this isn't the main search query on the site, then do nothing.
if( is_admin() || !$query->is_search() || !$query->is_main_query() )
return;
// As you want to do this for multiple CPTS, a handy way to do this is set up all the info in an array
$CPT_args['qcm'] = array('posts_per_page'=> 1, 'orderby' => 'rand');
$CPT_args['anotherCPT'] = array('posts_per_page'=> 5, 'orderby' => 'date', 'order => 'ASC'');
// Now check each CPT in our array to see if this query is for it
foreach ($CPT_args as $cpt => $query_args ){
if (in_array ( $query->get( post_type'), array($cpt) ) ){
// this query is for a CPT in our array, so add our query args to the query
foreach ($query_args as $arg => $value )
$query->set( $arg, $value );
}
}
}
1. 检查这是否是主站点上的主要搜索查询- 如果不是(并且我们没有其他条件),最简洁的方法是在此时简单地结束该功能,那么我们不会试图保留if
里面有很多代码
if( is_admin() || !$query->is_search() || !$query->is_main_query() )
return;
2. 在一个数组中设置你的 CPT 参数- 因为你想为多个 CPT 这样做,最简单的方法是将所有信息存储在一个数组中,我们可以在一个循环中简单地使用它们。
$CPT_args
的数组,并为我们要检查的每个 CPT 添加一个条目,并以 CPT 名称作为关键字。$query
所有参数,例如 $CPT_args['qcm'] = array('posts_per_page'=> 1, 'orderby' => 'rand');
使用这个数组可以将所有 args 信息放在一个地方,并且可以轻松添加或删除更多 CPT 条件,而不会影响影响查询的主要代码。
3.通过循环遍历我们的数组并根据$CPT_args
数组中的键检查查询post_type
,检查$query
是否用于任何$CPT_args
:
foreach ($CPT_args as $cpt => $query_args ){
if (in_array ( $query->get( post_type'), array($cpt) ) ){
...
}
}
4.如果此查询是针对该 CPT ,则将 CPT 的查询参数添加到$query
。 我们可以简单地查看我们的 args 数组并将它们添加到$query
。
foreach ($queryargs as $arg => $value )
$query->set( $arg, $value );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.