Czy zdarzyło Ci się kiedyś, że na stronie z rozbudowanym drzewem kategorii, chciałeś ukryć wpisy z podkategorii w widoku archiwum danej kategorii? Z pytaniem tym spotykam się dość często, więc może warto pokazać, jak należy się za to zabrać.

Poniżej znajdziesz kod, który realizuje dokładnie takie zadanie:

function prefiks_exclude_subcategory_from_category_archive( $query ) {
    if ( !is_admin() && $query->is_main_query() && is_category() ) {
        $category_not_in = $query->get( 'category__not_in', array() );

        if ( $query->get('cat', false) ) {
            $query->set('tax_query', array( array(
                'taxonomy' => 'category',
                'operator' => 'IN',
                'terms' => $query->get('cat'),
                'include_children' => false,
            ) ));
        }
    }
}
add_filter( 'pre_get_posts', 'prefiks_exclude_subcategory_from_category_archive' );

Dodatkowe warianty i pytania

A jeśli chciałbym użyć tego kodu względem własnej taksonomii?

Wystarczy wprowadzić kilka drobnych modyfikacji do przedstawionego wyżej kodu. Poniżej wersja zmodyfikowana:

function prefiks_exclude_subterm_from_custom_taxonomy_archive($query) {
    if ( !is_admin() && $query->is_main_query() && is_tax('NAZWA_TAKSONOMII') ) {

        if ( $query->get('NAZWA_TAKSONOMII', false) ) {
            $query->set('tax_query', array( array(
                'taxonomy' => 'NAZWA_TAKSONOMII',
                'field' => 'slug',
                'operator' => 'IN',
                'terms' => $query->get('NAZWA_TAKSONOMII'),
                'include_children' => false,
	    ) ));
        }
    }
}
add_filter( 'pre_get_posts', 'my_pre_get_posts' );

Znalazłem rozwiązanie oparte o query_posts() w szablonie. Dlaczego nie powinienem go używać?

Z dwóch powodów. Przede wszystkim dlatego, że wykonujesz wtedy zupełnie niepotrzebnie dodatkowe zapytanie do bazy danych. Ponadto uniemożliwiasz w ten sposób wtyczkom i motywowi ingerencję w zawartość tego zapytania.