当前位置: 首页 > 知识库问答 >
问题:

WP_按自定义元值数组查询订单帖子不在Codex中

冯德佑
2023-03-14

我有一种不同的邮政订单,我试图返回,但我找不到任何有答案的地方。我使用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顺序,如“ID”、“日期”、“标题”、“meta_value”等。

像这样显示:

第1个:meta_值为1的帖子

第二:meta_value的帖子=5

第三:meta_值为10的帖子

第4名:meta_value=3

第五:meta_值为21的帖子

第六:meta_value的帖子=6

例如,如果我想将meta_值为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

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

共有2个答案

晁国发
2023-03-14

谢谢格雷格的意见。我用的是“orderby”=

$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张幻灯片的主页滑块,我可以处理它。

诸俊才
2023-03-14

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

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

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

因此,我认为您可以做的基本上是拦截具有您需要的元数据的post ID,并将这些ID按照在您的元数据数组中指定的顺序放入数组中。然后,如果对该数组执行WP_查询,请传入参数:

'orderby' => 'post__in'

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

https://codex.wordpress.org/Transients_API

 类似资料:
  • 使用下面的代码,我列出了自定义帖子类型“人物”下的所有帖子 下面是我的页码, 我还创建了一个插件,使用上面的代码在边栏中显示标题列表。因此,每当我访问mysite.com/people这两个网站时(即带有分页的自定义帖子列表 若我转到第二页,侧边栏显示为空。 有人知道我哪里出错了吗?

  • 我创建了一个归档页面,我的'事件'自定义帖子猿archive-event.php.我使用的内容从标准archive.php模板,它列出了我的4个事件的顺序,他们被张贴。 下一步是按自定义字段event_date更改订单。我这样做没有问题。然后我不想显示任何事件的日期已经过去。下面的代码完美地实现了这一点。 我现在的问题是我的分页都搞砸了。我的默认阅读设置为每页2篇文章,我有一个“加载更多”按钮来显

  • null 我希望能够从数组中获取某些元值,例如、、、、等。 这个PHP代码段将添加一个字段的订单电子邮件,但我如何编辑这一点,我可以让它显示一些元从数组? 对于特定的WooCommerce订单,我使用 这表明:

  • 我有一个自定义后类型设置称为艺术家。每个单个艺术家是一个页面(艺术家个人资料,如果你愿意),有一个通过高级自定义字段(ACF)的关系字段类型与该艺术家相关联的产品列表。我需要产品在艺术家页面上显示在他们的类别中。因此,在Elementor中,我需要指定一个查询筛选器ID,以简单地将产品划分为类别。 到目前为止我所尝试的 我试图通过自定义查询仅显示列表中特定类别的产品,因为我需要生成查询ID。 我一

  • 我希望有人能帮我创建我需要的查询。我引用这个留档的元素或额外的小部件,“额外的帖子”:https://developers.elementor.com/custom-query-filter/ 现在,我可以在编辑器中设置查询以显示来自多个类别的帖子。问题是,查询显示来自“红色”或“蓝色”的帖子。我需要查询来显示标记为“红色”和“蓝色”的帖子。 我使用自定义帖子类型和自定义类别,这似乎是有意义的例子

  • 我创建了一个WordPress自定义帖子类型,然后我创建了REST API自定义endpoint以获取所有帖子运行良好。然后我创建了另一个自定义endpoint以按ID获取单个帖子。例如http://localhost:8888/wordpress/wp-json/lc/v1/cars/120 我已经创建了一些帖子,每次我将路线末端的ID更改为118或116时,它都会显示最新的post-ID 12