查询自定义帖子类型并按自定义帖子类型排序

Posted

技术标签:

【中文标题】查询自定义帖子类型并按自定义帖子类型排序【英文标题】:Query Custom Post Types & Order By Custom Post Type 【发布时间】:2019-08-28 18:07:09 【问题描述】:

是否可以查询多个CPT,然后以预设的方式排序?

例如,我有 2 个 CPT 和 1 个作为 WP 默认“发布”,并且希望循环返回 6 个结果,排序如下。

CPT-1 CPT-2 发布 CPT-1 CPT-2 发布

在不拆分循环的情况下这可能吗?

我确实进行了快速搜索,但只能找到一篇与此相关的文章,其中的解决方案似乎不再有效......

Wordpress order posts by post type

【问题讨论】:

那么每个帖子类型应该总是有 2 个项目? 是的,正确... 【参考方案1】:

这是 Sephsekla 代码的缩短版本:

$my_post_types = array( 'CPT-1', 'CPT-2', 'post', 'CPT-1', 'CPT-2', 'post' );
$posts_shown = array();
$args = array(
    'post_type' => array( 'CPT-1', 'CPT-2', 'post' ),
    'post_status' => 'publish',
    'posts_per_page' => -1
);
$my_query = new WP_Query( $args );
foreach ( $my_post_types as $post_type ):
    while ( $my_query->have_posts() ): $my_query->the_post();
        if ( $post_type == get_post_type() && ! in_array( get_the_ID(), $posts_shown ) ) 
            echo '<pre>' . get_post_type() .': '. get_the_title() . '</pre>';
            $posts_shown[] = get_the_id();
            break;
        
    endwhile;
    $my_query->rewind_posts();
endforeach;
wp_reset_postdata();

【讨论】:

这明显比我的旧代码更优雅,也更简洁。一定要和这个一起去。 你将如何修改你的代码@vayu-robins 为每种帖子类型包含不同的模板文件? @revive 请查看developer.wordpress.org/reference/functions/get_template_part。您可以使用 get_post_typ() 以不同方式命名模板部分【参考方案2】:

这是我不久前做过的事情,虽然只需一个查询就可以做到,但设置起来有点冗长。

它的要点是,您可以使用一个查询,然后遍历查询,直到找到您所关注的第一个帖子。然后退出循环并使用WP_Query-&gt;rewind_posts() 将查询放回到开头。

然后您可以使用不同的条件运行第二个循环。然后是第三个。

对于第四个、第五个和第六个循环,您还需要检查您没有重复第一组。

请参阅下面的代码,了解其所有荣耀。


<?php

$my_query = new WP_Query(
    array(
        'post_status' => 'publish',
    )
);

$post_1 = $post_2 = $post_3 = $post_4 = $post_5 = $post_6 = 0;

if ( $my_query->have_posts() ) 
    /*First loop through posts*/
    while ( $my_query->have_posts() ) 
        $my_query->the_post();
        /**
         * Find the first post
        */

        if ( 'CPT-1' == get_post_type() && $post_1 == 0 ) 
            do_something_with_the_post();
            $post_1 = get_the_id();
            break;
        
    

    $my_query->rewind_posts();

    /*Second loop through posts*/
    while ( $my_query->have_posts() ) 
        $my_query->the_post();

        /**
         * Find the second post
        */
        if ( 'CPT-2' == get_post_type() && $post_2 == 0 ) 
            do_something_with_the_post();
            $post_2 = get_the_id();
            break;
        
    
    $my_query->rewind_posts();

    /*Third loop through posts*/
    while ( $my_query->have_posts() ) 
        $my_query->the_post();

        /**
         * Find the third post
        */
        if ( 'post' == get_post_type() && $post_3 == 0 ) 
            do_something_with_the_post();
            $post_3 = get_the_id();
            break;
        
    

    $my_query->rewind_posts();

    /**
     * Then we repeat this process but also check we don't use the same post twice
     */

    /*Fourth loop through posts*/
    while ( $my_query->have_posts() ) 
        $my_query->the_post();

        /**
         * Find the fourth post
        */
        if ( 'CPT-1' == get_post_type() && $post_4 == 0 && get_the_id() !== $post_1 ) 
            do_something_with_the_post();
            $post_1 = get_the_id();
            break;
        
    

    $my_query->rewind_posts();

    /*Fifth loop through posts*/
    while ( $my_query->have_posts() ) 
        $my_query->the_post();

        /**
         * Find the fifth post
        */

        if ( 'CPT-2' == get_post_type() && $post_5 == 0 && get_the_id() !== $post_2 ) 
            do_something_with_the_post();
            $post_5 = get_the_id();
            break;
        
    

    $my_query->rewind_posts();

    /*Sixth loop through posts*/
    while ( $my_query->have_posts() ) 
        $my_query->the_post();

        /**
         * Find the sixth post
        */
        if ( 'post' == get_post_type() && $post_6 == 0 && get_the_id() !== $post_3 ) 
            do_something_with_the_post();
            $post_6 = get_the_id();
            break;
        
    

    /**
     * And we're finished
     */


【讨论】:

没有多重时间循环就没有解决方案吗?【参考方案3】:

我正在尝试完成类似的事情,尽管 Vayu 的 code is super elegant,但它并不能满足我的需要 - 特别是我需要能够为每种帖子类型包含不同的模板部分(它们的内容略有不同)以及为 WP 帖子(不是 CPT)添加 $arg 以定位特定类别

我想要完成的是这个(只是上面带有 $args 的逻辑格式):

    $my_post_types = array( 'auctions', 'liquidations', 'inventory',  'post' );

    // set args for ALL posts
    $args = array(
        'post_type'     => $my_post_types,
        'orderby'       => 'date',
        'order'         => 'DESC',
        'post_status'   => 'publish',
    );
    
    Now we loop through posts (while loop)

    IF 'post_type == auctions' 
        add number_posts to $args from ACF field for this post type
        get_template_part( 'template-parts/card', 'auction' );  

    IF 'post_type == liquidations' 
        add number_posts to $args from ACF field for this post type
        get_template_part( 'template-parts/card', 'liquidations' );  

    IF 'post_type == inventory' 
        add number_posts to $args from ACF field for this post type
        get_template_part( 'template-parts/card', 'inventory' );  

    IF 'post_type == post' 
        add 'cat => 304' to $args 
        add number_posts to $args from ACF field for this post type
        and get_template_part( 'template-parts/card', 'studies' );  

目标是在一个页面上显示所有 CPT 和帖子,在管理员中为每种类型设置的数量,按日期排序。我需要为每个帖子类型循环更新/添加到 $args....

【讨论】:

以上是关于查询自定义帖子类型并按自定义帖子类型排序的主要内容,如果未能解决你的问题,请参考以下文章

按自定义日期范围输入过滤 wordpress 帖子

WordPress WP_Query:根据自定义元值显示自定义帖子类型,并按另一个自定义元值排序

按自定义字段过滤帖子 - url 正确更新但过滤不起作用

按自定义字段值订购wordpress帖子?

在 Wordpress 中,如何将自定义帖子类型的默认管理员排序顺序设置为自定义列?

Gatsby:在自定义帖子类型上使用 GraphQL 查询和自定义分类