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). […]