Запрос произвольного типа записей с 2 произвольными полями (диапазон дат)

11 сент. 2011 г., 21:06:21
Просмотры: 3.88K
Голосов: 4

Я изучил WP Codex и StackExchange, нашел некоторые подсказки, но не могу заставить этот запрос работать. У меня есть 2 произвольных поля, связанных с каждой выставкой в формате Y-m-d: exstart-date - дата начала выставки и exend-date - дата окончания.

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

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$today = date('Y-m-d', strtotime('-6 hours'));
query_posts(array(
    'post_type' => 'exhibitions', 
    'posts_per_page' => 6, 
    'paged' => $paged,
    'orderby' => 'title',
    'order' => 'DESC',
    'meta_query'=>array(
        'relation'=>'AND',
        array(
            'key' => 'exstart-date',
            'value' => $today,
            'compare' => '<=',
            'type' => 'CHAR'
            ),
        array(
            'key' => 'exend-date',
            'value' => $today,
            'compare' => '>=',
            'type' => 'CHAR'
            )
        )
    ));
if (have_posts()) :
while (have_posts()) : the_post();
11
Комментарии

Первое, что сразу бросается в глаза — 'type' => 'CHAR', должно быть 'type' => 'DATE', разве нет?

Milo Milo
11 сент. 2011 г. 23:20:49

Я пробовал использовать DATE, но это всё равно не сработало. Когда я делаю запрос только для начальной даты или только для конечной даты, CHAR работает нормально.

Ray Gulick Ray Gulick
12 сент. 2011 г. 01:50:12

Единственное другое замечание — caller_get_posts это параметр true/false, но он был заменён на ignore_sticky_posts, хотя это не должно влиять на запрос, просто будет появляться уведомление об устаревании. Я проверил здесь, и всё вроде работает, возможно, стоит убедиться, что ничто другое не мешает запросу, например плагин. Используйте print_r($wp_query) и проверьте содержимое.

Milo Milo
12 сент. 2011 г. 02:45:12

Спасибо, но вывод запроса ничего не показал. Что-то не так с реляционным meta_query. Если я запрашиваю exstart_date или exend_date по отдельности, проблем нет - я получаю правильный результат. Но объединенный запрос ничего не возвращает.

Ray Gulick Ray Gulick
12 сент. 2011 г. 15:01:23

если что-то не так с запросом, ты увидишь это в сгенерированном SQL при проверке $wp_query. у меня это работает как есть, когда я просто копирую/вставляю твой код и добавляю правильные мета-поля (я также меняю post_type на тот, который у меня уже настроен). твои мета-поля с датами отформатированы как yyyy-mm-dd? не думаю, что другие запросы, которые ты делаешь, работали бы, если бы это было не так.

Milo Milo
12 сент. 2011 г. 15:18:54

Да: yyyy-mm-dd Возможно, я неправильно реализовал вывод запроса. Повторюсь, запросы работают по отдельности, но не вместе.

Ray Gulick Ray Gulick
12 сент. 2011 г. 19:42:02

Разве значение для сравнения не должно быть '=', если вы пытаетесь проверить, что обе даты содержат сегодняшнюю дату?

Michelle Michelle
12 сент. 2011 г. 19:53:59

Они не содержат сегодняшнюю дату. Мы ищем значения, которые равны или больше начальной даты и равны или меньше конечной даты. Я также пробовал этот запрос, убрав '=', чтобы искать значения между начальной и конечной датами, но это тоже не дало результата. Если только я полностью не неправильно понимаю логику, что возможно.

Ray Gulick Ray Gulick
12 сент. 2011 г. 20:00:15

Нас интересует часть $wp_query->request, она покажет фактический SQL-запрос, который отправляется в базу данных. Если у вас есть phpMyAdmin, для проверки вы можете вставить этот запрос напрямую во вкладку SQL, чтобы увидеть, что он возвращает. Вот как это выглядит у меня. За исключением post_type, ваш запрос должен выглядеть так же, если только что-то еще, например плагин, не фильтрует запрос.

Milo Milo
12 сент. 2011 г. 21:18:14

У меня нет доступа к phpMyAdmin на этом конкретном сайте.

Ray Gulick Ray Gulick
13 сент. 2011 г. 01:59:10

Я заметил, что вы использовали одну и ту же дату в качестве начальной и конечной. Вы пробовали, когда даты были разными?

Ray Gulick Ray Gulick
16 сент. 2011 г. 15:58:22
Показать остальные 6 комментариев
Все ответы на вопрос 1
0

Вот код, с которым я в итоге разобрался и который работает. Я должен был упомянуть, что запрос находился внутри цикла, потому что, когда я показал его Дэмиану Тэггарту из Mindshare Studios, он заметил и сказал, что мне следует использовать WP_Query вместо query_posts. Спасибо Майло и другим, кто пытался помочь мне, несмотря на отсутствие всей необходимой информации.

<?php
     $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
     $today = date('Y-m-d', strtotime('-6 hours'));
     $myquery = new WP_Query(array(
     'post_type' => 'exhibitions', // Тип записи: выставки
     'posts_per_page' => 6,  // Количество записей на странице 
     'paged' => $paged, // Номер страницы
     'orderby' => 'title', // Сортировка по заголовку
     'order' => 'ASC', // По возрастанию
     'meta_query'=>array( // Мета-запрос
            'relation'=>'AND', // Логическое И
            array(
                'key' => 'exstart-date', // Ключ: дата начала
                'value' => $today, // Значение: сегодня
                'compare' => '<=', // Оператор сравнения: меньше или равно
                'type' => 'CHAR' // Тип данных
            ),
            array(
                'key' => 'exend-date', // Ключ: дата окончания
                'value' => $today, // Значение: сегодня
                'compare' => '>=', // Оператор сравнения: больше или равно
                'type' => 'CHAR' // Тип данных
            )
        )
    ));
    if ($myquery->have_posts()) : // Если есть записи
    while ($myquery->have_posts()) : $myquery->the_post(); // Цикл по записям
?>
19 сент. 2011 г. 22:33:22