Mostrar postagens relacionadas por categoria, mas ignorar uma categoria

4

Gostaria de mostrar 4 posts relacionados (sem um plugin) na parte inferior do meu blog. No entanto, quero excluir uma determinada categoria.

Por exemplo, se a postagem do meu blog estiver na categoria 2 e 3 , desejo ignorar a categoria 2 e procurar somente as postagens de blog da categoria 3 . Aqui está a parte relevante de single.php :

Observação: meu código abaixo não está funcionando no momento.

$related = get_posts( array(
    'category__in'  => wp_get_post_categories( $post->ID ),
    'numberposts'   => 4,
    'orderby'       => 'date',
    'post__not_in'  => array( $post->ID ),
    'cat'           => '-2'
) );

if( $related ) { 
    foreach( $related as $post ) {
        setup_postdata($post);
         /** .. **/
    }
}

Atualização: A categoria 2 é tão predominante que desejo ignorá-la na pesquisa, mas não ocultar esses resultados.

Por exemplo, esta postagem está na categoria 2 e 3 . Quero encontrar outras postagens com categoria 3 e talvez elas tenham categoria 2 , mas eu só quero pesquisar por categoria 3 .

Atualização 2: Eu tenho este código abaixo e acredito que agora está funcionando corretamente:

$cat_ids = get_the_category();
if( ! empty( $cat_ids ) ) {
    $post_cat_ids = array();
    foreach( $cat_ids as $cat_id ) {
        if( $cat_id->cat_ID != 2 ) {
            $post_cat_ids[] = $cat_id->cat_ID;
        }
    }
}

$related = get_posts( array(
    'category__in' => wp_get_post_categories( $post->ID ),
    'numberposts' => 4,
    'orderby' => 'date',
    'exclude' => array( $post->ID ),
    'category' => $post_cat_ids
    ) );
    
por Austin 27.02.2017 / 18:26

3 respostas

2

O que eu pude recolher da sua pergunta é:

  1. Você deseja ignorar uma categoria (pode ser mais) na consulta post relacionada.

  2. 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 de get_posts() porque a iteração com WP_Query parece mais com o loop original. Mas é claro que você pode usar a função get_posts() também, já que chama WP_Query internamente de qualquer maneira.

    
por Fayaz 27.02.2017 / 20:34
1

Dê uma olhada no parâmetro category__not_in :

$related = get_posts( array(
    'numberposts'   => 4,
    'orderby'       => 'date',
    'category__in'  => wp_get_post_categories( $post->ID ),
    'category__not_in' => array(2);
) );

Deve funcionar.

Referência: enlace

    
por Rahul Arora 27.02.2017 / 18:45
0
$cat_ids = get_the_category();

if( ! empty( $cat_ids ) ) {
    $post_cat_ids = array();

    foreach( $cat_ids as $cat_id ) {
        if( 2 != $cat_id->cat_ID ) {
            $post_cat_ids[] = $cat_id->cat_ID;
        }
    }
}

$related = get_posts( array(
    'category__in'  => wp_get_post_categories( $post->ID ),
    'numberposts'   => 4,
    'orderby'       => 'date',
    'exclude'       => array( $post->ID ),
    'category'      => $post_cat_ids
) );
    
por Austin 27.02.2017 / 20:47