Вопрос или проблема
У меня есть пользовательский тип записи, который представляет собой просто заголовки с датой. Я хочу отображать эти записи в списке в порядке этой даты (не даты размещения). Просто:
—
Пример даты
Название события 1
Название события 2
Пример даты
Название события 3
Название события 4
Название события 5
(и так далее)
—
Без лишней информации, это буквально все, что я хочу отобразить.
Я совершенно не понимаю, как это сделать. Я не очень хорош в PHP, поэтому буду признателен за любую помощь в этом.
Я решил ту же проблему так:
Сначала вы храните каждую запись в другом массиве, называемом $events_by_date
, с датой в качестве индекса. Если другой пост события попадает на ту же дату, вы помещаете этот пост под тот же индекс.
Пожалуйста, дайте знать, если вам нужно дополнительное объяснение.
<?php
//настройте параметры wp_query для выполнения запроса
$calendar_results = new WP_Query($wp_query_params);
$events_by_date = array();
while ($calendar_results->have_posts()) : $calendar_results->the_post();
//$date_group = strtotime($calendar_results->post->post_date);
$date_group = strtotime(date('Y-m-d',$date_group));
$events_by_date[$date_group][] = $calendar_results->post;
endwhile;
global $post;
foreach($events_by_date as $date_heading=>$rows) {
echo '<h2 class="published-date">',
ucfirst(strftime('%A %d %b',$date_heading)),
'</h2>';
foreach ($rows as $post) {
setup_postdata($post);
get_template_part('content', $template);
}
}
wp_reset_query();
Просто используйте WP_Query так:
$posts_by_date_field = new WP_Query(array(
'post_type' => 'POST_TYPE_NAME',
'posts_per_page' => -1,
'meta_key' => 'FIELD_NAME',
'orderby' => 'meta_value',
'order' => 'DESC'
));
if ($posts_by_date_field->have_posts()) : while ($posts_by_date_field->have_posts()) : $posts_by_date_field->the_post();
// ЦИКЛ
endwhile; endif;
Ответ или решение
Для отображения пользовательских типов записей на основе пользовательского поля даты в WordPress, вам нужно использовать класс WP_Query. Данный подход позволит вам эффективно собирать и группировать записи по дате, которую вы указали в пользовательском поле, а не по дате создания самой записи. Вот пошаговая инструкция с примерами кода.
Шаг 1: Создание WP_Query
Сначала мы создадим запрос, который будет извлекать ваши пользовательские записи. В этом запросе мы будем использовать meta_key
, чтобы указать имя поля, в котором хранится дата, а также orderby
для сортировки записей по значению этого поля.
$posts_by_date_field = new WP_Query(array(
'post_type' => 'POST_TYPE_NAME', // замените на ваш тип записи
'posts_per_page' => -1, // показывать все записи
'meta_key' => 'FIELD_NAME', // замените на ваше поле с датой
'orderby' => 'meta_value', // сортируем по значению метаполя
'order' => 'ASC' // по возрастанию
));
Шаг 2: Группировка записей по дате
После того, как мы получили все записи, мы можем сгруппировать их по датам. Для этого мы создадим массив $events_by_date
, где ключом будет дата, а значением — массив записей, соответствующих этой дате.
$events_by_date = array();
if ($posts_by_date_field->have_posts()) {
while ($posts_by_date_field->have_posts()) {
$posts_by_date_field->the_post();
// Получаем дату из метаполя
$event_date = get_post_meta(get_the_ID(), 'FIELD_NAME', true);
// Преобразуем дату в формат, удобный для работы
$date_group = strtotime($event_date);
// Группируем записи по дате
if (!isset($events_by_date[$date_group])) {
$events_by_date[$date_group] = array();
}
$events_by_date[$date_group][] = get_the_title(); // сохраняем только заголовок события
}
}
// Сбросим глобальную переменную поста
wp_reset_postdata();
Шаг 3: Вывод записей по датам
Теперь, когда у нас есть массив с событиями, сгруппированными по дате, мы можем легко их вывести на экран.
foreach ($events_by_date as $date_heading => $rows) {
echo '<h2 class="published-date">' . ucfirst(strftime('%A %d %b', $date_heading)) . '</h2>';
foreach ($rows as $event_title) {
echo '<div>' . esc_html($event_title) . '</div>'; // выводим название события
}
}
Заключение
Используя вышеприведенный код, вы сможете отображать свои пользовательские записи, сгруппированные по дате, используя пользовательские поля. Этот подход позволяет избежать путаницы с датами создания записей и предоставляет пользователям понятный и структурированный вывод информации. Не забудьте заменить POST_TYPE_NAME
и FIELD_NAME
на соответствующие значения вашего проекта.
Если у вас возникнут вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться за разъяснениями.