【问题标题】:WP Search page posts count conditional display based on post typeWP Search 页面帖子计数基于帖子类型的条件显示
【发布时间】:2020-09-05 16:56:31
【问题描述】:

我正在尝试根据帖子类型在搜索页面上实现帖子数量(帖子计数)的条件显示。

我正在寻找这样的东西:

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,并且您想限制总数或结果?还是您的搜索不受帖子类型的限制,您只想显示每种帖子类型的特定数量?
  • 嗨@FluffyKitten,我想在每个 CPT 上显示一个特定的数字
  • 好的,我明白了,谢谢!在这种情况下,你的方法是正确的,所以我们只需要找到错误:) 搜索发生在什么模板中?
  • 您可以在functions.php中将模板更改为自定义模板,或创建自定义模板。因此,当有人进行搜索时,他们如何选择要搜索的 CPT - 例如,他们是否可以选择按帖子类型进行过滤,这是否会添加到 WP_Query 中?默认搜索页面不适用于特定的帖子类型,因此我们需要了解如何将其添加到查询中,然后才能确定如何有条件地更改它。如果您可以向我们展示执行此操作的代码(例如,在搜索表单或搜索页面中),那将会有所帮助。

标签: php wordpress custom-wordpress-pages


【解决方案1】:

要根据查询 CPT 添加额外的条件查询参数,我们可以使用 pre_get_posts 挂钩来完成此操作,就像您正在做的那样。

检查查询是否针对 CPT

我们将创建一个自定义函数来挂钩此操作并检查$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 和不同的查询参数

由于您想为多个 CPT 执行此操作并为它们提供不同的参数(例如 posts_per_page),因此您必须在上面的代码中为每个 CPT 添加一个单独的 if

一种更灵活和可维护的方式是使用一个数组将每个 CPT 的所有查询参数信息保存在一个数组中。这意味着:

  • 我们可以简单地循环使用添加我们的查询参数 - 无需为每个 CPT 添加额外的 if 检查来检查
  • 我们可以根据需要为每个 CPT 添加尽可能多或尽可能少的查询参数(例如pages_per_postorder_by 等),每个 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;

    // 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 名称作为键。
  • 我们将使用另一个数组作为值,这将包含您要添加到此 CPT 的 $query 的所有参数,例如
    $CPT_args['qcm'] = array('posts_per_page'=> 1, 'orderby' => 'rand');

使用此数组将所有 args 信息保存在一个位置,并且可以轻松添加或删除更多 CPT 条件,而不会影响影响查询的主代码。


3.检查 $query 是否适用于任何 CPTS 通过循环遍历我们的数组并检查查询 post_type 与我们的 $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 );


【讨论】:

  • 如果我能给你买杯咖啡,我会的!
猜你喜欢
  • 2017-03-15
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
相关资源
最近更新 更多