it-swarm.com.de

Alle benutzerdefinierten Posts, die NICHT in einem Taxonomiebegriff enthalten sind, von der Suche ausschließen

Ich habe einen benutzerdefinierten Post mit einer damit verknüpften Taxonomie. Diese Taxonomie hat nur einen Begriff, und Posts gehören entweder dazu oder nicht, auf boolesche Weise.

In den Suchergebnissen möchte ich die benutzerdefinierten Posts anzeigen, die zur Taxonomie gehören, und nicht die Posts, die nicht zur Taxonomie gehören. Ich habe mir zwei Möglichkeiten ausgedacht, um dies zu erreichen, bin mir aber nicht sicher, welche die beste ist:

  • nur benutzerdefinierte Posts einschließen, die zum Taxonomiebegriff gehören.
  • alle benutzerdefinierten Posts ausschließen, die nicht zum Taxonomiebegriff gehören.

Ich habe es geschafft, genau das Gegenteil von dem zu tun, was ich will, mit dem folgenden Code:

global $query_string;
$query_args = explode("&", $query_string);
$search_query = array();
foreach($query_args as $key => $string) {
    $query_split = explode("=", $string);
    $search_query[$query_split[0]] = urldecode($query_split[1]);
}

$custom_query = array();
$custom_query['tax_query'][] = array( 'taxonomy' => 'tax-whatever', 'terms' => array('term-whatever'), 'field' => 'slug', 'operator' => 'NOT IN' );
$args = array_merge( $wp_query->query, $custom_query );
query_posts( $args );

$search = new WP_Query($search_query);

Dies gibt natürlich alle benutzerdefinierten Posts aus, die NICHT im Begriff sind - was auch immer. Wie kann ich genau das Gegenteil erreichen?

EDIT

Ich werde versuchen, mein Problem ein bisschen besser zu erklären. Nehmen wir ein Beispiel.

Stellen Sie sich vor, ich habe eine Taxonomie mit dem Namen "Ausgewählt" und nur ein Taxonomiebegriff mit dem Namen "Ja", den Benutzer mit einem Kontrollkästchen auswählen können. Ich nehme an, ich hätte zwei Kontrollkästchen ("Ja" und "Nein") verwenden sollen, aber ich dachte, dass es zu der Zeit nicht viel Sinn machte.

Wenn Benutzer auf der Website nach etwas suchen, werden alle Seiten, Beiträge und benutzerdefinierten Beiträge in den Ergebnissen angezeigt. Das einzige, was ich aus den Suchergebnissen entfernen möchte, sind die benutzerdefinierten Posts die nicht mit dem Taxonomiebegriff "Ja" verknüpft sind , wobei der Rest so bleibt, wie er ist. Dies bedeutet, dass ich alle Seiten, Posts und benutzerdefinierten Posts mit "Ja" ausgeben möchte.

Irgendwelche Ideen, wie ich das erreichen kann? Vielen Dank.

UPDATE

Ich hatte folgende Idee: Kann ich auf irgendeine Weise zwei Abfragen durchführen und die Ergebnisse zusammenführen?

  • Eine Abfrage mit allen Beiträgen und Seiten außer dem benutzerdefinierten Beitrag ('exclude_from_search' => true);
  • Andere Abfrage mit nur den benutzerdefinierten Posts, die dem Taxonomiebegriff entsprechen ($custom_query['tax_query'][] = array( 'taxonomy' => 'tax-whatever', 'terms' => array('term-whatever'), 'field' => 'slug', 'operator' => 'IN' );).

Wenn ich jedoch etwas verwende wie:

$mergedposts = array_merge( $wp_query->query, $custom_query );
query_posts( $mergedposts );

Es werden nur die benutzerdefinierten Beiträge angezeigt.

Ich nehme an, ich könnte eine direkte Abfrage mit SQL durchführen, aber ich habe noch nie damit gearbeitet. Auch wenn ich das in Zukunft gerne lernen würde, scheint es momentan kein guter Weg zu sein, um diese Art von Problem zu lösen, da ich nicht verstehe, was ich tue.

Derzeit ist es meine bisher beste Option, einen neuen Taxonomiebegriff zu erstellen und alle "nicht kategorisierten" benutzerdefinierten Posts damit zu klassifizieren. Da es sich jedoch um einige Hundert handelt, wird es eine Weile dauern.

NEUES UPDATE

Ich habe eine Methode gefunden, um festzustellen, ob ein benutzerdefinierter Beitrag zu einem bestimmten Begriff in einer Taxonomie gehört. Dies ist ein Teil des Codes, den ich irgendwo aufgegriffen habe, da ich nicht die PHP Kenntnisse habe, um so etwas alleine zu erstellen. Ich verstehe jedoch, was getan wird und habe es an meine Situation angepasst.

function is_selected( $selected, $_post = null ) {
    if ( empty( $selected ) )
        return false;

    if ( $_post )
        $_post = get_post( $_post );
    else
        $_post =& $GLOBALS['post'];

    if ( !$_post )
        return false;

    $r = is_object_in_term( $_post->ID, 'selected', $selected );

    if ( is_wp_error( $r ) )
        return false;

    return $r;
}

Diese Funktion funktioniert korrekt, jedoch nur, wenn sie innerhalb der Schleife verwendet wird. Wenn ich jedoch die Schleife ändere, nachdem die Suchabfrage durchgeführt wurde, kann dies die Paginierung durcheinander bringen, und die Anzahl der gefundenen Ergebnisse ist möglicherweise falsch.

Ich bin mir nicht sicher, ob dies ein Schritt in die richtige Richtung ist, aber zumindest ein Schritt.

3
Cthulhu

Nachdem Sie Ihre überarbeitete Frage gelesen haben, war es einfacher zu verstehen, was Sie versuchen zu tun. Meine neue Lösung sieht in erster Linie so aus, wie Sie es wollten: Sie schließt nur alle Posts aus, die von Ihrem benutzerdefinierten Typ sind, aber nicht mit dem "Ja" -Term verknüpft sind:

$custom_query = array();
$custom_query['post_type'] = 'any';

// first, query all the posts of your custom type
// that don't have the "yes"-term:
$tmp_wp_query = new WP_Query(array(
    'posts_per_page' => -1,
    'fields' => 'ids',
    'post_type' => 'your-post-type',
    'tax_query' => array(array(
        'taxonomy' => 'tax-whatever', 'terms' => array('term-whatever'),
        'field' => 'slug', 'operator' => 'NOT IN'
    ))
));

if(!empty($tmp_wp_query->posts)) {
    // Exclude the "yes"-less posts from the actual post query
    $custom_query['post__not_in'] = $tmp_wp_query->posts;
}

// now proceed with your original code and execute the definitive query
$args = array_merge( $wp_query->query, $custom_query );
query_posts( $args );

$search = new WP_Query($search_query);

Der einzige Nachteil ist, dass jetzt zwei Abfragen ausgeführt werden müssen. Die erste Abfrage ist jedoch relativ leicht, sodass der Leistungsverlust nicht so groß sein sollte.

6
vstm