it-swarm.com.de

Ähnliche Beiträge nach Kategorie anzeigen, aber eine Kategorie ignorieren

Ich möchte 4 verwandte Beiträge (ohne Plugin) am Ende meines Blogs anzeigen. Ich möchte jedoch eine bestimmte Kategorie ausschließen.

Wenn sich mein Blogeintrag beispielsweise in den Kategorien 2 und 3 befindet, möchte ich die Kategorie 2 ignorieren und nur nach Blogeinträgen der Kategorie 3 suchen. Hier ist der relevante Teil von single.php:

Hinweis: mein Code unten funktioniert derzeit nicht.

$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: Kategorie 2 ist so weit verbreitet, dass ich ihn bei der Suche ignorieren möchte, aber diese Ergebnisse nicht verstecke.

Dieser Beitrag befindet sich beispielsweise in den Kategorien 2 und 3. Ich möchte andere Beiträge mit der Kategorie 3 finden, und möglicherweise haben sie die Kategorie 2, aber ich möchte nur nach der Kategorie 3 suchen.

Update 2: Ich habe diesen Code unten und glaube, dass er jetzt korrekt funktioniert:

$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
    ) );
4
Austin

Was ich aus Ihrer Frage entnehmen könnte, ist:

  1. Sie möchten eine Kategorie (möglicherweise mehrere) in der zugehörigen Post-Abfrage ignorieren.

  2. Sie möchten jedoch die Posts nicht tatsächlich aus dieser Kategorie ausschließen (falls ein Post zu dieser Kategorie gehört, sondern auch zu einer anderen Kategorie, nach der Sie suchen möchten).

Basierend auf der obigen Annahme können Sie den folgenden CODE verwenden (eine Erläuterung finden Sie im CODE in den Kommentaren):

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

Sie können 'cat' => '-2' oder 'category__not_in' => array(2) nicht verwenden, da dadurch alle Posts mit der Kategorie 2 ausgeschlossen werden, auch wenn diese Posts auch andere Kategorien haben. Anstatt also auszuschließen, habe ich die Kategorie 2 in der Abfrage mit diesem CODE ignoriert: array_diff( $categories, $cats_to_ignore );.

Hinweis: Ich habe WP_Query anstelle von get_posts() verwendet, da die Iteration mit WP_Query eher der ursprünglichen Schleife ähnelt. Natürlich können Sie auch die Funktion get_posts() verwenden, da sie WP_Query ohnehin intern aufruft.

2
Fayaz

Probieren Sie den Parameter category__not_in aus:

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

Es sollte funktionieren.

Referenz: https://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters

1
Rahul Arora
$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
) );
0
Austin