O que eu pude recolher da sua pergunta é:
-
Você deseja ignorar uma categoria (pode ser mais) na consulta post relacionada.
-
No entanto, você não deseja realmente excluir as postagens dessa categoria (no caso de qualquer postagem pertencer a essa categoria, mas também pertencer a outra categoria que você deseja procurar).
Com base na suposição acima, você pode usar o seguinte CÓDIGO (alguma explicação é dada dentro do CÓDIGO nos comentários):
// set the category ID (or multiple category IDs)
// you want to ignore in the following array
$cats_to_ignore = array( 2 );
$categories = wp_get_post_categories( get_the_ID() );
$category_in = array_diff( $categories, $cats_to_ignore );
// ignore only if we have any category left after ignoring
if( count( $category_in ) == 0 ) {
$category_in = $categories;
}
$cat_args = array(
'category__in' => $category_in,
'posts_per_page' => 4,
'orderby' => 'date',
'post__not_in' => array( get_the_ID() )
);
$cat_query = new WP_Query( $cat_args );
while ( $cat_query->have_posts() ) : $cat_query->the_post();
/* just example markup for related posts */
echo '<h2><a href="' . get_the_permalink() . '">' . get_the_title() . '</a></h2>';
endwhile;
// reset $post after custom loop ends (if you need the main loop after this point)
wp_reset_postdata();
Você não pode usar 'cat' => '-2'
ou 'category__not_in' => array(2)
porque isso excluirá todas as postagens com categoria 2
, mesmo que essas postagens tenham outras categorias também. Portanto, em vez de excluir, ignorei a categoria 2
na consulta com este CÓDIGO: array_diff( $categories, $cats_to_ignore );
.
Observação: usei
WP_Query
em vez deget_posts()
porque a iteração comWP_Query
parece mais com o loop original. Mas é claro que você pode usar a funçãoget_posts()
também, já que chamaWP_Query
internamente de qualquer maneira.