Вопрос или проблема
Я разработал 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>
Заключение
Применяя приведенные выше изменения, вы обеспечите корректную сортировку постов по месяцам в рамках каждого года. Это улучшит читабельность и навигацию по вашим записям, что, в свою очередь, может положительно сказаться на пользовательском опыте.
Не забывайте всегда тестировать изменения на локальном сервере и проверять корректность работы вывода перед публикацией на живом сайте.