Вопрос или проблема
В настоящее время я создаю веб-сайт, на котором нужно показывать предстоящие события. Я строю веб-сайт на теме WordPress Salient и пытаюсь немного настроить его с помощью кода в дочерней теме.
Я изменяю встроенный цикл записями в блоге темы, чтобы вместо этого показывать события. В коде я внес несколько изменений, чтобы отсортировать их в правильном порядке (не по дате публикации, а по дате события), но не могу понять, как исключить события, дата которых уже прошла.
if( $orderby !== ‘view_count’ ) {
$today = date(‘l j F’);
$nectar_blog_arr = array(
‘post_type’ => ‘evenement’,
‘posts_per_page’ => $posts_per_page,
‘post_status’ => ‘publish’,
‘meta-key’ => ‘event_startdate’,
‘meta_query’ => array(
‘relation’ => ‘AND’,
‘date_clause’ => array(
‘key’ => ‘event_startdate’,
‘value’ => $today,
‘type’ => ‘DATE’,
‘compare’ => ‘>=’
),
),
‘orderby’ => array(
‘date_clause’ => ‘ASC’,
),
‘offset’ => $post_offset,
‘category_name’ => $category,
‘paged’ => $paged
);
Есть идеи или советы?
Примечание: Я пробовал много фрагментов кода, которые нашел на этом форуме или других сайтах, но некоторые коды просто ломают цикл и не показывают его вовсе. Без каких-либо ошибок PHP тоже. Странно, да?
Заранее спасибо за всю помощь и предложения!
Ответ или решение
Вопрос, с которым вы столкнулись, связан с исключением событий из цикла WordPress на основе даты, хранящейся в пользовательском поле (custom field). На первый взгляд, ваша реализация выглядит достаточно близкой к требуемой, но есть несколько аспектов, которые стоит обсудить для обеспечения ее корректной работы.
Анализ текущего кода
Ваш код для WP_Query выглядит следующим образом:
$nectar_blog_arr = array(
'post_type' => 'evenement',
'posts_per_page' => $posts_per_page,
'post_status' => 'publish',
'meta_key' => 'event_startdate',
'meta_query' => array(
'relation' => 'AND',
'date_clause' => array(
'key' => 'event_startdate',
'value' => $today,
'type' => 'DATE',
'compare' => '>='
),
),
'orderby' => array(
'date_clause' => 'ASC',
),
'offset' => $post_offset,
'category_name' => $category,
'paged' => $paged
);
Проблемные моменты
-
Формат даты: Переменная
$today
формируется с использованиемdate('l j F')
, что может не совпадать с форматом даты, хранящимся в пользовательском полеevent_startdate
. Вам нужно убедиться, что формат даты в$today
и вevent_startdate
совпадают, например, используя форматY-m-d
, который является стандартным форматом для хранения дат в MySQL.Замените строку:
$today = date('l j F');
на
$today = date('Y-m-d');
-
Проверка мета-запроса: Ваша мета-запрос содержит неправильное определение поля
meta_key
. Можете попробовать удалить строку'meta_key' => 'event_startdate',
, так как это может препятствовать возвращению ожидаемых результатов, особенно если вы работаете с более сложными метаполями. -
Структура запроса: Убедитесь, что вы правильно установили параметры
meta_query
. Важно, чтобы структура мета-запроса была корректной, а отношение между запросами (в данном случаеAND
) было оправданным.
Оптимизированный код
Вот пример, как можно переписать ваш запрос, чтобы исключить прошедшие события:
$today = date('Y-m-d'); // Используем подходящий формат даты
$nectar_blog_arr = array(
'post_type' => 'evenement',
'posts_per_page' => $posts_per_page,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'event_startdate',
'value' => $today,
'compare' => '>=',
'type' => 'DATE'
),
),
'orderby' => array(
'event_startdate' => 'ASC', // Убедитесь, что это название вашего мета-поля
),
'offset' => $post_offset,
'category_name' => $category,
'paged' => $paged
);
Заключение
После изменения кода, обязательно проверьте его в админке WordPress, обновив кэш (если используется) и переиндексируя метаполя, чтобы гарантировать, что запрос к базе данных возвращает правильные результаты.
Если проблемы повторяются, стоит рассмотреть возможность использования WP Debugging, чтобы выявить дополнительные ошибки, которые могут не отображаться в пользовательском интерфейсе.