Fügen Sie einen benutzerdefinierten Taxonomiebegriff in die Suche ein

33

Ich habe zwei benutzerdefinierte Taxonomien, die auf zwei benutzerdefinierte Beitragstypen angewendet werden. Die Begriffsliste in der Seitenleiste ist in Ordnung und listet alle damit verbundenen Beiträge auf. Wenn Sie jedoch nach einem bestimmten Begriff suchen, wird kein Beitrag mit diesem Begriff angezeigt.

Beispiel: http://dev.andrewnorcross.com/das/all-case-studies/ Nach Begriff "PQRI" suchen

Ich bekomme nichts Irgendwelche Ideen? Ich habe versucht, verschiedene Such-Plug-ins zu verwenden, aber sie stören entweder meine benutzerdefinierten Suchparameter oder funktionieren einfach nicht.

Norcross
quelle
Nocross, können Sie der von Jan vorgeschlagenen Antwort ein Feedback hinzufügen? Suchen Sie wahrscheinlich ein Plugin, das diese Aufgabe erfüllt?
Hakre
Am Ende habe ich den Plan verworfen. Da ich drei separate Suchfunktionen erstellt hatte (basierend auf den unterschiedlichen Anforderungen in bestimmten Bereichen), haben alle von mir getesteten Plugins diese zerstört. Am Ende sagte ich dem Kunden, er solle Begriffe in den Inhalt aufnehmen, wenn sie durchsuchbar sein sollen.
Norcross

Antworten:

36

Ich würde auch das Plugin Search Everything empfehlen , aber wenn Sie dies mit der Suchfunktion von WP implementieren möchten, finden Sie hier den Code, den ich in meinem Atom-Theme verwende:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){
  global $wpdb;
  if (is_search())
    $where .= "OR (t.name LIKE '%".get_search_query()."%' AND {$wpdb->posts}.post_status = 'publish')";
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');

Es basiert auf dem Tag-Search-Plugin: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

ein Trickpony
quelle
1
Das ist großartig - wie kann dieser Code geändert werden, um ein Array von Taxonomie-IDs von der Suche auszuschließen?
HandiworkNYC.com
Es sollte beachtet werden, dass die Filterrückrufe für diese Hooks 2 Argumente akzeptieren ; Die zweite Instanz ist die WP_Query- Instanz, die als Referenz übergeben wird. Alle Überprüfungen für is_search()oder andere WP_Query- Methodenaufrufe ( is_search() is_home()usw.) sollten immer direkt in der Abfrageinstanz aufgerufen werden (z. B. $query->is_search()unter der Annahme, dass der Name der Instanzvariablen $queryin der Rückrufsignatur enthalten ist) und nicht in der Vorlagenfunktion, die sich immer auf die Hauptabfrage bezieht , nicht die Abfrage, für die der Filter ausgeführt wird.
Evan Mattson
4
Auch wahrscheinlich keine gute Idee , um die rohen öffentlich zugänglichen Suchbegriff direkt in eine SQL - Abfrage zu injizieren ... zum Lesen empfohlen
Evan Mattson
Ich möchte nur hinzufügen, dass dies einen Konflikt mit WPML hat, da WPML bereits 'T' im Join-Teil verwendet. Daher behebt die Verwendung von etwas Benutzerdefiniertem anstelle von tr, tt und t dieses Problem
Bobz
7

Ist dies die Standard-WordPress-Suche? Denn das scheint Taxonomien (nicht einmal Standard, wie Kategorien und Tags) in die Suche einzubeziehen. Der Code sucht in post_titleund post_content, aber wenn Sie noch etwas einschließen möchten, sollten Sie sich in den posts_searchFilter einbinden.

Jan Fabry
quelle
5

Ich habe die Lösung von Onetrickpony über https://wordpress.stackexchange.com/a/5404/37612 ausprobiert , was großartig ist, aber ich habe dort ein Problem gefunden, das bei mir nicht funktioniert hat, und ich würde eine kleine Änderung vornehmen:

  1. Wenn ich nach einer Zeichenfolge im Titel der Taxonomie gesucht habe, funktioniert sie hervorragend
  2. Wenn die Taxonomie Sonderzeichen enthält, z. B. mit deutschen "Umlauten" (ö, ä, ü), und nach oe, ae, ue insteda mit dem Sonderzeichen gesucht wird, müssen Sie die Suche in den Slug der Taxonomie einfügen. OR t.slug LIKE '%".get_search_query()."%'

  3. Wenn Sie nach einer Kombination aus einer Suchabfrage und einem Taxonomiefilter suchen, funktioniert dies ebenfalls

  4. Das Problem ist jedoch, dass beim Versuch, nur den Taxonomiefilter zu verwenden, der Suchhaken eine leere Zeichenfolge an die Abfrage anfügt, wenn kein Text gesucht wird. Aus diesem Grund werden ALLE Posts im Ergebnis angezeigt, anstatt nur die aus dem gefilterte Taxonomie. Eine einfache IF-Anweisung löst das Problem. Also wäre der gesamte modifizierte Code dieser (funktioniert perfekt für mich!)

Funktion custom_search_where ($ where) { 
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "OR ((t.name LIKE '%". get_search_query (). "%' OR t.slug LIKE '%". get_search_query (). "%') AND {$ wpdb-> posts} .post_status = 'veröffentlichen') ";
  return $ where;
}

Funktion custom_search_join ($ join) {
  global $ wpdb;
  if (is_search () && get_search_query ())
    $ join. = "LEFT JOIN {$ wpdb-> term_relationships} tr ON {$ wpdb-> posts} .ID = tr.object_id INNER JOIN {$ wpdb-> term_taxonomy} tt ON $ wpdb-> terms} t ON t.term_id = tt.term_id ";
  return $ join;
}

Funktion custom_search_groupby ($ groupby) {
  global $ wpdb;

  // Wir müssen die Post-ID gruppieren
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) return $ groupby;

  // groupby war leer, benutze unsere
  if (! strlen (trim ($ groupby))) $ groupby_id zurückgeben;

  // war nicht leer, hänge unsere an
  $ groupby. ",". $ groupby_id;
}

