Na mojej stronie jakiś czas temu pojawił się odnośnik do strony zbiorczej archiwum, prezentującej listę lat i miesiącami wraz liczbą wpisów. Dostałem kilka pytań jak to jest zrobione, ponieważ standardowa funkcja wp_get_archives, nie ma podziału pozwalającego pogrupować wpisy jeszcze względem roku. Sprawa nie jest aż tak trudna jakby mogła się wydawać, ale wymaga jednak podstawowej znajomości PHP i troszkę tego jak wybierane są pliki szablonów.

Tworzenie własnego szablonu

Na początek należy wytworzyć szablon strony, czyli dodatkowy plik w naszym motywie, który będzie używany przez stronę „Archiwum” jako szablon. Żeby było łatwiej, cały używany w tym artykule kod pasuje do motywu Twenty Eleven i wystarczy go skopiować i użyć, aby działał bez żadnych kłopotów.

Plik może nazywać się w dowolny sposób, a to, że będzie on szablonem decyduje linijka zawierająca „Temlate Name:”. To co znajdzie się po dwukropku będzie potem widoczne w panelu edycji strony. Zaczynając od nagłówka, musi on wyglądać tak:

<?php
/*
Template Name: Archiwum
*/

Oczywiście wyraz Archiwum można zstąpić dowolny, to jest po prostu nazwa naszego szablonu i pod tą nazwą, jeżeli plik został dodany prawidłowo, w boksie „Atrybuty strony” pojawi się on w menu rozwijalnym „Szablon”, co jest wskazane na poniższym obrazie:

Na zakończenie należy dodać stronę, dla której trzeba ustawić utworzony właśnie szablon, dzięki któremu wyświetlimy miesięczne archiwum z nagłówkami w formie lat, czyli dodajemy naszą stronę „Archiwum” i jako szablon wybieramy „Archiwum”.

Przypomnę też, że jeżeli używane są menu, to należy taką stronę dodać do owego menu. Jeżeli natomiast zajdzie potrzeba pokazania odnośnika to utworzonej właśnie strony, o np. dolne menu jest nie zarządzalne i umieszczone jest „na sztywno” w jakiś pliku motywu, można użyć następującego kodu:

<?php
$archive = get_page_by_title( 'Archiwum' );
if ( is_object( $archive ) && isset( $archive->ID ) ) {
    printf(
        '<a href="%s">%</a>',
        get_page_link( $archive->ID ),
        $archive->post_name
    );
}
?>

Pełen listing szablonu

Kompletny kod mojej strony archiwum:

<?php
 
/*
Template Name: Archiwum
*/
get_header(); ?>
<div id="primary">
    <div id="content" role="main">
        <?php while ( have_posts() ) : the_post(); ?>
        <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
            <header class="entry-header">
                <h1 class="entry-title"><?php the_title(); ?></h1>
            </header>
            <div class="entry-content">
<?php
$year = 0;
$list = preg_replace(
     '@</li>@',
     '',
     wp_get_archives(
          array(
               'type' => 'monthly',
               'show_post_count' => true,
               'echo' => false
           )
    )
);
$start = true;
foreach ( preg_split( '/<li>/', $list ) as $entry ) {
    if( !preg_match( '/ (\d{4})</', $entry, $matches ) ) {
        continue;
    }
    if ( $matches[1] != $year ) {
        $year = $matches[1];
        if ( !$start ) {
            echo '</ul>';
        }
        printf( '<h2>%d</h2>', $year );
        echo '<ul>';
        $start = false;
    }
    printf( '<li>%s</li>', $entry );
}
echo '</ul>';
?>
            </div>
        </article>
<?php endwhile; ?>
    </div>
</div>
<?php get_footer(); ?>

Gotowy plik, jak zwykle do pobrania:

[zip href='http://iworks.pl/wp-content/uploads/2012/08/page-archiwum.php-.zip']page-archiwum.php-.zip[/zip]

Komentarze

A słuchaj, nie lepiej zrobić takie archiwum by pod miesiącami była lista tytułów publikacji w postaci linków.
Teraz trzeba klikać w miesiące by zobaczyć ich tytuły.
Wiem, że może to być zbyt obszerne, ale ja chciałbym mieć taki uporządkowany spis treści jak w książce. (J)

Czy mógłbyś podpowiedzieć w jaki sposób dodać podlinkowane tytuły poszczególnych wpisów w takim archiwum?

Witam,

Mam mały problem. Twoje rozwiązanie nie działa w przypadku mojego themu MAGAZEEN Theme, jaki zastosowałem na stronie. Theme pochodzi z 2009 r., więc pewnie motyw, dla którego je kroiłeś, nie istniał wtedy i dlatego nie zadziałało. Pomógłbyś mi dostosować swoje rozwiązanie do mojego motywu? Chciałbym, aby, tak jak u Ciebie, występowała strona Archiwum /archiwum w tej postaci co u Ciebie, ale w moim motywie MAGAZEEN. Chciałbym do niej podlinkować na końcu strony index.php, odsyłając czytelnika do wcześniejszych postów, właśnie jw. do strony archiwum. Wyznam, że php nie znam.

Pozdrawiam!

iWorks Marcin Pietrzak

Wykorzystujemy ciasteczka do spersonalizowania treści i reklam, aby oferować funkcje społecznościowe i analizować ruch w naszej witrynie.

Informacje o tym, jak korzystasz z naszej witryny, udostępniamy partnerom społecznościowym, reklamowym i analitycznym. Partnerzy mogą połączyć te informacje z innymi danymi otrzymanymi od Ciebie lub uzyskanymi podczas korzystania z ich usług.

Informacja o tym, w jaki sposób Google przetwarza dane, znajdują się tutaj.