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

person hes    schedule 24.02.2015    source источник
comment
Вы можете уточнить? Есть ли в одиночном сообщении три строки wp_postmeta с ключом reisezeiten_%_start и еще три с ключом ...end? Или это три разных сообщения, каждое со своими wp_postmeta строками?   -  person O. Jones    schedule 24.02.2015
comment
да, это один пост с шестью wp_postmeta. три пусковых и три конечных клавиши   -  person hes    schedule 24.02.2015
comment
Еще одно уточнение, пожалуйста! Похоже, вы хотите найти reisen с датами начала и окончания, полностью входящими в искомый диапазон дат. Таким образом, поиск 03-06-2015 - 03-07-2015 не должен дать результатов. И поиск 02-20-2015 - 03-20-2015 должен дать один результат. Правильный? Пожалуйста, отредактируйте свой вопрос, чтобы уточнить.   -  person O. Jones    schedule 24.02.2015
comment
Вы можете установить плагин WP query-monitor с сайта wordpress.org/plugins/query-monitor. и используйте его для проверки сгенерированного SQL. Это то, что я бы сделал, если бы пытался отлаживать это сам.   -  person O. Jones    schedule 24.02.2015
comment
Кстати, добро пожаловать в Stack Overflow. Спасибо за публикацию подлинного (и трудного!) вопроса.   -  person O. Jones    schedule 24.02.2015
comment
да. Я установил монитор запросов. Помимо того, что я не эксперт по sql, я не видел никакой разницы ни в одном поисковом запросе, который я пробовал.   -  person hes    schedule 24.02.2015
comment
Интересно, отредактируете ли вы свой вопрос, включив в него текст SQL-запроса; этот wp_postmeta бизнес представляет собой гигантский Haarballen.   -  person O. Jones    schedule 24.02.2015
comment
Пара идей, может быть, далеко, внешний массив meta_query не имеет отношения, я не могу вспомнить, используется ли по умолчанию И или ИЛИ, это может быть ИЛИ для 2 вместо И? Во-вторых: возможно ли, что из-за вашего подстановочного знака в ключе подполя acf (row) он соответствует startDate из одной строки и endDate из другой строки?   -  person Matt.C    schedule 24.02.2015
comment
Хорошо, проверил тот же сценарий настройки, это несколько строк, в вашем неудачном тесте он соответствует дате начала из 3-й строки. и дату окончания из первой строки. Доказательство: измените свой последний неудачный тестовый диапазон на 05.05–16.05, и он не должен возвращать никаких сообщений, что касается решения, еще не уверен, но я почти уверен в своем тесте, что это вызывает это. Возможно, сопоставить даты начала, результаты цикла и подтвердить дату окончания или что-то подобное?   -  person Matt.C    schedule 24.02.2015
comment
Мэтт, ты прав. Изменение диапазона с 02.05 до 15.05 не возвращает сообщение. Может быть, это отсутствующие отношения в моем внешнем массиве? Сорри, я совсем не программист..   -  person hes    schedule 25.02.2015
comment
Я не уверен, что проблема заключается в отношениях, я думаю, что проблема заключается в подстановочном знаке в meta_key, я не думаю, что вы сделаете это с одним запросом, вам может понадобиться несколько запросов или несколько элементов в массиве meta_query зависят от того, всегда ли есть три ряда или намного больше   -  person Matt.C    schedule 25.02.2015


Ответы (1)


Проблема в том, что ваш запрос не знает, что 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

Ваш запрос означает «Я хочу публикацию, у которой одна дата начала больше 05.03.2015 и одна дата окончания меньше 16.03.2015».

So :

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

Таким образом, ваше сравнение действительно для двух мета_ключей, и сообщение возвращается. Это объясняет, почему ваш код работает с одной датой.

Как сказал Мэтт. 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

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

person A. Joahny    schedule 16.06.2015
comment
Привет. Это было долго. Проект был приостановлен до сих пор. Похоже, это единственное рабочее решение этой проблемы. Прямо сейчас я пытаюсь получить ваше решение в правильном массиве, поэтому мне не нужно писать каждый блок для каждого числа. Я нашел эту тему, но не могу заставить ее работать для моей проблемы: stackoverflow.com/a/14446234/4504590. Я не знаю, как быть с «отношением» => «ИЛИ» или даже как повторить цикл 10 раз. Может ли кто-нибудь помочь мне с этим, или я должен открыть для этого новый вопрос? - person hes; 10.06.2018
comment
Привет @hes, не могли бы вы показать свой код? (с помощью pastbin или любого другого сервиса) - person A. Joahny; 13.06.2018
comment
Привет, мистер Джоани. Я уже решил этот вопрос здесь: stackoverflow.com /вопросы/50788251/. Но затем обнаружилась другая проблема, которую я описал здесь: wordpress.stackexchange.com/questions/305856/. Может быть, вы могли бы помочь мне там? - person hes; 14.06.2018
comment
хорошо, у меня нет репутации, чтобы комментировать ваш другой вопрос (но вы можете принять мой ответ, чтобы увеличить его;)) так что вы пытались выполнить sql WP_Query непосредственно в базе данных, чтобы увидеть проблему? (с помощью phpmyadmin или другого программного обеспечения). Чтобы получить sql: $query->request Кроме того, для 10 повторяющихся дат, я думаю, могут быть некоторые проблемы с производительностью. - person A. Joahny; 14.06.2018