【问题标题】:WP_Query Order Posts By Custom Meta Value Array Not in CodexWP_Query 按自定义元值数组排序帖子不在 Codex 中
【发布时间】:2016-09-28 20:39:57
【问题描述】:

我有一种不同类型的邮购订单,我正试图退回它,但在任何地方都找不到答案。我正在使用 wp_query 尝试通过元值列表对帖子进行排序。但是,标准的 orderby 选项都不是我想要实现的。

我的元值存储为逗号列表字符串,如下所示:

1、5、10、3、21、6

然后我抓取这些值并将它们分解为一个数组,如下所示:

$banner_nums = get_option('banner_numbers');
$nums_array = explode( ',', $banner_nums );

我做了一个标准的 wp_query,但问题是,我试图按照我的 $banner_nums 变量中的实际顺序来排序这些帖子的显示,而不是按照任何正常的 wp_query orderby,例如“ID”、“date” , 'title', 'meta_value' 等。

显示如下:

第一个:发布 meta_value = 1

第 2 次:发布 meta_value = 5

3rd:发布 meta_value = 10

第 4 次:发布 meta_value = 3

第 5 次:发布 meta_value = 21

第 6 次:发布 meta_value = 6

例如,如果我想将 meta_value = 6 的帖子显示为第二个帖子,我会将我的列表更改为:1、6、5、10、3、21。

这是我的查询,可以很好地抓取我的帖子,但我无法让它们正确排序。

$slider_args = array(
    'post_type' => 'property',
    'posts_per_page' => -1,
    'nopaging' => true
);

$my_query = array();

foreach( $nums_array as $k => $v ) {
    $my_query[$k]['key'] = 'property_id';
    $my_query[$k]['value'] = $v;
    $my_query[$k]['compare'] = '=';
}

$slider_args['meta_query'] = $my_query;
$slider_args['meta_query']['relation'] = 'OR';

$slider_query = new WP_Query( $slider_args );

if ( $slider_query->have_posts() ) {
    stuff...
}

打印我的 $slider_args 看起来像这样,看起来不错:

[post_type] => property
[posts_per_page] => -1
[nopaging] => 1
[meta_query] => Array
    (
        [0] => Array
            (
                [key] => property_id
                [value] => 1
                [compare] => =
            )

        [1] => Array
            (
                [key] => property_id
                [value] =>  5
                [compare] => =
            )

        [2] => Array
            (
                [key] => property_id
                [value] =>  10
                [compare] => =
            )

        [3] => Array
            (
                [key] => property_id
                [value] =>  3
                [compare] => =
            )

        [4] => Array
            (
                [key] => property_id
                [value] =>  21
                [compare] => =
            )

        [5] => Array
            (
                [key] => property_id
                [value] =>  6
                [compare] => =
            )

        [relation] => OR
    )

我只是不知道如何以正确的顺序显示帖子

1、5、10、3、21、6

我希望我说得有道理?非常感谢任何帮助。

【问题讨论】:

  • 它将在查询找到帖子时对帖子进行排序。您可以对帖子进行 foreach 循环,以按照您想要的方式使用。如果这是一个集合查询,请将其缓存以节省性能。

标签: php arrays wordpress


【解决方案1】:

我自己学到了一些新东西,试图为你解决这个问题:)

显然,从 WP 3.5 开始,您可以在创建 WP_Query 时指定 'post__in' 的 'orderby' 参数

https://codex.wordpress.org/Class_Reference/WP_Query#Order_.26_Orderby_Parameters

所以基本上我认为您可以做的就是抓住具有您需要的元值的帖子 ID,并将这些 ID 按照它们在元值数组中指定的顺序放入一个数组中。然后,如果您对该数组执行 WP_Query,请传入 arg:

'orderby' => 'post__in'

现在,正如另一位评论者指出的那样,这可能是一个相当昂贵的操作,因此您希望将结果缓存到瞬态并使用该输出,而不是每次加载页面时都运行此查询:

https://codex.wordpress.org/Transients_API

【讨论】:

  • 很好,我自己都不知道 :)
【解决方案2】:

感谢格雷格的意见。我正在使用 'orderby' => 'post__in" arg,但没有考虑过必须添加帖子 ID 数组。我必须添加 'post__in' => array(IDs) 的附加 arg 所以 orderby会正常工作。所以我必须像你说的那样做,并添加一个昂贵的查询来获取这些 ID。我的最终代码如下所示:

$banner_nums = get_option('banner_numbers');
$numbers = explode( ',', $banner_nums );

// ** new code
$wpIds = array();
// need post ids to keep the sort order same as in string above
foreach( $numbers as $num) {
    $args = array(
        'post_type' => 'property',
        'meta_query' => array(
            array(
                'key' => 'property_id',
                'value' => $num
            )
        )
    );
    $getPosts = new WP_Query($args);
    if( $getPosts->have_posts() ) {
        while( $getPosts->have_posts() ) {
            $getPosts->the_post();
            // builds array of posts IDs in same order as $numbers array above.
            array_push($wpIds, get_the_ID());
        } // end while
    }
}
// ** end new code

$slider_args = array(
    'post_type' => 'property',
    'posts_per_page' => -1,
    'nopaging' => true,
    'post__in' => $wpIds,  // ** new code
    'orderby' => 'post__in'
);

$my_query = array();

foreach( $numbers as $k => $v ) {
    $my_query[$k]['key'] = 'property_id';
    $my_query[$k]['value'] = $v;
    $my_query[$k]['compare'] = '=';
}

$slider_args['meta_query'] = $my_query;
$slider_args['meta_query']['relation'] = 'OR';

$slider_query = new WP_Query( $slider_args );

是的,这是一个昂贵的查询,但就我而言,使用它来构建一个 2-6 幻灯片的主页滑块,我可以处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-30
    • 2015-01-22
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多