在一个查询中获取所有类别的最新帖子

时间:2011-10-02 作者:pixeline

我的WP博客有12个类别,80个子类别。

我需要从这12个类别中的每一个类别中获取最新的帖子。

我知道如何使用12个get\\u posts()在12个查询中实现这一点,但有没有办法在一个查询中获得它们?

我试图让它像这样工作,但它获得了12多个帖子:

// Get array of categories (level-0 only).
    $cats= array();
    $categories=get_categories($args);
    foreach($categories as $category) { 
        if ($category->parent == 0) {
            $cats[]= $category->term_id ;
        }       
    }
    $categories= implode(\',\',$cats);
    // Fetch the latest post of each category

    global $wpdb;

    $querystr = "SELECT wposts.* 
    FROM $wpdb->posts wposts
        LEFT JOIN $wpdb->term_relationships ON (wposts.ID = $wpdb->term_relationships.object_id)
        LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
    WHERE $wpdb->term_taxonomy.taxonomy = \'category\'
        AND $wpdb->term_taxonomy.term_id IN($categories)
    ORDER BY wposts.post_date DESC";

    $pageposts = $wpdb->get_results($querystr, OBJECT);
然后循环:

global $post;
        foreach ($pageposts as $k=>$post):
            setup_postdata($post);
            // ... wp loop through your results


}

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

查询的数量并不是衡量性能的唯一标准,单个查询的成本可能超过许多简单查询的成本。

(小查询)x12的成本<;大查询x1+字符串/数组操作的成本

您最好执行12个单独的查询。如果代价高昂,请将结果存储在瞬态中,以便稍后保存处理。

但更好的是,您还可以使用save\\u post上的钩子来更新值,这样就不需要“搜索”,它变成了一个简单的检索存储值操作。这样,如果您存储它并通过get\\u选项检索它,则不会执行额外的查询,因为Wordpress已经加载了该值,并且不会进行不必要的SQL查询来再次检索它。

// in functions.php
function check_category_latest($post_id){
    // check the categories this post is assigned to
    // foreach category this is assigned to
        // if it\'s the latest in that category
            set_option(\'mytheme_cat_\'.$term_id,$post_id);
}
add_hook(\'save_post\',\'check_category_latest\');

// where you want to display your posts
$categories=get_categories($args);
foreach($categories as $category) {
    $post_id = get_option(\'mytheme_cat_\'.$category->term_id);
    // do post display stuff
}
沿着这些路线的东西会给你你想要的,它也会为所有的子类别提供,而且比12个单独的查询,甚至是1个大的昂贵查询要便宜得多

结束

相关推荐

当使用GET_CATEGORIES或类似工具时,是否也可以过滤包含某些标记的结果?

get_categories() 默认情况下,相关函数不会返回空类别-没有帖子的类别。我想,既然可能有一些底层代码检查帖子数量,那么是否可以额外过滤该列表,使其仅包括那些本身包含与特定标记相关联的帖子的类别?或者有没有一种简单的替代方法来获取这些信息?例如,如果我有一些贴子带有“audio”标签,我想用一种方法get_categories() (或类似结果),但仅检索包含带有“音频”标记的帖子的类别列表。我知道我可能必须直接使用标签ID。我只是在寻找“最好的”,或最合适的方式来做到这一点。谢谢