add_filter ('posts_where', 'custom_search_where');
add_filter ('posts_join', 'custom_search_join');
add_filter ('posts_groupby', 'custom_search_groupby');
Asped
quelle
3

Ich habe den gleichen Informationsstand wie Jan. Ich weiß, dass es auch möglich ist, die Suche mit Plugins zu erweitern.

Wahrscheinlich ist Search Everything (Wordpress Plugin) genau das, wonach Sie suchen. Entsprechend der Featureliste werden jetzt benutzerdefinierte Taxonomien unterstützt.

hakre
quelle
+1 für Search Everything Plugin. Es funktioniert wie erwartet und liefert mehr Ergebnisse als die Standard-Wordpress-Suche.
PNMG
2

Ich fand die Antwort von onetrickpony großartig, aber es behandelt jede Suche als einen einzelnen Begriff und behandelt auch keine Suchphrase, die in Anführungszeichen eingeschlossen ist. Ich habe seinen Code (insbesondere die atom_search_whereFunktion) ein wenig geändert , um mit diesen beiden Situationen fertig zu werden. Hier ist meine modifizierte Version seines Codes:

// search all taxonomies, based on: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

function atom_search_where($where){ 
    global $wpdb, $wp_query;
    if (is_search()) {
        $search_terms = get_query_var( 'search_terms' );

        $where .= " OR (";
        $i = 0;
        foreach ($search_terms as $search_term) {
            $i++;
            if ($i>1) $where .= " AND";     // --- make this OR if you prefer not requiring all search terms to match taxonomies
            $where .= " (t.name LIKE '%".$search_term."%')";
        }
        $where .= " AND {$wpdb->posts}.post_status = 'publish')";
    }
  return $where;
}

function atom_search_join($join){
  global $wpdb;
  if (is_search())
    $join .= "LEFT JOIN {$wpdb->term_relationships} tr ON {$wpdb->posts}.ID = tr.object_id INNER JOIN {$wpdb->term_taxonomy} tt ON tt.term_taxonomy_id=tr.term_taxonomy_id INNER JOIN {$wpdb->terms} t ON t.term_id = tt.term_id";
  return $join;
}

function atom_search_groupby($groupby){
  global $wpdb;

  // we need to group on post ID
  $groupby_id = "{$wpdb->posts}.ID";
  if(!is_search() || strpos($groupby, $groupby_id) !== false) return $groupby;

  // groupby was empty, use ours
  if(!strlen(trim($groupby))) return $groupby_id;

  // wasn't empty, append ours
  return $groupby.", ".$groupby_id;
}

add_filter('posts_where','atom_search_where');
add_filter('posts_join', 'atom_search_join');
add_filter('posts_groupby', 'atom_search_groupby');
Mojamba
quelle
1

Ich habe das gleiche Problem mit dem WooCommerce-Warenkorb-Plugin. Meine Suchergebnisse enthalten nicht den benutzerdefinierten Taxonomiebegriff 'product_tag', da es sich nicht um einen Standard-Post-Tag handelt. In diesem anderen StackOverflow-Thread habe ich eine Lösung zu diesem Thema gefunden:

https://stackoverflow.com/questions/13491828/how-to-amend-wordpress-search-so-it-queries-taxonomy-terms-and-category-terms

Das Codebeispiel von tkelly hat für mich funktioniert, als der Begriff authorin seinem Beispiel durch den ersetzt wurde, den product_tagwir für die Cart-Plugins benötigt haben.

mroncetwice
quelle