webentwicklung-frage-antwort-db.com.de

Bestimmten Begriff von der Suche ausschließen

Es ist möglich, nach Beiträgen mit einem bestimmten Begriff zu suchen, indem Sie die URL anhängen mit:

?&term=abc

Ist es möglich, das Gegenteil zu tun und nach einem bestimmten Begriff zu suchen? So etwas wie:

?&term=NOTabc
6
Rob

Die grundlegende Erklärung

  1. Sie haben ein Template-Tag mit dem Namen is_search(), um festzustellen, ob Sie sich auf einer Suchseite befinden oder nicht.
  2. Dies ruft dann get_search_template() auf, was im Grunde eine Wrapper-Funktion für get_query_template('search') ist.
  3. Wenn Sie sich die letzte Funktion ansehen, werden Sie feststellen, dass sie im Grunde genommen locate_template() ausführt, die auf das Vorhandensein von Dateien prüft und dann eine load_template() ausführt.
  4. Dort wird Ihr $wp_query->query_vars überprüft und der $_template_file extrahiert und geladen.

Ein Hinweis vor über die Abfrage var ...

WordPress verwendet die Abfrage var s, um den gesuchten Begriff in seiner Abfrage zu speichern. Wenn Sie eine benutzerdefinierte Abfragezeichenfolge ausführen, müssen Sie den get_search_query-Filter wie folgt ändern:

/**
 * Modify search query var
 * Doesn't need to be wrapped into esc_attr(), as it's already done by core
 * 
 * @param string $s | The query var to save the search in
 * @return string $s
 */
function change_search_query_var( $s )
{
    $s = 'your_custom_query_var';

    return $s;
}
add_filter( 'get_search_query', 'change_search_query_var', 20, 1 );

Einige Lösung (en)

Wir haben jetzt verschiedene mögliche Lösungen:

Die einfache Lösung

Läuft in der Vorlage und passt besser zum Ausschließen von Taxonomiebedingungen.

A) Holen Sie sich alle Beiträge in der Vorlagenschleife, überprüfen Sie jeden Beitrag in der Schleife für jeden (Taxonomie-) Begriff 1) und dann ausschließen/nicht anzeigen.

In deiner Schleife in deiner Vorlage search.php:

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

        global $post;
        // Skip if the post has the term attached
        if ( is_object_in_taxonomy( 
            $post->ID,
            'YOUR_TAXONOMY',
            array( 'TERM A', 'TERM B', '...' ) 
        )
        continue;
    } 
}

Dies ist nur ein Beispiel für die Schleife.

Die ausgereifte (n) Lösung (en)

Wird ausgeführt, bevor die eigentliche Hauptabfrage ausgeführt wird, und eignet sich besser zum Ausschließen von Begriffen im Allgemeinen.

B.1) Filter den Begriff aus der Suchvorlagenabfrage heraus.

Im folgenden Beispiel verwende ich den posts_clauses-Filter, um Ihnen zu zeigen, dass Sie mit nur einem Filter noch mehr ändern können (machen Sie einen var_dump des $pieces-Arrays, um weitere Einblicke zu erhalten). Sie können auch den Filter posts_where verwenden, der vor dem Klauselfilter ausgeführt wird.

// In your functions.php file
/**
 * Modify the search query where clause
 * Like escapes the term for security reasons
 * 
 * @param array $pieces | The array of post clauses: Where, Group by, etc.
 * @return array $pieces
 */
add_filter( 'posts_clauses', 'alter_search_query', 10, 2 );
function alter_search_query( $pieces, $query )
{
    // Target all search queries in the front-end:
    if( is_admin() || ! $query->is_search() ) return $pieces;

    global $wpdb;
    $term = $wpdb->esc_like( 'YOUR_TERM' );

    $pieces['where'] .= $wpdb->prepare( 
        " AND   {$wpdb->posts}.post_title NOT LIKE '%s'",
        "%{$term}%" 
    );

    return $pieces;
}

B.2) Filtern Sie den Begriff aus der Suchvorlagenabfrage _ performanter und spezifischer heraus.

Im folgenden Beispiel verwende ich den posts_search-Filter, um zu zeigen, wie Sie die where-Klausel nur für die Suchabfrage ändern können. Es ist so ziemlich dasselbe wie der posts_where-Filter.

// In your functions.php file
/**
 * Modify the search query where clause
 * Like escapes the term for security reasons
 * 
 * @param array $pieces | The array of post clauses: Where, Group by, etc.
 * @return array $pieces
 */
add_filter( 'posts_search', 'alter_search_where', 10, 2 );
function alter_search_where( $search_term, $query )
{
    // Target all search queries in the front-end:
    if( is_admin() || ! $query->is_search() ) return $search_term;

    global $wpdb;
    $term = $wpdb->esc_like( 'YOUR_TERM' );

    $search_term .= $wpdb->prepare( 
        " AND   {$wpdb->posts}.post_title NOT LIKE '%s'",
        "%{$term}%" 
    );

    return $search_term;
}

Fußnoten:

1) Sie waren sich nicht sicher, ob es sich um ein search oder ein taxonomy term handelt.

11
kaiser

Sehr detaillierte und gründliche Antwort @kaiser hat oben gepostet. Ich wollte die erste Methode verwenden, aber es sieht so aus, als würde die in Current wp 4.7 verwendete Funktion der ersten Methode nicht funktionieren.

Wir müssen eine andere Funktion verwenden, die von Wordpress aufgerufen wird: has_term anstelle von is_object_in_taxonomy, um nach bestimmten Begriffen in der Taxonomie zu suchen, die dem aktuellen Beitrag zugewiesen ist.

Hier ist der endgültige Code, der mit der Funktion has_term in Ihrer search.php für jede benutzerdefinierte Seitenvorlage, die Sie für die Suchergebnisse verwenden, für mich funktioniert hat. In meinem Fall werden Immobilieneinträge aus der Suche übersprungen, wenn der Eintragsstatus VERKAUFT oder VERMIETET lautet:

if ( have_posts() ) : while ( have_posts() ) : the_post();

//Skip the post if property taxonomy rl_status is sold or rented: 
    if(has_term(array( 'sold', 'rented' ), 'rl_status', get_the_ID() ){

        continue;
            }
0
Mohsin