按元价值排序,先按专业,然后按免费

时间:2014-10-13 作者:itcgpit mark

query_posts($query_string . \'&meta_value=pro&orderby=rand\');
我随机得到专业列表,但我想要pro 以及免费,但pro 首先列出,然后meta_value free 列表

我还设置orderby meta_value

    query_posts($query_string . \'&orderby=meta_value_num\');
这不起作用,在查询字符串中默认为cat. 这需要orderby date 两者都有meta value = profree.

有什么建议吗?

2 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

在我开火之前,只要一个音符,NEVER (我的重点)利用query_posts 创建自定义查询的步骤

Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。

而是利用WP_Queryget_posts 创建自定义查询,但ONLY 如果无法使用修改主查询pre_get_posts. 有关更多信息,请查看this post

假设您的meta_key请注意:出于测试目的,我使用了自己的元密钥,您应该用自己的元密钥替换它),即profree, 您可以检索具有此特定meta_key. 您的查询将如下所示:

$args = [
    \'meta_key\'          => \'packages\',
    \'orderby\'           => \'rand\',
    \'posts_per_page\'    => 5,
];

$the_query = new WP_Query( $args );
但是,如果您的值多于这两个值,则需要调整查询以包括meta_value 然后利用meta_compare 参数调整后的查询将变成:

$args = [
    \'meta_key\'          => \'packages\',
    \'meta_value\'        => \'free, pro\',
    \'orderby\'           => \'rand\',
    \'meta_compare\'      => \'IN\',
    \'posts_per_page\'    => 5,
];
PS!在我继续之前,你应该注意orderby 参数在版本4.0中已更改,但这在该实例中不起作用

很好,您现在将有5篇随机检索的帖子meta_value 属于profree

现在我们需要对它们进行分类。最好的解决方案是利用usort 在中对返回的帖子数组进行排序$the_query->posts 根据岗位价值meta_value. 然后需要取消设置$the_query->posts 然后用重新排序的post数组重置它。

以下是完整的代码:

<?php
$args = [
    \'meta_key\'          => \'packages\',
    \'meta_value\'        => \'free, pro\',
    \'orderby\'           => \'rand\',
    \'meta_compare\'      => \'IN\',
    \'posts_per_page\'    => 5,
];

$the_query = new WP_Query( $args );
$post_metas = $the_query->posts;

usort( $post_metas, function( $a, $b ){
    $a = get_post_meta( $a->ID , \'packages\', true ) ;
    $b = get_post_meta( $b->ID, \'packages\', true ) ;

    if ( $a == $b ) {
        return 0;
    }
        return ( $a > $b ) ? -1 : 1;
    }
);

unset($the_query->posts);
$the_query->posts = $post_metas;

if ( $the_query->have_posts() ) {
    echo \'<ul>\';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();

        echo \'<li>\' . get_post_meta( get_the_ID(), \'packages\', true ). \'</br>\' . get_the_title() . \'</li>\';

    }
    echo \'</ul>\';
} 
wp_reset_postdata();
?>
您只需要调整查询变量以满足您的需要,还需要调整循环以显示所需内容

但这不是实现它的唯一方法,您还可以将排序函数移动到函数中。php并专门针对此自定义查询

SO网友:TheDeadMedic

您需要通过meta_key 而不是meta_value:

 $query_string . \'&meta_key=name_of_key_that_stores_free_or_pro&orderby=meta_value_num\'

结束

相关推荐