Wie filtert man Post aus Kategorien nur, wenn die Posts in einer von ihnen erscheinen, nicht die andere?

Das Szenario ist, einige Beiträge haben eine Kategorie, ok. Einige andere haben mehr als eine Kategorie. Ich muss Post mit Inhalt und auch Diashow-Miniaturen für die Verwendung mit Nivo Plugin-Galerie erstellen. OK.

Ich möchte alle Beiträge in der Kategorie “Slideshow” filtern, wenn ich in Indexseiten bin, also verwende ich einfach

query_posts ($ query_string. ‘& cat = -1, -36’);

Kategorie Nummer 1 ist “Nicht definiert” und Nummer 36 ist “Diashow”. OK. Aber … Ich habe einige Beiträge, die eine andere Kategorie haben, sagen wir Nummer 50, “Anwendungen” und ich möchte diese Beiträge zeigen, obwohl sie auch in der Kategorie “Slideshow” sind.

Ich kann nicht den Weg finden, WP zu sagen, “zeige mir Posts, außer denen in den Kategorien 1 und 36, aber zeig sie mir, wenn sie mehr Kategorien haben”.

Googeln und Lesen einer Tonne von Dokumenten und Seiten Ich habe keine Möglichkeit gefunden, die Kategorien per Post zu zählen (nicht, wie viele Beiträge nach Kategorie), vielleicht um eine Abfrage wie “Zeige mir das, filtern, dass AUSSER wenn Anzahl (Kategorien sind meine Post vorhanden)> 2).

Einige Ideen?

Vielen Dank!

Solutions Collecting From Web of "Wie filtert man Post aus Kategorien nur, wenn die Posts in einer von ihnen erscheinen, nicht die andere?"

Ich denke deine Logik ist zu kompliziert. Durch das Einrichten von query_posts() wird im Wesentlichen die MySQL-Abfrage für die database eingerichtet. Auf diese Weise kann die Anzahl der zugewiesenen Kategorien im laufenden Betrieb nicht einfach gezählt werden.

Lass uns deinen Zustand ändern. Anstelle von Posts, die nicht in der Kategorie Slideshow enthalten sind, können wir viel einfachere Posts erstellen, die zu einer anderen Kategorie als Slideshow gehören .

Versuche dies:

 $categories = get_categories( array( 'exclude' => '1,36' ) ); $include = array(); foreach ( $categories as $category ) $include[] = $category->term_id; query_posts( array( 'category__in' => $include ) ); 

PS: Ich würde eine andere Möglichkeit in Erwägung ziehen, Posts für die Slideshow (wie das Meta-Feld) zu markieren und sie nicht mit Kategorien zu kombinieren.

also willst du eine Schleife, die Beiträge zeigt, die in Kat 50 sind, aber nicht in Kat 36?

Ich habe es nicht ausprobiert, aber könntest du sowas machen wie:

 query_posts($query_string . '&cat=50,-36'); 

Wenn dies nicht möglich ist, benötigen Sie alle Post-IDs aus der Kategorie, die Sie ausschließen möchten:

 $excluded_category = WP_Query($query_string . '&cat=36'); //array of just the post info $excluded_posts = $excluded_category->posts;//might be 'post', and not 'posts'?? //get just the ID's of the post into an array foreach ($excluded_posts as $post){ $excluded_post_ids[] = $post->id; } //query for required category $required_category = WP_Query($query_string . '&cat=50'); //start the loop if($required_category->have_posts()):while ($required_category->have_posts()): $required_category->thepost();?> //filter out unwanted category if (!in_array(get_the_ID(),$excluded_post_ids): //your loop here endif; endwhile; endif; 

Dies ist aus dem Speicher, so dass einige Debugging benötigt werden.

Eine andere Methode wäre, benutzerdefinierte Post-Typen anstelle von Standard-Posts zu verwenden. Sie können Taxonomien verwenden, um bei Bedarf verschiedene Post-Typen miteinander zu verbinden.

Um auf dem letzten Kommentar von Rarst aufzubauen, würden Ihre Slideshow-Posts nur einer einzigen Kategorie (oder gar keiner) angehören und Sie würden ein benutzerdefiniertes Feld und einen benutzerdefinierten Wert für Posts erstellen, die in der Slideshow enthalten sein sollen. Dann benutze ‘meta_key’ und ‘meta_value’ in deinem Aufruf von query_posts ().

 query_posts('meta_key=includeInSlideshow&meta_value=true'); 

In diesem Beispiel erstellen Sie ein benutzerdefiniertes Feld namens ‘includeInSlideshow’ und schreiben ‘wahr’ in das Wert-Textfeld im Bereich zum Schreiben von Posts.

Sie können die Standardfrage von WP wie gewohnt auf Ihrer Indexseite mit The Loop füllen lassen.