Отображение записей в правильном порядке по месяцам с использованием пользовательского поля одной даты.

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

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

Записи имеют одно поле выбора даты Advanced Custom Fields, которое используется для установки месяца и года для каждой записи. Формат отображения для выбора даты – это пользовательское значение F Y, а формат возврата – Ymd.

Используя это поле, я смог отображать записи по годам, при этом записи из текущего года показываются первыми. Мне также нужно отображать их по месяцам в порядке от января до декабря. В настоящее время они отображаются в обратном порядке из-за параметров запроса.

Пример текущего отображения:

2024

  • Название записи Февраль 2024
  • Название записи Январь 2024

2023

  • Название записи Февраль 2023
  • Название записи Январь 2023

Пример, как должно отображаться:

2024

  • Название записи Январь 2024
  • Название записи Февраль 2024

2023

  • Название записи Январь 2023
  • Название записи Февраль 2023

Вот существующий запрос:

$args = array(
  'post_type' => 'document',
  'posts_per_page' => -1,
  'tax_query' => array(
    array(
      'taxonomy' => 'document-category',
      'field' => 'slug',
      'terms' => array( 'minute' ),
    ),
  ),
  'meta_key' => 'minutes_posted_date',
  'meta_query' => array(
    'relation' => 'AND',
    'month_clause' => array(
      'key' => 'minutes_posted_date',
      'compare' => 'NUMERIC',
    ),
    'year_clause' => array(
      'key' => 'minutes_posted_date',
      'compare' => 'NUMERIC',
    ),
  ),
  'orderby' => array(
    'month_clause' => 'DESC',
    'year_clause' => 'ASC',
  ),
);

И вот $posts цикл, выводящий запрос:

<?php if ( $posts ) : ?>
  <?php foreach( $posts as $post ) {
    $date = get_field( 'minutes_posted_date', $post->ID, false );
    $date = new DateTime( $date );
    $year = $date->format( 'Y') ;
    $month = $date->format( 'F' );
    $group_posts[$year][$month][] = array( $post, $date );
  } ?>
  <?php foreach ($group_posts as $yearKey => $years) : ?>
    <h3><?php echo esc_html( $yearKey ); ?></h3>
    <?php foreach ($years as $monthKey => $months) : ?>
      <nav>
      <?php foreach ($months as $postKey => $posts) : ?>
        <a href="<?php echo esc_url( get_permalink( $posts[0]->ID ) ); ?>">
          <?php echo esc_html( $posts[0]->post_title ); ?>
        </a>
      <?php endforeach; ?>
      </nav>
    <?php endforeach; ?>
  <?php endforeach; ?>
<?php endif; ?>

Ответ или решение

Чтобы правильно отобразить посты в порядке месяцев с использованием пользовательского поля даты, необходимо внести несколько изменений в ваш запрос и логику вывода. Давайте подробно разберемся, как это сделать, следуя вашему текущему коду.

Шаг 1: Изменение параметров WP Query

Ваш текущий код имеет некоторые несовершенства в области сортировки. Чтобы корректно отсортировать записи по месяцам в пределах каждого года, потребуется изменить параметры сортировки. Нужно обратить внимание на тот момент, что месяц, в отличие от года, должен быть отсортирован по возрастанию.

Обновленный код запроса:

$args = array(
  'post_type' => 'document',
  'posts_per_page' => -1,
  'tax_query' => array(
    array(
      'taxonomy' => 'document-category',
      'field' => 'slug',
      'terms' => array('minute'),
    ),
  ),
  'meta_key' => 'minutes_posted_date',
  'orderby' => array(
    'year_clause' => 'ASC',
    'month_clause' => 'ASC',
  ),
  'meta_query' => array(
    'relation' => 'AND',
    array(
      'key' => 'minutes_posted_date',
      'compare' => 'NUMERIC',
    ),
  ),
);

Шаг 2: Группировка постов по годам и месяцам

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

Обновленный код для группировки постов:

if ($posts) {
    foreach ($posts as $post) {
        $date = get_field('minutes_posted_date', $post->ID, false);
        $date = new DateTime($date);
        $year = $date->format('Y');
        $month = $date->format('n'); // Используем числовое значение месяца (1 - 12)

        $group_posts[$year][$month][] = $post;
    }

    // Сортировка месяцев
    ksort($group_posts);

    foreach ($group_posts as $yearKey => $months) {
        echo '<h3>' . esc_html($yearKey) . '</h3>';
        // Сортируем по номерам месяцев
        ksort($months);

        foreach ($months as $monthKey => $posts) {
            echo '<nav>';
            foreach ($posts as $post) {
                echo '<a href="' . esc_url(get_permalink($post->ID)) . '">' . esc_html($post->post_title) . '</a>';
            }
            echo '</nav>';
        }
    }
}

Результат

Теперь, когда вы выполните данные изменения, вывод постов будет упорядочен по месяцам. Пример структуры будет выглядеть так:

<strong>2024</strong>
<ul>
<li>2024 January Post Name</li>
<li>2024 February Post Name</li>
...</ul>

<strong>2023</strong>
<ul>
<li>2023 January Post Name</li>
<li>2023 February Post Name</li>
...</ul>

Заключение

Применяя приведенные выше изменения, вы обеспечите корректную сортировку постов по месяцам в рамках каждого года. Это улучшит читабельность и навигацию по вашим записям, что, в свою очередь, может положительно сказаться на пользовательском опыте.

Не забывайте всегда тестировать изменения на локальном сервере и проверять корректность работы вывода перед публикацией на живом сайте.

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

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