Zeige verwandte Beiträge nach Kategorie, aber ignoriere eine Kategorie

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

Wenn mein Blogeintrag beispielsweise in Kategorie 2 und 3 lautet, möchte ich Kategorie 2 ignorieren und nur nach Blogposts 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 verbreitet, dass ich sie bei der Suche ignorieren, aber nicht ausblenden möchte.

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

Update 2: Ich habe diesen Code unten und ich glaube, dass es jetzt richtig 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 ) ); 

Solutions Collecting From Web of "Zeige verwandte Beiträge nach Kategorie, aber ignoriere eine Kategorie"

Was ich aus Ihrer Frage gewinnen konnte, ist:

  1. Sie möchten eine Kategorie (möglicherweise mehr) in der zugehörigen Postabfrage ignorieren.

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

Auf der Grundlage der obigen Annahme können Sie den folgenden CODE verwenden (einige Erläuterungen finden Sie im CODE in 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 '

' . get_the_title() . '

'; endwhile; // reset $post after custom loop ends (if you need the main loop after this point) wp_reset_postdata();

Sie können nicht 'cat' => '-2' oder 'category__not_in' => array(2) da dadurch alle Posts der Kategorie 2 , auch wenn diese Posts auch andere Kategorien haben. Also, anstatt 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() da die Iteration mit WP_Query mehr wie die Originalschleife aussieht. Natürlich können Sie auch die function get_posts() verwenden, da sie WP_Query trotzdem intern WP_Query .

Versuchen Sie es mit dem Parameter category__not_in :

 $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

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