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:

<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:

<?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:

<?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ć. ;]