wake-up-neo.com

Verwenden Sie einen benutzerdefinierten Taxonomiebegriff für die Suche

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.

31
Norcross

Ich würde das Search Everything Plugin auch empfehlen, aber wenn Sie dies mit der Suchfunktion von WP implementieren möchten, ist hier der 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

37
onetrickpony

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_title und post_content, aber wenn Sie noch etwas einschließen möchten, sollten Sie sich in den posts_search-Filter einbinden.

7
Jan Fabry

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 für mich nicht funktioniert hat, und ich würde eines machen kleine Modifikation:

  1. wenn ich nach einer Zeichenfolge im Titel der Taxonomie gesucht habe, funktioniert sie hervorragend
  2. wenn die Taxonomie Sonderzeichen aufweist, z. mit deutschen "Umlauten" (ö, ä, ü) und man sucht nach oe, ae, ue insteda der Verwendung des Sonderzeichens - Sie müssen die Suche in der Klasse der Taxonomie hinzufü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) {
 globales $ wpdb; 
 if (is_search () && get_search_query ()) 
 $ where. = "OR (((t .name LIKE '% ". get_search_query ()."%' OR t.slug LIKE '% ". get_search_query ()."%') UND {$ wpdb-> posts} .post_status = 'publish ') "; 
 return $ where; 
} 
 
 function 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 tt.term_taxonomy_id = tr.term_taxonomy_id INNER JOIN {$ wpdb-> terms} t ON t.term_id = tt.term_id "; 
 return $ join; 
} 
 
 Funktion custom_search_groupby ($ groupby) {
 globales $ wpdb; 
 
 // Wir müssen die Post-ID 
 $ groupby_id = gruppieren "{$ wpdb-> posts} .ID"; 
 if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) return $ groupby; 
 
 // groupby war leer, benutze unser 
 wenn (! strlen (trim ($ groupby))) $ groupby_id zurückgibt; 
 
 // war nicht leer, füge unser 
 $ groupby. ",". $ groupby_id; 
} 
 
 add_filter ('posts_where', 'custom_search_where'); 
 add_filter ('posts_join', 'custom_search_join'); 
 add_filter ('posts_groupby', 'custom_search_groupby'); 
6
Asped

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

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

3
hakre

Ich fand die Antwort von onetrickpony großartig, aber es behandelt jede Suche als einen einzigen Begriff und behandelt auch keine Suchphrase, die in Anführungszeichen eingeschlossen ist. Ich habe seinen Code (insbesondere die Funktion atom_search_where) 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');
2
Mojamba

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/wie-die-wortpresse-such-such-nach-fragen-taxonomie-terms-and-category-terms

Das Codebeispiel von tkelly hat für mich funktioniert, als der Begriff author in seinem Beispiel durch product_tag gemäß unseren Anforderungen für die Cart-Plugins ersetzt wurde.

1
mroncetwice