WordPress — ACF — получать сообщения с повторной датой начала и окончания

Я управляю сайтом путешествий с путешествиями, у которых есть дата начала и окончания. Теперь эти поездки могут быть несколько раз в год.

Теперь у меня есть один пост с тремя повторными датами начала и окончания

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

Я хочу показать свое сообщение с датами начала и окончания, содержащимися в диапазоне дат поиска.

Поиск 01.06.2015 — 01.07.2015 не должен давать результатов.
Поиск 01.03.2015 — 01.04.2015 должен вернуть один результат.

$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) сообщение не отображается, что является правильным

НО

если диапазон 05.03.2015 — 16.03.2015 (2015-03-05 — 2015-03-16), в сообщении отображается сообщение НЕПРАВИЛЬНО, поскольку дата начала поиска должна быть 01.03.2015 (2015-03.01) или до возврата Результаты.

А ТАКЖЕ

это происходит только тогда, когда я повторяю поля. Пока существует только одна дата, сохраненная 01.03.2015 — 14.03.2015 (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

3

Решение

Проблема в том, что ваш запрос не знает, что reisezeiten_1_start соответствует reisezeiten_1_end, Так что он может использовать reisezeiten_2_start а также reisezeiten_1_start для вашего примера.

Ваш диапазон:> = 2015-03-05, <= 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+

Увидеть кодекс для получения дополнительной информации (конец параграфа)

Некоторая помощь по Веб-сайт ACF

(Извините за мой английский)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]