WordPress: отображать ссылки на архивы, сгруппированные по годам

В настоящее время я использую wp_get_archives('type=monthly') для отображения ссылок на архивы на боковой панели. Это результат:

<ul>
    <li><a href='http://example.com/2011/08/'>August 2011</a></li>
    <li><a href='http://recently.se/2011/07/'>July 2011</a></li>
    <li><a href='http://recently.se/2010/12/'>December 2010</a></li>
</ul>

Можно ли вместо этого сгруппировать месяцы по годам? Что-то вроде этого:

<ul>
    <h2>2011</h2>
    <li><a href='http://example.com/2011/08/'>August 2011</a></li>
    <li><a href='http://recently.se/2011/07/'>July 2011</a></li>

    <h2>2010</h2>
    <li><a href='http://recently.se/2010/12/'>December 2010</a></li>
</ul>

person Richard    schedule 23.08.2011    source источник


Ответы (1)


Вот как я это реализовал, хотя я уверен, что есть лучший способ. Я добавил эти функции в файл functions.php моей темы:

function twentyeleven_get_archives_callback($item, $index, $currYear) {
    global $wp_locale;

    if ( $item['year'] == $currYear ) {
        $url = get_month_link( $item['year'], $item['month'] );
        // translators: 1: month name, 2: 4-digit year
        $text = sprintf(__('%1$s %2$d'), $wp_locale->get_month($item['month']), $item['year']);
        echo get_archives_link($url, $text);
    }
}

function twentyeleven_get_archives() {
    global $wpdb;

    $query = "SELECT YEAR(post_date) AS `year` FROM $wpdb->posts WHERE `post_type` = 'post' AND `post_status` = 'publish' GROUP BY `year` ORDER BY `year` DESC";
    $arcresults = $wpdb->get_results($query);
    $years = array();

    if ($arcresults) {
        foreach ( (array)$arcresults as $arcresult ) {
            array_push($years, $arcresult->year);
        }
    }

    $query = "SELECT YEAR(post_date) as `year`, MONTH(post_date) as `month` FROM $wpdb->posts WHERE `post_type` = 'post' AND `post_status` = 'publish' GROUP BY `year`, `month` ORDER BY `year` DESC, `month` ASC";
    $arcresults = $wpdb->get_results($query, ARRAY_A);
    $months = array();

    if ( $arcresults ) {
        foreach ($years as $year) {
                    //My Display
            //echo "\t<li>\n\t\t<a href=\"#\">$year</a>\n\t\t<ul>\n";
            //array_walk($arcresults, "twentyeleven_get_archives_callback", $year);
            //echo "\t\t</ul>\n\t</li>\n";

                    //Your Display
            echo "\t<h2>$year</h2>\n\t<ul>\n";
            array_walk($arcresults, "twentyeleven_get_archives_callback", $year);
            echo "\t</ul>\n";
        }
    }
}

Вы могли бы вызвать эту функцию вместо wp_get_archives() в своей теме следующим образом:

<ul>
<?php twentyeleven_get_archives(); ?>
</ul>

Названия функций могут быть любыми, хотя рекомендуется ставить перед ними префикс имени вашей темы (например, twentyeleven_).

Я ссылался на wp_get_archives() и get_archives_link() в файле wp-includes/general-template.php.

person Bubs    schedule 20.09.2011