Не получается выполнить комбинированный запрос с сортировкой?

7 февр. 2012 г., 05:22:06
Просмотры: 158
Голосов: 0

Ниже приведен код, который я использую для запроса многодневных событий. Проблема в том, что я могу либо сортировать по дате начала (evstart_date), либо выполнять комбинированный запрос по дате начала и дате окончания (evend_date). Но я не могу одновременно выполнить комбинированный запрос И сортировку. Код ниже правильно выполняет запрос (продолжает показывать многодневные события, которые начались в прошлом, но еще не закончились), но сортировка не работает (возвращается к сортировке по умолчанию по дате публикации).

Я пробовал несколько вариантов, но не смог найти решение.

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $today = date('Y-m-d', strtotime('-6 hours'));
    $upcomingevents = new WP_Query(array(
        'post_type' => 'events', 
        'posts_per_page' => 6,  
        'paged' => $paged,
        'meta_query'=>array(
        'relation'=>'OR',
            array(
                'key' => 'evstart_date',
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
                ),
            array(
                'key' => 'evend_date',
                'value' => $today,
                'compare' => '>=',
                'type' => 'CHAR'
                )
             ),
        'meta_key' => 'evstart_date',
        'orderby' => 'meta_value',
        'order' => 'ASC'
    )); 
?>
6
Комментарии

По какому критерию вы хотите сортировать?

tollmanz tollmanz
7 февр. 2012 г. 05:36:36

В каком формате указаны ваши даты?

mor7ifer mor7ifer
7 февр. 2012 г. 10:25:16

Я хочу, чтобы элементы были упорядочены по дате начала. Даты указаны в формате гггг-мм-дд.

Ray Gulick Ray Gulick
7 февр. 2012 г. 14:01:35

На самом деле, приведенный выше код также не правильно формирует запрос, так как он показывает все события (я добавил несколько прошлых событий, и они не исключаются). Опять же, если я удаляю код orderby (последние 3 переменные), запрос работает правильно (исключает нужные элементы). Если я делаю запрос только по дате начала или дате окончания, то сортировка работает.

Ray Gulick Ray Gulick
7 февр. 2012 г. 15:20:37

Тип должен быть date, а не char. В противном случае, опубликуйте SQL, сгенерированный этим запросом. Возможно, вы не можете сортировать по ключу, используемому в отношении OR?

Milo Milo
7 февр. 2012 г. 17:33:50

Попробовал это, и DATE работает не лучше. CHAR работает нормально, когда не пытаешься одновременно сортировать и делать комбинированный запрос. Формат данных: yyyy-mm-dd (например, 2012-02-05) Просто ради интереса попробовал AND вместо OR и не получил результатов, что может указывать на то, что запрос работает, но это не сильно помогает, так как AND не подходит для получения нужных результатов. Также создал новое пользовательское поле startdate (те же данные, но другое имя ключа) и не могу сортировать по нему при комбинированном запросе (хотя этот ключ не используется в запросе).

Ray Gulick Ray Gulick
7 февр. 2012 г. 21:32:18
Показать остальные 1 комментариев
Все ответы на вопрос 1
2

У меня была такая же проблема, пока я не понял, что на самом деле не нужно делать запрос по дате начала события, только по дате окончания.

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

Это должно сработать для вас:

<?php
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    $today = date('Y-m-d', strtotime('-6 hours'));
    $upcomingevents = new WP_Query(array(
        'post_type' => 'events', // Тип записи - события
        'posts_per_page' => 6,  // Количество событий на странице
        'paged' => $paged,
        'meta_query'=>array(
            array(
                'key' => 'evend_date', // Ключ для даты окончания
                'value' => $today,
                'compare' => '>=', // Сравнение: дата окончания больше или равна текущей
                'type' => 'CHAR'
                )
             ),
        'meta_key' => 'evstart_date', // Ключ для даты начала
        'orderby' => 'meta_value', // Сортировка по значению метаполя
        'order' => 'ASC' // Порядок сортировки - по возрастанию
    )); 
?>
14 февр. 2012 г. 03:43:32
Комментарии

Я в итоге пришел к такому же выводу, Кристиан; просто не успел опубликовать это как ответ. Спасибо за твой ответ.

Ray Gulick Ray Gulick
14 февр. 2012 г. 07:58:05

Отличный ответ, Кристиан. Добро пожаловать на сайт, продолжай давать такие хорошие ответы - они очень нужны сайту.

Dwayne Charrington Dwayne Charrington
15 февр. 2012 г. 02:17:38