группировать посты по месяцам/датам, игнорируя годы

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

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

Пример:
Янв (все посты, опубликованные в январе за все годы 2010, 2011 ... 2015)
1 (все посты, опубликованные 1 января за все годы 2010, 2011 ... 2015)
ПОСТ1
ПОСТ2
...
2 (все посты, опубликованные 1 января за все годы 2010, 2011 ... 2015)
ПОСТ1
ПОСТ2
...
Фев (все посты, опубликованные в феврале за все годы 2010, 2011 ... 2015)
1 (все посты, опубликованные 1 января за все годы 2010, 2011 ... 2015)
ПОСТ1
ПОСТ2
...

Сейчас я использую этот код:

<table class="table table-striped">
<?php
$current_month="";
$args = array(
'post_type' => 'dayinhistory',
'date_query' => array(
'month' => '1',
),
'order' => 'ASC'
);

query_posts( $args );

if ( have_posts() ) : while( have_posts() ): the_post();

$this_month = get_the_time( 'F' );

if( $this_month != $current_month ){
$current_month = $this_month;
echo '<tr><td colspan="4">'; 
echo $current_month; 
echo '</td></tr>';
}
?>
<tr>
<td style="vertical-align:inherit;"><?php the_date('d.m.Y', '<span class="label label-info">', '</span>'); ?></td>
<td style="vertical-align:inherit;"><a href="https://wordpress.stackexchange.com/questions/180024/<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></td>
<td style="vertical-align:inherit;"><span class="label label-default"><?php the_time('d M Y'); ?></span></td>
</tr>
<?php endwhile;?>
<?php endif;?>
<?php wp_reset_query();?>
</table>

Или этот:

<?php
$the_query = new WP_Query( 'post_type=dayinhistory&monthnum=3' );
echo '<table class="table table-striped">';
while ( $the_query->have_posts() ) {
$the_query->the_post(); 

$this_month = get_the_time( 'F' );

if( $this_month != $current_month ){
$current_month = $this_month;
echo '<tr><td colspan="4">'; echo $current_month; echo '</td></tr>';
}
?>
<tr>
<td style="vertical-align:inherit;"><?php the_date('d.m.Y', '<span class="label label-info">', '</span>'); ?></td>
<td style="vertical-align:inherit;"><a href="https://wordpress.stackexchange.com/questions/180024/<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></td>
<td style="vertical-align:inherit;"><span class="label label-default"><?php the_time('d M Y'); ?></span></td>
</tr>                
<?php }
echo '</table>';
wp_reset_postdata();
?>

Результат введите описание изображения здесь

Но посты сортируются по году, а не по дате.

Вы можете использовать month параметр WP_Query, чтобы получить посты за месяц. Например, чтобы получить все посты, опубликованные в марте, игнорируя год:

<?php
$the_query = new WP_Query( 'monthnum=3' );
echo '<ul>';
while ( $the_query->have_posts() ) {
    $the_query->the_post();
    echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
wp_reset_postdata();
?>

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

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

Шаги для группировки постов

  1. Организация запроса: Первым делом создайте запрос, который будет извлекать все необходимые посты вашего пользовательского типа. Мы будем использовать параметр date_query, чтобы исключить влияние года.

  2. Структура вывода: Создайте логику для вывода постов, которая сгруппирует их по месяцу и затем по дате.

Пример кода

Вот пример кода, который решает вашу задачу:

<?php
// Установим необходимый пользовательский тип поста
$post_type = 'dayinhistory';

// Теперь создаем массив для хранения данных
$posts_by_date = [];

// Получим все посты за определенный диапазон лет
$args = array(
    'post_type' => $post_type,
    'posts_per_page' => -1,
    'orderby' => 'date',
    'order' => 'ASC',
);
$query = new WP_Query($args);

// Группируем посты по месяцу и дате
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        $month = get_the_time('F'); // Название месяца
        $day = get_the_time('j'); // Число

        // Инициализируем массив для месяца, если он еще не установлен
        if (!isset($posts_by_date[$month])) {
            $posts_by_date[$month] = [];
        }

        // Добавляем пост к соответствующему дню
        if (!isset($posts_by_date[$month][$day])) {
            $posts_by_date[$month][$day] = [];
        }
        $posts_by_date[$month][$day][] = get_the_title();
    }
}

// Отображаем результаты
echo '<table class="table table-striped">';
foreach ($posts_by_date as $month => $days) {
    echo '<tr><td colspan="4">' . esc_html($month) . '</td></tr>';
    foreach ($days as $day => $posts) {
        echo '<tr>';
        echo '<td>' . esc_html($day) . '</td>';
        echo '<td>';
        // Список постов за этот день
        echo implode('<br>', array_map(function ($post_title) {
            return '<a href="' . get_permalink() . '">' . esc_html($post_title) . '</a>';
        }, $posts));
        echo '</td>';
        echo '</tr>';
    }
}
echo '</table>';
wp_reset_postdata();
?>

Пояснения к коду

  1. Запрос постов: Мы извлекаем все посты типа dayinhistory независимо от года и сортируем их по дате.
  2. Группировка: Создаем двумерный массив, где ключами первого уровня являются названия месяцев, а второго — дни. В каждом массиве второго уровня хранятся заголовки постов.
  3. Отображение: Используем вложенные циклы для вывода месяцев и дней, а также для списка постов, что очищает структуру представления данных и делает ее более читабельной.

Заключение

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

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

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

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