Отображение пользовательских типов записей по полю даты

Вопрос или проблема

У меня есть пользовательский тип записи, который представляет собой просто заголовки с датой. Я хочу отображать эти записи в списке в порядке этой даты (не даты размещения). Просто:

Пример даты

Название события 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 на соответствующие значения вашего проекта.

Если у вас возникнут вопросы или потребуется дополнительная помощь, не стесняйтесь обращаться за разъяснениями.

Оцените материал
Добавить комментарий

Капча загружается...