Вопрос или проблема
В настоящее время создаю сайт и нужно создать ‘Расписание’, чтобы отображать Ведущего, который находится в эфире в определенное время.
Использую плагин ACF для ввода времени, когда ведущий появляется в эфире, что сохраняет значение пользовательского поля как временную метку.
По какой-то причине я не могу заставить запрос отображать ведущего, который находится в эфире в определенное время. Кажется, он просто показывает ведущего с самым высоким значением временной метки по сравнению с текущей временной меткой. Упрощенная версия кода приведена ниже.
<?php $args = array(
'post_type' => 'presenter',
'posts_per_page' => '1',
'meta_key' => 'on_air',
'orderby' => 'meta_value_num',
'order' => 'DESC'
);
$airquery = new WP_Query( $args ); ?>
<?php if ( $airquery->have_posts() ) : while ( $airquery->have_posts() ) : $airquery->the_post(); ?>
<?php
$now = strtotime(date('d-m-Y H:i:s')); // получить текущую временную метку
$stored_value = get_field('on_air'); // Сохраненная временная метка поста сравнивается с текущей временной меткой
?>
<?php if( $now > $stored_value )
{
echo the_title();
}
?>
<?php endwhile; endif; wp_reset_postdata(); ?>
Как видите, я запрашиваю посты в типе поста и хочу упорядочить по значению мета-данных, что, кажется, тоже не работает.
Я получаю только пост с самым большим значением временной метки выше текущей временной метки.
Все очень странно. Не знаю, нужно ли мне как-то получить значение всех постов, а затем сравнить $stored_value
с $now или нет?
Любая помощь была бы отличной!
Почему бы не извлечь нужный пост, вместо того чтобы извлекать пост и затем проверять значение мета-ключа?
$now = strtotime(date('d-m-Y H:i:s')); // получить текущую временную метку
$args = array(
'post_type' => 'presenter',
'posts_per_page' => '1',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'on_air',
'value' => $now,
'compare' => '>=',
),
),
);
Ответ или решение
Ваша задача — настроить запрос к записям (постам) на вашем сайте, чтобы отображать информацию о ведущем, который будет в эфире в заданное время. Проект, над которым вы работаете, использует плагин ACF (Advanced Custom Fields) для определения времени выхода ведущего в эфир, и время это сохраняется как timestamp в пользовательском поле.
Теоретическая часть
Работа с пользовательскими полями в WordPress через WP_Query требует учета специфики работы с мета-данными и правильного применения условий в запросах. Особенно это актуально, когда мы работаем с временными значениями. Задача здесь — научиться использовать meta_query
в WP_Query для фильтрации постов на основе дополнительной информации, хранящейся в мета-полях.
Основная трудность при работе с timestamp заключается в его динамическом изменении во времени, что требует тщательной его обработки и сравнения. Когда мы хотим выбрать записи, основываясь на времени их выхода в эфир, нам необходимо правильно применять условия фильтрации и сортировки, чтобы запрос возвращал только те записи, которые удовлетворяют нужным временным критериям.
Пример
Рассмотрим пример запроса, который поможет получить необходимую информацию о ведущем, который находится в эфире:
$now = strtotime(date('d-m-Y H:i:s')); // текущее время в формате timestamp
$args = array(
'post_type' => 'presenter',
'posts_per_page' => '1',
'order' => 'DESC',
'meta_query' => array(
array(
'key' => 'on_air',
'value' => $now,
'compare' => '>=',
'type' => 'NUMERIC'
),
),
);
$airquery = new WP_Query($args);
if ($airquery->have_posts()) :
while ($airquery->have_posts()) :
$airquery->the_post();
echo the_title();
endwhile;
endif;
wp_reset_postdata();
Применение
Теперь давайте разберемся с тем, как данный подход поможет достичь желаемого результата и отображать информацию о ведущем в эфире корректно:
-
Использование
meta_query
: В мета-запросах мы применяем фильтрацию на уровне базы данных, чтобы вытягивать только те записи, которые соответствуют нашим временным условиям, и в данном случае мы ищем посты, в которых время выхода в эфир равно или больше текущего времени. Это избавляет нас от необходимости фильтрации записей после получения их из базы данных, что экономит ресурсы и время. -
Правильное использование
compare
: Сравнение>=
обеспечивает, что мы получаем ведущего, который не только в эфире в данный момент, но также и всех будущих ведущих. Если же необходимо выбрать только текущего ведущего, можно использовать более сложный составной запрос. -
Оптимизация производительности: Запрос сразу же исключает ненужные записи, уменьшая перегрузку системы за счет фильтрации на уровне базы данных, а не в коде PHP.
-
Улучшение пользовательского опыта: Запрос, возвращающий актуальные результаты в реальном времени, помогает обеспечить актуальность данных для пользователя. Благодаря этому пользователи всегда получают достоверную и актуальную информацию о текущих и будущих трансляциях.
Этот метод не только решает изначально поставленную задачу, но и закладывает основу для более сложной логики вывода контента на основе временных условий в будущем. Конечная цель — это создание прочной инфраструктуры вывода данных о трансляциях, что значительно улучшает пользовательский интерфейс вашего веб-сайта.