Dziś postanowiłem wyświetlić w jednym z projektów pewien banner, który miał się pokazać jedynie w określonej kategorii.
Ponieważ nie była to zwykła kategoria, lecz taksonomia, toteż musiałem nieco kombinować niż użyć zwykłej funkcji WP is_category.
Otóż mam taksonomię 'filmy’.
Struktura kategorii/termów w taksonomii 'filmy’ mam następujące:
– komedie
– – romantyczne
– – nieromantyczne
– thrillery
– sensacyjne
Dla wszystkich wpisów w kategorii komedie (razem podkategoriami) chcę wyświetlić banner.
Próbowałem z has_term, is_tax – bez skutku…
Poniższy kod ułatwił mi życie. W functions.php dodajemy:
//display something only in a certain term of taxonomy function in_term($term,$taxonomy,$post_id=null) { if (has_term($term,$taxonomy,$post_id)) { return true; } $top_term = get_term_by('slug',$term,$taxonomy); if ($top_term) { $children = get_term_children($top_term->term_id,$taxonomy ); if (is_array($children) && !empty($children)) { $post_terms = get_the_terms(get_the_ID(),$taxonomy); foreach ($post_terms as $post_term) { if (in_array($post_term->term_id, $children)) return true; } } } return false; }
Alternatywnie:
//display something only in a certain term of taxonomy function in_term($term, $taxonomy, $post_id =null) { if ( null === $post_id ) { $post_id = get_the_ID(); } if ( has_term($term, $taxonomy, $post_id) ) { return true; } $top_term = get_term_by('slug', $term, $taxonomy); if ( $top_term ) { $children = get_term_children($top_term->term_id, $taxonomy ); if (is_array($children) && !empty($children)) { return has_term( $children, $taxonomy, $post_id ); } } return false; }
A w pliku, w którym chcemy wyświetlić element (np. single.php, sidebar.php) dodajemy:
<?php if (in_term('komedie','filmy') ) { ?> //tutaj wklejamy pożądaną treść <?php } ?>
To rozwiązanie na szczęście obsługuje nie tylko obieżącego terma/kategorię, lecz także kategorie potomne.