Intereting Posts
WP Post Template – Шаблоны в собственной папке Создайте логин для входа и покажите свою историю Автоматически устанавливать полный размер для всех моих изображений во всех моих сообщениях и на странице? Ссылка на страницу со всеми сообщениями Как обновить счетчик личных страниц на панели управления? Редактор WordPress не получает просмотр видео в формате youtube Просмотр содержимого из загруженного файла в редакторе Вывод Требуется тег WP для плагина при его отправке Как реализовать пользователей пользовательских типов сообщений Как использовать аватар автора как Facebook после просмотра изображения, когда один пост является общим HTML5 / CSS3 Polyfill для wp-login.php Повторное поле пользовательского мета-поля как спрятать главную навигационную ссылку в wordpress Пользовательские страницы поиска post_type Хранение массива с использованием update_metadata

WP_Query с использованием meta_query с отношением OR и orderby meta_value не работает

Я уже несколько часов бил об ошибке и не могу найти свою ошибку. Может ли быть ошибка с типом отношения «OR» в WordPress?

$evenements = new WP_Query(array( 'post_type' => 'evenements', 'orderby' => 'meta_value', 'meta_key' => 'startDate', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'startDate', 'value' => date('Ymd'), 'compare' => '>=', ), array( 'key' => 'endDate', 'value' => date('Ymd'), 'compare' => '>=', ), ), )); 

Странно то, что если я отношусь к «И», он работает по назначению. Если оба утверждения верны, сообщение появится. Если я установил отношение к «OR», все сообщения появятся, и по какой-то причине даже порядок не будет работать должным образом. Даже изменение «порядка» от «ASC» до «DESC» не изменит порядок поступления результатов.

Чтобы понять запрос, вот подробное описание того, что именно я пытаюсь сделать:

Я хочу показать события, которые происходят или в будущем. Два метаданных – это дата начала события (startDate) и дата окончания события (endDate).

Поэтому, если дата начала выше или равна (чтобы получить, если событие происходит сегодня) до сегодняшнего дня, или дата окончания выше или равна сегодняшнему, покажите сообщение.

Вторая часть (с датой окончания) будет сделана так, что будет показано событие, и я не могу удалить первую часть (с датой начала), потому что, если событие длится только один день, клиент будет вводить метаданные startDate ,

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

Вот что я получаю, если echo $evenements->request .

 SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) JOIN wp_icl_translations t ON wp_posts.ID = t.element_id AND t.element_type = 'post_evenements' JOIN wp_icl_languages l ON t.language_code=l.code AND l.active=1 WHERE 1=1 AND wp_posts.post_type = 'evenements' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND ( wp_postmeta.meta_key = 'startDate' OR ( mt1.meta_key = 'startDate' AND CAST(mt1.meta_value AS CHAR) >= '20140305' ) OR ( mt2.meta_key = 'endDate' AND CAST(mt2.meta_value AS CHAR) >= '20140305' ) ) AND t.language_code='fr' GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value ASC LIMIT 0, 10 

Проблема в том, что WordPress получает все сообщения, у которых есть мета-ключ «startDate», независимо от значения мета.

Вы можете понять, что сформировать эту часть запроса:

 ... AND ( wp_postmeta.meta_key = 'startDate' OR ( mt1.meta_key = 'startDate' AND CAST(mt1.meta_value AS CHAR) >= '20140305' ) OR ( mt2.meta_key = 'endDate' AND CAST(mt2.meta_value AS CHAR) >= '20140305' ) ) ... 

поэтому, если сообщение имеет метаданные 'startDate', оно будет возвращено.

Виновником такого поведения является аргумент 'meta_key'

 ... new WP_Query( array( 'post_type' => 'evenements', 'orderby' => 'meta_value', 'meta_key' => 'startDate', // <-- this is the culprit ... 

Однако, если вы удалите его, вы не сможете заказать мета значение, потому что иногда WordPress … (я не знаю английского термина, выполните предложение самостоятельно).

Решение (должно быть) помещать первую часть вашего мета-запроса (относительно даты начала) в виде простых аргументов (не meta_query частью meta_query ), а вторая часть (относительно даты окончания) внутри массива meta_query :

 $evenements = new WP_Query(array( 'post_type' => 'evenements', 'meta_key' => 'startDate', 'meta_value' => date('Ymd'), 'meta_type' => 'NUMERIC', 'meta_compare' => '>=', 'orderby' => 'meta_value', 'order' => 'ASC', 'meta_query' => array( 'relation' => 'OR', array ( 'key' => 'endDate', 'value' => date('Ymd'), 'compare' => '>=', 'type' => 'NUMERIC' ) ) )); 

Ваша установка слишком сложная, чтобы я мог ее точно проверить, поэтому попробуйте сами и сообщите мне.