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ć…
Spis treści w artykule
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' );
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).
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
Wielkie dzięki, ale dla mnie query to ciemna magia :/
Ale jeśli dobrze rozumiem codex, to teraz by uzyskać chmurę tagów dla nie digg’a powinienem zmienić ten element:
query_posts( 'cat=1′ );
na
query_posts( 'cat=-1′ );
I w ten sposób, wykluczam jakaś kategorię. Przynajmniej tak ja odczytują zapis z codex’a
Tak, możesz wykluczyć dając minusa przed ID.
PS. Coś mi w głowie świta (z jakiegoś www lub WordUPów), iż raczej nie powinno się nadużywać query_posts, iż to jest jednak tylko do głównej pętli wpisów.
Wiesz, ogólnie każde mielenie bazy danych można uznać za złe, stąd warto to robić tylko wtedy, gdy ma to jakiś sens, choćby dla nas… W jakiś sposób musisz jednak sprawdzić które tagi są powiązane z postami należącymi do wybranej kategorii, więc trzeba zrobić małe odpytywanie. Czy „query_posts” wykorzystane do tego celu to zło? Przyjęło się, że używa się tego do głównej pętli, a, że kod był bardziej na potrzeby „proof of concept”, niż produkcyjne, to skorzystałem z tego. Specjalnie dla Ciebie (znowu ;-)) dodałem drugi sposób, tym razem z wykorzystaniem „WP_Query”. Pewnie można by jeszcze spróbować z get_posts(), ale… to już ewentualnie zostawiam Tobie :-)
Ogólnie ten kod można by jeszcze trochę „uprościć”, choćby „łącząc pętle”, ale zdecydowałem się je rozbić, by łatwiej pokazać co i dlaczego się wykonuje. Pamiętaj też, że ja jestem bardziej adminem niż programistą, stąd do niektórych rzeczy mogę podchodzić trochę bardziej „liberalnie”, niż osoby, które żyją z pisania kodu.
Bardziej mi chodziło, iż mi gdzieś świtało z tyłu głowy, iż powinno się używać jakieś innej funkcji do tego.
Też czytałem kiedyś różne takie, że „query_posts” to tylko główna pętla, dalej lepiej stosować „WP_Query”, a w ogóle najlepiej to może „get_posts” (kusi sprawdzić, ale…). Ale jaki to ma realny wpływ na wydajności, i ile w tym faktycznie sensu, a ile „tak bo tak” to nie wiem. Może też wzięło się to z tego, że nie wszyscy na koniec używają „wp_reset_query()”, by zresetować, i robi się jakiś bałagan.
Pomógł byś mi zrobić z tego np. shorcode dla Snippet? Bo mi coś nie idzie, domyślam się gdzie mam błąd. Ale nie mam pomysł jak go usunąć – obstawiam, iż chodzi o to iż w funkcji definiującej shortcode chce uruchomić wp_tag_cloud
Jak zrobić shortcodes w WordPressie pisałem w tym artykule. Ogólnie kod „chmurki” wstawiasz między:
Kod do użycia:
Można jeszcze prewencyjnie return obudować:
Na wszelki wypadek, by na WP chmurki w WP-Admin nie wyświetlił... ;-)
Prawie działa ?
Faktycznie zapomniałem o return dla wp_tag_cloud
Ale na razie mam inny problem, chodzi o to iż, chmura pokazuje się we złym miejscu. Tak jakby korzystała z jakiegoś hooka i przypinała się na treścią. > https://mojprzystanek.pl/test_cloud_tag/
Co prawda w docelowym rozwiązaniu, shortcody chcę wykorzystać w widgetach, ale w treści też powinno działać.
PS. Do tego w moim przypadku, znalazłem jeszcze jeden błąd, ale on tu niema zastosowania.
U mnie gdy dam w kontent to ucieka tuż pod obrazek wpisu, ale ja mam trochę poprzestawiane priorytety dla różnych komponentów związanych z generowaniem strony wpisu/artykułu. W widżetach działa prawidłowo. Wygląda na to, że może być tak jak piszesz, i w momencie gdy wstawiamy ją w kontent (treść wpisu/strony), to ucieka do góry. Trzeba by zerknąć dokładnie w kod tej funkcji, bo ona raczej nie była projektowana do umieszczania chmurki w treści, a właśnie w widżetach, czy ogólnie w strukturze motywu za pomocą PHP.
Co do return – chyba dobrze go dać, ale jak testowałem u siebie, to działa i bez tego…
To do widgetu lepiej dać kod via shortcode czy php? I jak?
Nie ma większego znaczenia – shortcodes są już chyba w standardzie w widżetach obsługiwane. W przypadku PHP może się przydac np. wtyczka Enhanced Text Widget.
Niestety, jak tam go w wigdety to też ucieka nad kontener w którym się znajdują. Na razie, niech będzie. Ale muszę poszukać rozwiązanie czemu tak się dzieje.