
Podstawowe funkcje WordPressa pozwalają nam na zbudowanie bardzo podstawowego archiwum wpisów wg. daty ich publikacji. Wystarczy jeden widget i kilka kliknięć, lub też jedna funkcja i kilka definicji parametrów i już mamy listę wpisów wg. miesięcy ;).
Gdy jednak chcemy zbudować coś ala ProBlogger, czyli rok, a obok niego lista wszystkich miesięcy, to tutaj już pojawiają się schody – z pomocą przychodzą nam umiejętności programistyczne.
Całość zostanie zawarta w jednej tylko funkcji – funkcję tę najlepiej będzie umieścić w pliku functions.php
, znajdującym się w folderze naszego szablonu (większość szanujących się szablonów WordPressa posiada taki plik). Otwieramy więc go i gdzieś na samym dole przez zamykającym znacznikiem ?>
wklejamy następujący kod:
function get_new_archive() { global $wpdb; }
Gwoli wyjaśnienia dla osób nie mających do tej pory kontaktu z php
– kod ten definiuje funkcję (get_new_archive()
), która potem wyświetli nam treść na stronie. W funkcji tej znajdzie się cały kod odpowiedzialny za wyświetlanie naszego archiwum. Natomiast global $wpdb;
będzie nam potrzebna do wykonania zapytania do bazy danych. Wyglądać ono powinno następująco:
$years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date DESC"); foreach ( $years as $year ) { }
Zapytanie to pobierze nam z bazy danych lata, w których były publikowane wpisy, a następnie przypisze je do zmiennej $years
. Następnie wywołana zostanie pętla foreach
, dzięki czemu każdy rok zostanie wyświetlony osobno. Teraz musimy jeszcze zdefiniować zapytanie, które pobierze nam wszystkie miesiące dla danego roku:
$months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC"); $with_posts = array_flip($months);
Mamy już rok, mamy miesiące, teraz musimy ustalić ich liczbę – jeśli nic się nie zmieniło, mamy ich dwanaście ;):
for ( $i = 1 ; $i <= 12 ; $i++ ) { if ( array_key_exists($i, $with_posts) ) { //Link } else { //Pusty miesiac } }
Pozostaje nam już tylko wyświetlić dane – rok należy wyświetlić kodem następującym:
<a href="<?php echo get_year_link($year); ?>"><?php echo $year; ?></a>
Natomiast w przypadku miesięcy sprawa wygląda nieco inaczej. Zerknijcie na powyższą pętlę for
– odpowiednie kody wstawiamy w miejsca komentarzy //Link
oraz //Pusty miesiac
.
for ( $i = 1 ; $i <= 12 ; $i++ ) { if ( array_key_exists($i, $with_posts) ) { echo '<div><a href="'. get_month_link($year, $i); .'">'. echo $set_month["$i"]; .'</div>'; } else { echo '<div>'. $set_month["$i"]; .'</div>'; } }
Spostrzegawczy zauważą jednak tablicę $set_month
– pozwala nam ona na wyświetlenie nazw miesięcy, a nie samych liczb – umieszczamy ją przed pierwszą pętlą foreach ( $years as $year )
aby całość była nieco bardziej zoptymalizowana. Sama tablica wygląda następująco:
$set_month = array( 1 => Jan, 2 => Feb, 3 => Mar, 4 => Apr, 5 => May, 6 => Jun, 7 => Jul, 8 => Aug, 9 => Sep, 10 => Oct, 11 => Nov, 12 => Dec );
W powyższym przypadku miesiące brzmią dosyć „wyspiarsko”, jeśli chcemy możemy je zmienić na polskie odpowiedniki ;) – nie powinno to już być problemem. W końcu wszystko trzeba ubrać w ładną tabelkę i skleić w całość:
function get_wp_archives(){ global $wpdb; ?> <table id="archives_table"> <tbody> <?php $set_month = array( 1 => Jan, 2 => Feb, 3 => Mar, 4 => Apr, 5 => May, 6 => Jun, 7 => Jul, 8 => Aug, 9 => Sep, 10 => Oct, 11 => Nov, 12 => Dec ); $years = $wpdb->get_col("SELECT DISTINCT YEAR(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date DESC"); foreach ( $years as $year ){ ?> <tr> <th class="archives_headline"><a href="<?php echo get_year_link($year); ?>"><?php echo $year; ?></a>:</th> <?php $months = $wpdb->get_col("SELECT DISTINCT MONTH(post_date) FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'post' AND YEAR(post_date) = '".$year."' ORDER BY post_date ASC"); $with_posts = array_flip($months); for ( $i = 1 ; $i <= 12 ; $i++ ){ if ( array_key_exists($i, $with_posts) ){ ?> <td><a href="<?php echo get_month_link($year, $i); ?>"><?php echo $set_month["$i"];?></td> <?php } else { ?> <td class="archives_empty"><?php echo $set_month["$i"]; ?></td> <?php } } ?> </tr> <?php } ?> </tbody> </table> <?php } ?>
Voila – całość zapisujemy, otwieramy odpowiedni plik naszego szablonu i dodajemy linijkę:
<?php get_wp_archives(); ?>
Czyż to nie jest genialne? Bardziej wyrachowani „koderzy” z pewnością dodadzą do tej prostej funkcji odpowiednie stylowanie czy wesprą kod za pomocą AJAX’a – jednak nawet bez tego całość działa – nie trzeba już nic zmieniać, skrypt automatycznie wyświetli wszystkie lata i doda linki do miesięcy, w których cokolwiek zostało opublikowane. Nie było tak źle, prawda?
Komentarze
prawda :)
odpowiedzmuszę sobie w końcu dopracować archiwum i chyba skorzystam ;)
jeśli szanujący się szablon nie ma pliku możemy go stworzyć sami. tutaj mam pytanie, czy wp domyślnie najpierw szuka w szablonie pliku functions.php ? czy trzeba mu jakoś w tym pomóc.
odpowiedzDzięki Duszom WordPress automatycznie wyszukuje functions.php – jest to właśnie duże ułatwienie dla developerów :)
odpowiedzNiezłe, niezłe, gdzieś widziałem wtyczkę, która dodawała taką funkcjonalność.
W sumie to mógłbym sobie coś takiego wstawić, ale wolę zostać przy wtyczce Łukasza Sobka :)
odpowiedzPiekne rozwiązanie, aż się skuszę :)
@Riff – odpicowana szata bez potrzeby dodatkowych wtyczek :)
@Rav – tylko nie Sobka ;)
odpowiedzJa się tylko czepię, jeśli mogę ;)
odpowiedzPo wg nie stawiamy kropki :P
hehe no tak bo g to ostatnia litera.
odpowiedzale co do archiwum to sie zastanawiam czy nie zabawić się tym.
@Magda
W takich sytuacjach czepianie się jest wręcz wymagane, przecie tak się uczymy :).
Sądząc po odzewie, chyba napiszę drugą część tego artykułu zatytułowaną „Użyteczne archiwum – wyciskarka zwana jQuery” :). Cieszę się, że wreszcie jest taki pozytywny odzew na wpis na blogu mojego autorstwa (na SajFaju się to nie udaje, heh).
odpowiedzOd jakiegoś czasu myślałem o czymś podobny, tylko nie miałem pojęcia, jak tego dokonać. Zostało mi tylko dostosować kod do moich wymagań. Dziękuje bardzo ;).
odpowiedz@Magda,
Poprawione. Muchos Gracias, Amigo!
@Riff,
jQuery, WordPress, użyteczne…? Dla mnie bomba! Cieszę się niezmiernie, że mogę Twoje artykuły czytać wcześniej niż inni (niach, niach, niach… :-))).
odpowiedzNoo nareszcie jakas solidna porcja dobrze skomentowanego i ciekawego kodu!
Pls wiecej takich 'programistycznych’ wpisow!
odpowiedzCompact Archives
odpowiedzsolidna robota.
odpowiedz[…] na stworzenie strony archiwum jest całkiem sporo (np. według daty ala Problogger) ale dla niektórych ręczne robótki są zbyt skomplikowane i czasochłonne […]
odpowiedz[…] Gdy chcemy napisać coś własnego, skorzystajmy z porad blogu WP-Ninja (link). Administrator doskonale opisał tam, jak zakodować własne archiwum według daty (link). […]
odpowiedzA mam pytanie, dotyczące wpisu… A jeśli bym chciał aby dane archiwum wyświetlało się w następujący sposób.
Maj 2012
[…]
-Wpis 3
-Wpis 2
-Wpis 1
Kwiecień 2012
odpowiedz[…]
-Wpis 3
-Wpis 2
-Wpis 1
Np. jak coś takiego? :-)
odpowiedzDodaj własny komentarz
Odnośniki z innych stron
Lista innych stron, które w jakiś sposób odnoszą się do opublikowanej tutaj treści:
[…] na stworzenie strony archiwum jest całkiem sporo (np. według daty ala Problogger) ale dla niektórych ręczne robótki są zbyt skomplikowane i czasochłonne […]
[…] Gdy chcemy napisać coś własnego, skorzystajmy z porad blogu WP-Ninja (link). Administrator doskonale opisał tam, jak zakodować własne archiwum według daty (link). […]