为了账号安全,请及时绑定邮箱和手机立即绑定

WP搜索页面帖子计数根据帖子类型有条件显示

WP搜索页面帖子计数根据帖子类型有条件显示

PHP
梵蒂冈之花 2023-12-15 15:15:44
我正在尝试根据帖子类型在搜索页面上实现帖子数量(帖子计数)的条件显示。我正在寻找这样的东西: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'来指定帖子类型...我一直在四处寻找但无法找到答案...它 39;有点麻烦,因为它听起来像是一个基本功能...有什么想法吗?编辑 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 );};} );  
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

要根据查询 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 的所有查询参数信息保存在数组中。这意味着:


我们可以简单地循环遍历它以使用添加查询参数 - 无需添加额外的if检查每个要检查的 CPT

我们可以根据需要为每个 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 名称作为键。一个>

我们将使用另一个数组作为值,这将包含您想要添加到此 CPT $query 的所有参数,例如

    $CPT_args['qcm'] = array('posts_per_page'=> 1, 'orderby' => 'rand');

使用此数组可将所有参数信息保存在一个位置,并且可以轻松添加或删除更多 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。我们可以简单地查看我们的参数数组并将它们添加到 $query。


    foreach ($queryargs as $arg => $value )

        $query->set( $arg, $value );


查看完整回答
反对 回复 2023-12-15
  • 1 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信