Tworzysz stronę internetową i potrzebujesz pomocy?

W komentarzach pod artykułem o RODO (Praktyczne aspekty Rozporządzenia o Ochronie Danych Osobowych (RODO/GDPR) w działalności internetowej) dyskusja trochę zboczyła na boczne tory, i dotarła do wyświetlania chmurki tagów, ale tylko dla artykułów (postów) z wybranej kategorii. Zagadnienie (wyzwanie ;-)) w sumie ciekawe, więc postanowiłem mu się przyjrzeć…

WordPress i chmura tagów dla postów z wybranej kategorii

WordPress w standardzie posiada funkcję, które pozwala nam wyświetlić właściwie w dowolnym miejscu chmurkę tagów, które są wykorzystywane przy artykułach:

wp_tag_cloud(); 

Mamy tu nawet jakieś wbudowane możliwości personalizacji wyników, ale brak (przynajmniej) jednej opcji, która w niektórych przypadkach by się przydała:

Bardziej mi zależy, na tagu tylko na digg, by łatwiej było mi szukać, co mam w digg.

(…)

Z tego co ja czytałem (i zrozumiałem) dokumentację, to mogę wykluczyć co najwyżej jakieś tagi, ale dla mnie tagi są uniwersalne dla digg i nie digg.

Uznałem, że wprawdzie w standardzie opcji, by przefiltrować chmurkę do tagów tylko z wybranej kategorii nie mamy, ale od czego mamy – na potrzeby przećwiczenia koncepcji – query_post(), dzięki czemu możemy przefiltrować posty należące np. do wybranej kategorii:

query_posts( 'category_name=slug-kategorii' );

Zdecydowałem się skorzystać ze sluga kategorii, ale można równie dobrze skorzystać z ID kategorii:

query_posts( 'cat=1' );

Ogólnie, dzięki skorzystaniu z tej metody możemy dość dowolnie przefiltrować artykuły (posty), z którymi w dalszej kolejności będziemy pracować…

W dalszej kolejności to już operacje (w pętli) na przefiltrowanych artykułach, z których na potrzeby naszej chmurki tagów wyciągamy skojarzone z artykułami tagi, które następnie – po małej obróbce – podstawiamy jako argumenty do standardowej funkcji odpowiedzialnej za wyświetlenie chmury tagów:

<?php

query_posts( 'category_name=slug-kategorii' );
if ( have_posts() ) {
	while ( have_posts() ) {

		the_post();

		$PostTags = get_the_tags();
			if ( $PostTags) {
				foreach( $PostTags as $Tag ) {
					$CategoryTagsArray[] = $Tag -> term_id;
				}
			}

	} 
}
wp_reset_query();

$CloudTagArgs = array( 'include' => implode( ',', array_unique( $CategoryTagsArray ) ) );

wp_tag_cloud( $CloudTagArgs ); 

?>

W warunkach produkcyjnych zamiast „query_posts” lepiej chyba będzie skorzystać z „WP_Query”, co wymaga nieznacznej modyfikacji kodu:

<?php

$query = new WP_Query( array( 'category_name' => 'artykul-sponsorowany' ) );

if ( $query->have_posts() ) {
	while ( $query->have_posts() ) {

		$query->the_post();

		$PostTags = get_the_tags();
			if ( $PostTags) {
				foreach( $PostTags as $Tag ) {
					$CategoryTagsArray[] = $Tag -> term_id;
				}
			}

	} 
}

$CloudTagArgs = array( 'include' => implode( ',', array_unique( $CategoryTagsArray ) ) );

wp_tag_cloud( $CloudTagArgs ); 

?>

Powyższy kod PHP (jeden lub drugi, ale lepiej chyba drugi) wystarczy wstawić w miejscu, gdzie chcemy wyświetlić tak zmodyfikowaną chmurkę tagów (można też np. stworzyć krótki kod, który powinien znacznie uprościć wykorzystanie).

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Tworzysz stronę internetową i potrzebujesz pomocy?
Patryk
Kurs "WordPress: Pierwsze kroki" (na dobry początek)