WP查询组/按类别名称排序

时间:2013-02-02 作者:hdougie

我需要显示按类别分组的自定义帖子类型列表,但除此之外,每个自定义帖子都与一个元值链接(在本例中,假设我们有一个自定义元值“TEST1”)。

基本上,我的目标是显示一个列表,按类别为所有自定义帖子分组,代码为“TEST1”。我目前的做法是,只需将所有类别链接到我的自定义帖子类型(忽略空),然后循环遍历每个类别,以获取其中所有代码为“TEST1”的帖子。

现在这是伟大的,它的工作很好,但它是extremely 效率低下。目前这还不是一个问题,但我担心随着类别数量的增加,它的扩展性会越来越差,因为每次迭代都会导致另一次DB命中(并连接到post meta表)。

我已经在网络上仔细查看了一下,但我找不到任何东西,但我想知道是否可以执行一个WP\\u查询调用,该调用将返回所有按类别名称分组或排序的自定义元值为“TEST1”的帖子?这将是一个更有效的(基本上1分贝击中我会假设)。如果有人能在这里提出任何建议,我将不胜感激,如果不可能的话,那么我认为实现这一点的唯一方法是从我的插件中直接查询数据库(根据我所读的内容,在使用插件时不建议这样做)。

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

有几种方法可以做到这一点。

最简单的方法就是获取所有内容:帖子和术语,然后使用一些array_filter 将事物分组的魔法。简单示例(仅适用于PHP 5.3以上版本):

<?php
$terms = get_terms(\'your_taxonomy\');

$term_ids = array_map(function($t) {
    return $t->term_id,
}, $terms);

$posts = get_posts(array(
    \'nopaging\'      => true,
    \'tax_query\'     => array(
        array(
            \'taxonomy\'  => \'category\',
            \'field\'     => \'id\',
            \'terms\'     => $term_ids,
        ),
    ),
    \'meta_query\'    => array(
        array(
            \'key\'       => \'TEST1\',
            \'compare\'   => \'EXISTS\', // wp 3.5+ only
        )
    ),
));

foreach ($terms as $t) {
    $posts_in_term = array_filter($posts, function($p) use ($t) {
        // has_term likely triggers a DB hit...
        return has_term($t->term_id, \'your_taxonomy\', $p);
    });

    // do stuff with $posts_in_term 
}
这很容易理解。您将大量的订购工作发送到DB,并在PHP应用程序中完成。不错,DB点击率肯定比以前少了。如果你需要在每个类别名称上加一个标题,这可能是一条可行之路,因为使用下一种方法将非常困难。

选项2:执行get_posts 正常查询,但挂接到posts_groupby 和order by term ID。您需要进行一些挖掘,以找出要在中排序的表别名/名称WP_Tax_Query 类,该类根据给定集中的分类查询数创建表别名。因为我们只有一个,所以没有allias,您只需要添加$wpdb->term_relationships.object_id 发送给组。最终的结果是GROUP BY $wpdb->posts.ID, $wpdb->term_relationships.object_id.

示例:

<?php
// our group by callback
function wpse84243_groupby($groupby, $query) {
    global $wpdb;

    return $groupby . \' \' . $wpdb->term_relationships . \'.object_id\';
}

add_filter(\'posts_groupby\', \'wpse84243_groupby\', 10, 2);
$posts = get_posts(array(
    \'nopaging\'      => true,
    \'tax_query\'     => array(
        array(
            \'taxonomy\'  => \'category\',
            \'field\'     => \'id\',
            \'terms\'     => get_terms(\'category\', array(\'fields\' => \'ids\')),
        ),
    ),
    \'meta_query\'    => array(
        array(
            \'key\'       => \'TEST1\',
            \'compare\'   => \'EXISTS\', // wp 3.5+ only
        )
    ),
));

// remove the filter, put things back to normal
remove_filter(\'posts_groupby\', \'wpse84243_groupby\', 10, 2);

// do stuff with $posts, they\'ll be grouped by your taxonomy ID.

结束

相关推荐

Sort post's categories by ID

我有一个博客,其中几个帖子的类别必须先输出,然后再输出其他类别。与其他类别相比,这些类别的ID较低。我正在使用get_the_category_list 但它并没有像我预期的那样工作。这让我很困惑,因为我记得有一个主题做得很好。有人能给我指出正确的方向吗?谢谢<?php get_the_category_list( array( \'orderby\' => \'ID\', \'order\' => \'ASC\' ) ); ?>&