WordPress: jak zrobić stronę archiwum?

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]

Poprzedni

W oczekiwaniu na 3.5: aktualizacja bibliotek

Następne

WordCamp 2012: znamy pierwsze tematy

6 komentarzy

  1. Jerry

    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)

  2. @Jerry: wszystko można :D a czy to będzie lepiej czy gorzej, to kwestia gustu.

  3. Helikopterek

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

  4. @Helikopterek: prawdę mówiąc nie do końca rozumiem pytanie. Tytuły wpisów?

  5. Radek

    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!

  6. Radek

    PS. O poradę poprosiłem także tutaj:

    http://pl.forums.wordpress.org/topic/magazeen-theme-strona-archiwum-nazwablogaarchiwum-jak-to-zrobic

    gdzie wyjaśniłem, jakie kroki wykonałem. Zauważyłem, po zdjęciu z avatara, że jesteś moderatorem forum supportu na pl.rodpress.org Z góry dziekuję i pozdrawiam!

    Radek

Oparte na WordPress & Theme by Anders Norén