This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

Kilka tygodni temu miałem przyjemność odpoczywać po ciężkim semestrze na wyjeździe narciarskim. Zostałem wtedy poproszony o pomoc w ulepszeniu funkcjonalności bloga Duszpasterstwa Akademickiego “Drzewo Życia”, a konkretnie doinstalowaniu i skonfigurowaniu pewnych wtyczek do instalacji WordPressa. Ze względu na to, że jest to jeden z serwisów o który dbam jako administrator serwera, usiadłem przy komputerze z resztą “adminów” i zaczęliśmy kombinować nad stroną.

Wstęp.

Zainstalowaliśmy więc kilka wtyczek, z których większość pochodziła z moich sugestii i doświadczeń przy korzystaniu z WordPressa [nie ma to jak skromność, co nie? ;]]. Jedna z nich - SideBlog - o którym już kiedyś pisałem, udostępnia możliwość wstawienia w pasku bocznym “minibloga” zawierającego krótkie, informacyjne wpisy. Aby tego dokonać, należy stworzyć nową kategorię przeznaczoną na rzeczone posty i wskazać ją w ustawieniach wtyczki. Spowoduje to automatyczne wyrzucenie danej kategorii z “głównego strumienia” - wpisy nie będą się pokazywać na stronie głównej bloga, jedynie w miniblogu i archiwum kategorii. Wszystko byłoby bardzo fajne, gdyby nie szablon, z którego korzystał blog Duszpasterstwa. Magazeen, bo tak mu “na imię”, posiada dosyć ciekawą funkcję pokazywania listy ostatnich wpisów w formie listy obrazków - ikonek użytych przy ich pisaniu.

Problem.

Problem polegał na tym, że chcieliśmy wyrzucić wpisy z minibloga także z listy ostatnio dodanych postów. Ze względu na to, że jest to własny "feature" szablonu, nie mogliśmy oczywiście skorzystać z opcji wtyczki, bo ona nie miała dostępu do tego typu rzeczy. Zająłem więc miejsce przed ekranem i zacząłem dłubać w kodzie szablonu, próbując dowiedzieć się w jaki sposób są pobierane dane do wyświetlenia. Kod, który odpowiada za wyświetlenie całego bloku wyglądał następująco:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<div id="latest-dock">

	<div class="dock-back container clearfix">

		<div class="latest">
			Zobacz najnowsze wpisy:
		</div>

		<ul id="dock">
			<?php
				$dock = new WP_Query();
				$dock->query( 'showposts=[id kategorii minibloga]' );
				while( $dock->have_posts() ) : $dock->the_post();
			?>
			<li>
				<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>">
				<img src="<?php bloginfo( 'template_directory' ); ?>/timthumb.php?src=<?php echo get_post_meta( $post->ID, "image_value", true ); ?>&amp;w=69&amp;h=54&amp;zc=1" alt="<?php the_title(); ?>" />
				</a>
				<span><?php the_title(); ?></span>
			</li>
			<?php
				endwhile;
			?>
		</ul>

	</div><!-- End container -->

</div><!-- End latest-dock -->

Mnie oczywiście zainteresował początkowy fragment, a konkretnie linijki:

1
2
3
4
5
<?php
	$dock = new WP_Query();
	$dock->query( 'showposts=[id kategorii minibloga]' );
	while( $dock->have_posts() ) : $dock->the_post();
?>

Widzimy, że został użyty obiekt klasy WP_Query, którego działanie w metodzie query() zostało skonfigurowane przez podanie ciągu znaków [no dobra, stringa. ;]] żądania. Nawiasem mówiąc jest to genialny sposób na ponowne wykorzystanie parsera adresów URL - nie tylko do przyjmowania żądań “z zewnątrz”.

Rozwiązanie.

Rozwiązanie jest bardzo proste, chociaż za pierwszym razem miałem duże trudności ze znalezieniem informacji na temat parametrów, które można przekazać w takim żądaniu. Po przejrzeniu kilku stron trafiłem w końcu na odpowiednią. Wynikało z niej, że wystarczy umieścić parametr "cat" z identyfikatorem danej kategorii poprzedzonym znakiem minusa - spowoduje to wyłączenie jej z wyników wyszukiwania. Akapit ze wspomnianego wcześniej "kodeksu" WordPressa:
Exclude Posts Belonging to Only One Category

Show all posts except those from a category by prefixing its ID with a ‘-’ (minus) sign.

query_posts(‘cat=-3’);

This excludes any post that belongs to category 3.

Wobec czego, jeśli chcemy wyrzucić kategorię o identyfikatorze “16”, nad kod powinien wyglądać następująco:

1
2
3
4
5
<?php
	$dock = new WP_Query();
	$dock->query( 'showposts=[id kategorii minibloga]&amp;cat=-16' );
	while( $dock->have_posts() ) : $dock->the_post();
?>

Jeśli chcielibyście wyrzucić więcej niż jedną - odpowiednie identyfikatory należy rozdzielić przecinkiem. Nie pytajcie, dlaczego w “kodeksie” została umieszczona funkcja “query_posts()”, a nie metoda query() z klasy WP_Query - to działa, te parametry są używane wymiennie. W takim wypadku cieszymy się po prostu wyłączoną kategorią z zapytania.

Podsumowanie.

Pewnie się Wam nie spodoba dzisiejszy wpis, w którym jest więcej wstępu niż merytorycznie bogatych informacji, ale w statystykach widzę czego szukają Internauci i uwierzcie mi, że o ten problem pytało już co najmniej kilkanaście osób. W każdym razie zainteresowanym powinno się przydać. ;]