Wordpress - ACF - 获取重复开始和结束日期的帖子

时间:2015-02-24 12:49:52

标签: php mysql wordpress date advanced-custom-fields

我正在运行旅行网站,其中包含有开始和结束日期的旅程。现在这些旅程可以一年几次。

现在我有一个包含三个重复开始和结束日期的单个帖子

01.03.2015 - 14.03.2015       2015-03-01  - 2015-03-14
01.04.2015 - 14.04.2015       2015-04-01  - 2015-04-14
01.05.2015 - 14.05.2015       2014-05-01  - 2015-05-14

我想在搜索日期范围内显示包含开始和结束日期的帖子。

搜索2015年6月1日 - 2015年7月1日应该没有结果。 搜索2015年3月1日 - 2015年4月1日应返回一个结果。

$reisen_query_args = array(
'post_type' => 'reisen',
'post_status' => 'publish',
'meta_query' => array(
    array(
        'key'       => 'reisezeiten_%_start',
        'compare'   => '>=',
        'value'     => $startdate,
        'type'      => 'DATE'
    ),
     array(
        'key'       => 'reisezeiten_%_end',
        'compare'   => '<=',
        'value'     => $enddate,
        'type'      => 'DATE'
    )
)

这是中途工作,我无法弄明白为什么:

如果搜索范围是01.03.2015 - 10.03.2015(2015-03-01 - 2015-03-10),则该帖子没有显示哪个是正确的

BUT

如果范围是05.03.2015 - 16.03.2015(2015-03-05 - 2015-03-16),则该帖子显示错误,因为搜索开始日期必须是01.03.2015(2015-03.01)或在返回结果之前。

只有当我有重复的字段时才会发生这种情况。只要存储了2015年3月1日 - 2015年4月14日(2015-03-01 - 2015-03-14)的一个日期,查询就会按照需要运行。

有人可以帮助我吗?我现在正在寻找几周才能完成这项任务。

这是我的查询的样子:

SELECT SQL_CALC_FOUND_ROWS wp410_posts.ID
FROM wp410_posts
INNER JOIN wp410_term_relationships
ON (wp410_posts.ID = wp410_term_relationships.object_id)
INNER JOIN wp410_postmeta
ON ( wp410_posts.ID = wp410_postmeta.post_id )
INNER JOIN wp410_postmeta AS mt1
ON ( wp410_posts.ID = mt1.post_id )
WHERE 1=1
AND ( wp410_term_relationships.term_taxonomy_id IN (29) )
AND wp410_posts.post_type = 'reisen'
AND ((wp410_posts.post_status = 'publish'))
AND ( ( wp410_postmeta.meta_key LIKE 'reisezeiten_%_start'
AND CAST(wp410_postmeta.meta_value AS DATE) >= '2015-03-02' )
AND ( mt1.meta_key LIKE 'reisezeiten_%_end'
AND CAST(mt1.meta_value AS DATE) <= '2015-03-14' ) )
GROUP BY wp410_posts.ID
ORDER BY wp410_posts.menu_order ASC
LIMIT 0, 6

1 个答案:

答案 0 :(得分:0)

问题是您的请求不知道reisezeiten_1_start对应reisezeiten_1_end。因此,它可以使用reisezeiten_2_startreisezeiten_1_start作为您的示例。

您的范围:&gt; = 2015-03-05,&lt; = 2015-03-16

您的数据:

2015-03-01  - 2015-03-14
2015-04-01  - 2015-04-14
2014-05-01  - 2015-05-14

您的请求表示“我希望发布的一个开始日期大于2015-03-05且一个结束日期小于2015-03-16”

所以:

2015-03-01  - 2015-03-14 => ending date correponds to your range
2015-04-01  - 2015-04-14 => start date corresponds to your range
2014-05-01  - 2015-05-14

因此,您对两个meta_key的比较有效,并返回帖子。这解释了为什么您的代码可以使用一个日期。

像马特说的那样。 C,一个解决方案是在meta_query数组中使用多个项目(就像他说:如果你有无限的行,它将不起作用)

$reisen_query_args = array(
    'post_type' => 'reisen',
    'post_status' => 'publish',
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'relation' => 'AND',
            array(
                'key'       => 'reisezeiten_1_start',
                'compare'   => '>=',
                'value'     => $startdate,
                'type'      => 'DATE'
            ),
             array(
                'key'       => 'reisezeiten_1_end',
                'compare'   => '<=',
                'value'     => $enddate,
                'type'      => 'DATE'
            )
        ),
        array(
            'relation' => 'AND',
            array(
                'key'       => 'reisezeiten_2_start',
                'compare'   => '>=',
                'value'     => $startdate,
                'type'      => 'DATE'
            ),
             array(
                'key'       => 'reisezeiten_2_end',
                'compare'   => '<=',
                'value'     => $enddate,
                'type'      => 'DATE'
            )
        ),
        array(
            'relation' => 'AND',
            array(
                'key'       => 'reisezeiten_3_start',
                'compare'   => '>=',
                'value'     => $startdate,
                'type'      => 'DATE'
            ),
             array(
                'key'       => 'reisezeiten_3_end',
                'compare'   => '<=',
                'value'     => $enddate,
                'type'      => 'DATE'
            )
        )

    )
)

请注意,此代码仅适用于WP 4.1 +

有关更多信息,请参阅codex(paragraphe结束)

ACF website

的一些帮助

(对不起我的英文)