Zachęcam do udziału w konferencji nt. WordPressa - WordCamp Lublin 2017

publikacja: 23 września 2008, autor: , komentarzy 17 https://wpninja.pl/artykuly/kodujemy-uzyteczne-archiwum-wpisow-wg-daty/

Kodujemy użyteczne archiwum wpisów wg daty

Kodujemy użyteczne archiwum wpisów wg daty

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?

tagi:

Komentarze

  1. rzepak 9 lat temu:

    prawda :)
    muszę sobie w końcu dopracować archiwum i chyba skorzystam ;)

    odpowiedz
  2. oloo 9 lat temu:

    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.

    odpowiedz
  3. Wojciech Usarzewicz 9 lat temu:

    Dzięki Duszom WordPress automatycznie wyszukuje functions.php – jest to właśnie duże ułatwienie dla developerów :)

    odpowiedz
  4. Ravicious 9 lat temu:

    Niezł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 :)

    odpowiedz
  5. TopBlogger 9 lat temu:

    Piekne rozwiązanie, aż się skuszę :)

    @Riff – odpicowana szata bez potrzeby dodatkowych wtyczek :)

    @Rav – tylko nie Sobka ;)

    odpowiedz
  6. Magda 9 lat temu:

    Ja się tylko czepię, jeśli mogę ;)
    Po wg nie stawiamy kropki :P

    odpowiedz
  7. dzg 9 lat temu:

    hehe no tak bo g to ostatnia litera.
    ale co do archiwum to sie zastanawiam czy nie zabawić się tym.

    odpowiedz
  8. Wojciech Usarzewicz 9 lat temu:

    @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).

    odpowiedz
  9. Michał Cichocki 9 lat temu:

    Od 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
  10. Szymon Skulimowski 9 lat temu:

    @Magda,
    Poprawione. Muchos Gracias, Amigo!

    @Riff,

    Sądząc po odzewie, chyba napiszę drugą część tego artykułu zatytułowaną „Użyteczne archiwum – wyciskarka zwana jQuery” :).

    jQuery, WordPress, użyteczne…? Dla mnie bomba! Cieszę się niezmiernie, że mogę Twoje artykuły czytać wcześniej niż inni (niach, niach, niach… :-))).

    odpowiedz
  11. Grzesiek 9 lat temu:

    Noo nareszcie jakas solidna porcja dobrze skomentowanego i ciekawego kodu!

    Pls wiecej takich ‚programistycznych’ wpisow!

    odpowiedz
  12. b4it 9 lat temu:

    Compact Archives

    odpowiedz
  13. taniaodziez.com.pl 9 lat temu:

    solidna robota.

    odpowiedz
  14. Levre 5 lat temu:

    A 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
    […]
    -Wpis 3
    -Wpis 2
    -Wpis 1

    odpowiedz
    1. Szymon Skulimowski 5 lat temu:

      Np.  jak coś takiego? :-)

      odpowiedz

Dodaj własny komentarz

Odnośniki z innych stron

Lista innych stron, które w jakiś sposób odnoszą się do opublikowanej tutaj treści:

  1. Clean Archive Reloaded: piękne archiwum

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

  2. Efektowne i efektywne archiwum wpisów | Custom Blog

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