关于wordpress:WP_Query meta_query日期范围和2个自定义字段

WP_Query meta_query date range with 2 custom fields

我有一个自定义帖子类型"事件",其中包含start_date和end_date的自定义字段。 我正在尝试列出即将发生的事件。 如果我仅查询具有start_date> =今天的事件,则可以正常工作。 如果我添加meta_query来说" AND"所有具有end_date <=今天的事件-它不会返回任何内容。

我的自定义字段(start_date,end_date)存储为unix时间戳,这就是为什么我使用" NUMERIC"和" meta_value_num"的原因。 $ today是当前日期的时间戳。 以下是我正在尝试做的事的示例...拔出头发-任何帮助将不胜感激!

这项工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        array(
            'key' => 'start_date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),

    )
);

当我为meta_query添加第二个数组时-不起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'start_date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'end_date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'NUMERIC',
        ),

    )
);

当我在主查询中使用meta_compare和一个meta_query时-不起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'meta_value_num' => $today,
    'meta_compare' => '>=',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'end_date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'date',
        ),

    )
);

当我在主查询中使用meta_compare且有多个meta_queries时-不起作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'meta_value_num' => $today,
    'meta_compare' => '>=',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'start_date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'end_date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'NUMERIC',
        ),

    )
);

这就是我使用它的方式,它对我来说很好用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$the_query = new WP_Query(array(
    'post_type' => 'job',
    'posts_per_page'   => 25,
    'meta_query' => array(
        array(
            'key' => 'published_date',
            'value' => array('20140401','20140405'),
            'compare' => 'BETWEEN',
            'type' => 'DATE'
        )
    )
));


if ($the_query->have_posts()) {

    echo '
<ul>
';
    while ($the_query->have_posts()) {
        $the_query->the_post();
        echo '
<li>
' . get_the_title() . '
</li>
';
    }
    echo '
</ul>
';

} else {
    echo 'Sorry! No Posts';
}

wp_reset_postdata();

食典上最重要的说明。

The 'type' DATE works with the 'compare' value BETWEEN only if the date is stored at the format YYYYMMDD and tested with this format.


我最终要做的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$args = array(  
    'post_type' => 'events',
    'posts_per_page' => -1,
    'meta_key' => 'start_date',
    'meta_value_num' => $yesterday,
    'meta_compare' => '<=',
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'start_date',
            'value' => array($first_minute,$last_minute),
            'compare' => 'BETWEEN',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'end_date',
            'value' => $yesterday,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),
        array(
            'key' => 'start_date',
            'value' => $yesterday,
            'compare' => '>=',
            'type' => 'NUMERIC',
        ),


    )
)

这将获取当前月份的事件。 我输入了月份的第一分钟,月份的最后一分钟和昨天的11:59:59的"昨天"的变量。


Alexandru-Florentin Popescu是对的! 使用您的代码另一个以下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$args = array(  
'post_type' => 'events',
'posts_per_page' => -1,
'meta_key' => 'start_date',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
    'relation' => 'AND',
    array(
        'key' => 'start_date',
        'value' => $today,
        'compare' => '<=',
        'type' => 'NUMERIC',
    ),
    array(
        'key' => 'end_date',
        'value' => $today,
        'compare' => '>=',
        'type' => 'NUMERIC',
    ),

));

您只需要两个数组中的更改键"比较"


不确定您要尝试什么,但是在选择今天或将来开始的事件(start_date> = $ today)并结束今天或过去的事件(end_date <= $ today)时似乎不返回任何逻辑...