Mostrar publicaciones relacionadas por categoría pero ignorar una categoría

4

Me gustaría mostrar 4 publicaciones relacionadas (sin un complemento) en la parte inferior de mi blog. Sin embargo, quiero excluir una determinada categoría.

Por ejemplo, si mi publicación de blog está en la categoría 2 y 3 , quiero ignorar la categoría 2 y solo buscar publicaciones de la categoría 3 . Aquí está la parte relevante de single.php :

Nota: mi código de abajo actualmente no funciona.

$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);
         /** .. **/
    }
}

Update: La categoría 2 es tan frecuente que quiero ignorarla en la búsqueda, pero no ocultar esos resultados.

Por ejemplo, esta publicación está en la categoría 2 y 3 . Quiero encontrar otras publicaciones con la categoría 3 , y tal vez tengan la categoría 2 , pero solo quiero buscar por categoría 3 .

Actualización 2: Tengo este código a continuación y creo que ahora funciona correctamente:

$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
    ) );
    
pregunta Austin 27.02.2017 - 18:26

3 respuestas

2

Lo que podría recopilar de tu pregunta es:

  1. Desea ignorar una categoría (puede ser más) en la consulta posterior relacionada.

  2. Sin embargo, no desea excluir realmente las publicaciones de esa categoría (en caso de que alguna publicación pertenezca a esa categoría, pero también pertenezca a otra categoría que desea buscar).

Sobre la base de la suposición anterior, puede usar el siguiente CÓDIGO (en los comentarios se proporciona alguna explicación dentro del CÓDIGO):

    // 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();

No puedes usar 'cat' => '-2' o 'category__not_in' => array(2) porque eso excluirá todas las publicaciones que tengan la categoría 2 , incluso si esas publicaciones también tienen otras categorías. Entonces, en lugar de excluir, he ignorado la categoría 2 en la consulta con este CÓDIGO: array_diff( $categories, $cats_to_ignore ); .

  

Nota: He usado WP_Query en lugar de get_posts() porque la iteración con WP_Query se parece más al bucle original. Pero, por supuesto, también puede usar la función get_posts() , ya que llama a WP_Query internamente de todos modos.

    
respondido por el Fayaz 27.02.2017 - 20:34
1

Dale una oportunidad al 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);
) );

Debería funcionar.

Referencia: enlace

    
respondido por el 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
) );
    
respondido por el Austin 27.02.2017 - 20:47

Lea otras preguntas en las etiquetas