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:
pobierz plik: page-archiwum.php-.zip
Comments