从5种不同的自定义帖子类型中分别检索3篇最新帖子

时间:2014-04-24 作者:тнє Sufi

我有5种不同的自定义帖子类型。我使用以下查询在我的主页上显示他们的15篇最新帖子:

$query = new WP_Query( array (
             \'posts_per_page\'   => 15,
             \'post_type\' => array ( \'cpt1\', \'cpt2\', \'cpt3\', \'cpt4\', \'cpt5\' ) 
          )
 );
它运行良好,显示了这5种自定义帖子类型中最新的15篇帖子。但问题是,上的更新太多cpt1cpt3 (每个职位类型每天大约8-10个职位)。所以在主页上,我很少找到来自cpt2/4/5.

因此,我想使用日期作为排序依据(排序)显示每种帖子类型的最新3篇帖子(总共15篇帖子)。因此,每个职位类型中的3个职位都将可见,并根据所有5个职位类型中的日期进行排序。但我找不到任何好的解决办法。

到目前为止,我想到的是,运行5个查询并将它们保存到一个数组中,然后对它们进行排序。

我是否可以只使用一个查询而不是5个查询来执行此操作?

2 个回复
最合适的回答,由SO网友:тнє Sufi 整理而成

我不确定这是否是最有效的选择,但我已经通过以下方式做到了:

我使用get_posts 并将它们存储在一个数组中,因为数组是多维的,所以我必须将其展平。然后使用usort 使用post_date 要获取最新帖子,我已使用Transient API, 最小化数据库调用以下是代码:

function delete_front_page_query_results() {
    delete_transient(\'post_data\');

    $query_cpt1 = array (
            \'posts_per_page\'   => 3,
            \'post_type\' => \'cpt1\'
            );
    $query_cpt2 = array (
            \'posts_per_page\'   => 3,
            \'post_type\' => \'cpt2\'
            );
    $query_cpt3 = array (
            \'posts_per_page\'   => 3,
            \'post_type\' => \'cpt3\'
            );
    $query_cpt4 = array (
            \'posts_per_page\'   => 3,
            \'post_type\' => \'cpt4\'
            );
    $query_cpt5 = array (
            \'posts_per_page\'   => 3,
            \'post_type\' => \'cpt5\'
            );

    $query_results[] = get_posts($query_cpt1);
    $query_results[] = get_posts($query_cpt2);
    $query_results[] = get_posts($query_cpt3);
    $query_results[] = get_posts($query_cpt4);
    $query_results[] = get_posts($query_cpt5);

    //flattening three dimentional array to two dimensonal array
    $flatten_array =array();
    foreach ($query_results as $data) {
            foreach($data as $flatten_data) {
                 $flatten_array[] = $flatten_data;
            }
    }

    function cpt_array_sort($a, $b) {
            return strtotime($b->post_date) - strtotime($a->post_date);
    }
    usort($flatten_array, \'cpt_array_sort\');

    //setting transient with the array
    set_transient ( \'post_data\', $flatten_array, 365*24*60*60);
}
add_action(\'publish_post\', \'delete_front_page_query_results);

SO网友:Tyler Carter

在单个查询中无法做到这一点。您必须将其分为多个查询,因为SQL命令不是为处理这种类型的处理而构建的,因此WordPress的查询API也是如此。

结束

相关推荐

Count post views in loop

我正在尝试显示博客页面上每个帖子的帖子视图(所以在循环中)。我在函数中使用以下代码进行了尝试。php: // function to count views. function setAndViewPostViews($postID) { $count_key = \'views\'; $count = get_post_meta($postID, $count_key, true); if($count==\'\'){ $