Недавно, при работе над дизайном одного из клиентских сайтов, который требовал от нас отобразить архивы по месяцам, отсортированные по годам в сайдбаре. Возможно это было легко нарисовать дизайнеру заказчика в Photoshop, однако оказалось немного сложно достичь этого в WordPress. Смотрите на изображение ниже:
Наверняка вы задаетесь вопросам, чем была вызвана проблема в реализации, когда есть функция wp_get_archives(), которая выводит архивы по месяцам и справа от них — год. Ну, дело было в том, что клиент хотел выводить все то же самое, только год должен был быть слева. Не существует стандартного способа настройки отображения функции wp_get_archives().
Сколько мы не мучили гугл, решения не находилось. Проблема действительно не частая, однако мы наткнулись на статью Andrew Appleton, где был описан похожий случай, и у него было решение. Мы использовали его код с небольшими правками со своей стороны.
Код Andrew не предусматривал параметра ограничения для архивов. Потому использование его кода означало, что отобразятся ВСЕ архивы. Представьте себе, что вашему блогу, например, лет 5… Поэтому следовало добавить ограничительный параметр, который бы позволил указывать определенное количество месяцев (18 в нашем случае) в любое время.
Итак, нудно вставить следуюший код в файл sidebar.php вашей темы или в любой другой файл, где вы хотите вывести настраиваемые архивы WordPress:
<?php global $wpdb; $limit = 0; $year_prev = null; $months = $wpdb->get_results("SELECT DISTINCT MONTH( post_date ) AS month , YEAR( post_date ) AS year, COUNT( id ) as post_count FROM $wpdb->posts WHERE post_status = 'publish' and post_date <= now( ) and post_type = 'post' GROUP BY month , year ORDER BY post_date DESC"); foreach($months as $month) : $year_current = $month->year; if ($year_current != $year_prev){ if ($year_prev != null){?> <?php } ?> <li class="archive-year"><a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/"><?php echo $month->year; ?></a></li> <?php } ?> <li><a href="<?php bloginfo('url') ?>/<?php echo $month->year; ?>/<?php echo date("m", mktime(0, 0, 0, $month->month, 1, $month->year)) ?>"><span class="archive-month"><?php echo date_i18n("F", mktime(0, 0, 0, $month->month, 1, $month->year)) ?></span></a></li> <?php $year_prev = $year_current; if(++$limit >= 18) { break; } endforeach; ?>
Примечание: Ели вы хотите изменить количество отображаемых месяцев, то вам необходимо изменить строку 19, где текущее значение $limit установлено в 18.
Наш CSS код выглядит примерно так:
.widget-archive{padding: 0 0 40px 0; float: left; width: 235px;} .widget-archive ul {margin: 0;} .widget-archive li {margin: 0; padding: 0;} .widget-archive li a{ border-left: 1px solid #d6d7d7; padding: 5px 0 3px 10px; margin: 0 0 0 55px; display: block;} li.archive-year{float: left; font-family: Helvetica, Arial, san-serif; padding: 5px 0 3px 10px; color:#ed1a1c;} li.archive-year a{color:#ed1a1c; margin: 0; border: 0px; padding: 0;}
Если вы все сделаете так, как описано выше, то результат будет таким:
Если же вам нужно вывести количество записей для каждого месяца, то нужно добавить немного кода в любое место между строками 12 – 16 приведенного выше кода:
<?php echo $month->post_count; ?>
Результат того, что получится после этого (с количеством записей по месяцам), можно увидеть на изображении ниже:
Картинка была взята на сайте Andrew Appleton, так как это и было его решением, которое мы видоизменили. Если вам нужно такое оформление, то исследуйте стили на его сайте.
Может быть вам известно более простой путь реализации настраиваемого отображения архивов в WordPress? Делитесь ими в комментариях ниже.