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

Spodobał Ci się artykuł? Zapisz się do naszego Newslettera - ZERO SPAMu, same konkrety, oraz dostęp do dodatkowych materiałów przeznaczonych dla subskrybentów!

Na podany adres e-mail otrzymasz od nas wiadomość e-mail, w której znajdziesz link do potwierdzenia subskrypcji naszego Newslettera. Dzięki temu mamy pewność, że nikt nie dodał Twojego adresu przez przypadek. Jeśli wiadomość nie przyjdzie w ciągu najbliższej godziny (zazwyczaj jest to maksymalnie kilka minut) sprawdź folder SPAM.

Patryk

CEO Webinsider.pl, a do tego CTO, CIO, CFO, CMO, CSO, COO i CRO ;-)
Pasjonat nowych technologii - od sprzętu po oprogramowanie, od serwerów po smartfony i rozwiązania IoT. Potencjalnie kiepski bloger, bo nie robi zdjęć "talerza" zanim zacznie jeść.

Dumny przyjaciel swoich psów :-)