WP_QUERY元_按日期查询结果日期

时间:2018-07-18 作者:PUncle

不要离开!这不是关于如何按meta\\u值排序的另一个问题!

我有一个帖子类型叫做events, 我创建的每一篇帖子都有一个我想象中的元域event_dates_wp 它接受多个日期并将其保存为Ymd 总体安排

我有一个WP_Query 返回日期介于两者之间的帖子meta_query values、 像这样:

$args = [
    \'post_type\' => \'event\',
    \'order\' => \'ASC\',
    \'orderby\' => \'meta_value\',
    \'meta_key\' => \'event_dates_wp\',
    \'posts_per_page\' => -1,
    \'meta_query\' => [
      [
        \'key\' => \'event_dates_wp\',
        \'type\' => \'DATE\',
        \'value\' => \'20180801\',
        \'compare\' => \'>=\'
      ],
      [
        \'key\' => \'event_dates_wp\',
        \'type\' => \'DATE\',
        \'value\' => \'20180831\',
        \'compare\' => \'<=\'
      ]
    ]
  ];
这一切都非常有效,并返回包含event_dates_wp 2018年8月1日至2018年8月31日期间的价值;但结果是“以后为中心”而不是“以日期为中心”——让我自己解释一下:

以上是人们所期望的,但我想做的是列出日期,从8月1日开始,一直到31日,在每个日期下列出每个匹配的帖子,允许它们重复。

例如:

Event A contains dates [20180801, 20180802, 20180803, 20180804]
Event B contains dates [20180803, 20180804, 20180805]
Event C contains dates [20180804, 20180807]
结果如下所示:

20180801 // 1st Aug 2018
Event A

20180802 // 2nd Aug 2018
Event A

20180803 // 3rd Aug 2018
Event A
Event B

20180804 // 4th Aug 2018
Event A
Event B
Event C

20180805 // 5th Aug 2018
Event B

20180806 // 6th Aug 2018
[NO RESULT]

20180807 // 7th Aug 2018
Event C

20180808 // 8th Aug 2018
[NO RESULT]

20180809 // 9th Aug 2018
[NO RESULT]
...
我能想到的唯一方法是一次查询一个日期,然后继续查询下一个日期;这可不是个好主意。有没有一种方法可以实现这种查询基于日期的事件并将其格式化的看似常见的模式?

这种行为的一个很好的例子是Barbican events page, 我相信这是在使用Drupal。肯定有一种WordPress的方式来做这种事情?

感谢阅读!

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

我的想法如下。

1. 获取事件的所有元日期的数组。DISTINCT 在MySQL查询中,表示不要包含重复项。

<?php
/*
 * From https://wordpress.stackexchange.com/a/9451/11761
 */
function get_all_possible_meta_dates( $key = \'event_dates_wp\', $type = \'page\', $status = \'publish\' )
{

    global $wpdb;

    $result = $wpdb->get_col( $wpdb->prepare( "
        SELECT DISTINCT pm.meta_value FROM {$wpdb->postmeta} pm
        LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
        WHERE pm.meta_key = \'%s\'
        AND p.post_status = \'%s\'
        AND p.post_type   = \'%s\'
    ", $key, $status, $type ) );

    return $result;
}
2. 通过所有具有event_dates_wp 元键并获取posts对象。你需要一次。

3. 将每个帖子元与可能的日期进行比较。如果有匹配项,请打印出来。

<?php
function print_posts_by_meta_dates()
{

    $args = [
        \'post_type\' => \'event\',
        \'order\' => \'ASC\',
        \'orderby\' => \'meta_value\',
        \'meta_key\' => \'event_dates_wp\',
        \'posts_per_page\' => -1,
    ];

    // all events having `event_dates_wp`
    $loop = new WP_Query( $args );

    // all posssible event dates
    $distinct_meta_dates = get_all_possible_meta_dates();

    foreach( $distinct_meta_dates as $event_meta_date ) {

        // date header
        echo \'<h1>\' . $event_meta_date . \'</h1>\';

        // loop through all events
        foreach( $loop->posts as $event ) {

            // get current event dates array
            $event_all_dates = get_post_meta( $event->ID, \'event_dates_wp\', false );

            // compare
            if( in_array( $event_meta_date, $event_all_dates ) ) {

                // post name
                echo \'<p>\' . $event->post_name;

            }
        }
    }
}
4. 使用打印帖子列表print_posts_by_meta_dates() 模板中的函数。

5. 或者创建要在帖子或页面中使用的短代码。

add_shortcode( \'test_shortcode\', \'print_posts_by_meta_dates\' );
您将得到类似的结果:

20180801单独:

enter image description here

结束

相关推荐

对于home_url/某些页面URL,会调用什么php?

对于大多数专家来说,这听起来很愚蠢,但对于初学者来说,这到底是什么还不清楚。访问home_url/year/month URL。例如domain.com/2018/05 显示该特定月份的所有帖子。显然是一样的.php 被调用domain.com/2018 也一样(除非有更多的结果)。我到处看了看archives.php (我有)但它与实际渲染的内容不一致。在我读到的一些地方date.php 我也是,但我没有这样的档案。现在我对归档文件特别感兴趣,但有了这个问题,我正在寻找一种通用方法来确切了解特定URL涉