先按分类排序自定义帖子,然后按meta_key排序

时间:2012-08-29 作者:Tobias

我创建了一个名为球员经理的自定义帖子类型,其中包含了一个足球队的所有球员。CPT有四个不同的类别——门将、后卫、中场和前锋。我还给了它一些文本字段,其中目前唯一重要的是“数字”。

以下是我希望它显示在存档页面中的方式:

Goalkeepers
-1
-21
-24
Defenders
-3
-4
-5
-11
所以,我想让这些帖子先按类别排序,然后在类别内按数字排序。我已经设法按类别或数字(现在按数字)对它们进行了排序:

$querystr = "
SELECT $wpdb->posts.*
FROM $wpdb->posts, $wpdb->postmeta
WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->posts.post_type = \'players\'
AND $wpdb->posts.post_status = \'publish\'
AND $wpdb->postmeta.meta_key = \'number\'
ORDER BY ABS ($wpdb->postmeta.meta_value) ASC
";
$pageposts = $wpdb->get_results($querystr, OBJECT);
但这不是我想要的。我想我可以做同样的循环4次,但类别不同。

1 个回复
SO网友:chrisguitarguy

因此,首先,我会使用get_posts 而不是编写自己的查询。

策略:一次获取所有帖子,然后使用回调或foreach 循环。下面是一个PHP 5.3+示例(匿名函数等)。

让我们将所有这些都封装在一个函数中,该函数将采用post类型、所需的术语以及它们所属的分类法。

<?php
function wpse63444_get_posts($post_type, $terms, $tax)
{

}
这样我们就可以拿到帖子了。

<?php
function wpse63444_get_posts($post_type, $terms, $tax)
{
    $posts = get_posts(array(
        \'post_type\'     => $post_type,
        \'meta_key\'      => \'number\', // the meta key
        \'order_by\'      => \'meta_value_num\',
        \'order\'         => \'ASC\', // might have to tweak the order a bit
        \'numberposts\'   => -1, // get ALL THE POSTS
        \'tax_query\'     => array(
            array(
                \'taxonomy\'          => $tax,
                \'field\'             => \'slug\',
                \'terms\'             => $terms,
                \'include_children\'  => false,
            ),
        ),
    ));

    if(!$posts)
        return array(); // bail if we didn\'t get any posts
}
现在我们已经有了所有的帖子,并且知道了术语,我们可以将它们过滤到一组术语=>帖子对中。

<?php
function wpse63444_get_posts($post_type, $terms, $tax)
{
    // snip snip

    $res = array();

    foreach($terms as $t)
    {
        // PHP < 5.3 will need something different here
        $res[$t] = array_filter($posts, function($p) use ($t, $tax) {
            if(has_term($t, $tax, $p))
                return $p; // the post has this term, use it
        });
    }

    return $res;
}
整个功能:

<?php
function wpse63444_get_posts($post_type, $terms, $tax)
{
    $posts = get_posts(array(
        \'post_type\'     => $post_type,
        \'meta_key\'      => \'number\', // the meta key
        \'order_by\'      => \'meta_value_num\',
        \'order\'         => \'ASC\', // might have to tweak the order a bit
        \'numberposts\'   => -1, // get ALL THE POSTS
        \'tax_query\'     => array(
            array(
                \'taxonomy\'          => $tax,
                \'field\'             => \'slug\',
                \'terms\'             => $terms,
                \'include_children\'  => false,
            ),
        ),
    ));

    if(!$posts)
        return array(); // bail if we didn\'t get any posts

    $res = array();

    foreach($terms as $t)
    {
        // PHP < 5.3 will need something different here
        $res[$t] = array_filter($posts, function($p) use ($t, $tax) {
            if(has_term($t, $tax, $p))
                return $p; // the post has this term, use it
        });
    }

    return $res;
}
中的一些普通帖子和类别的用法示例theme unit test 数据

<?php
$res = wpse63444_get_posts(\'post\', array(\'cat-a\', \'cat-b\', \'cat-c\'), \'category\');

if($res)
{
    foreach($res as $cat => $posts)
    {
        if(!$posts)
            continue;

        echo \'<h1>\', get_term_by(\'slug\', $cat, \'category\')->name, \'</h1>\';
        foreach($posts as $p)
            echo \'<h2>\', $p->post_title, \' \', get_post_meta($p->ID, \'number\', true), \'</h2>\';
    }
}
下面是封装在plugin

结束

相关推荐