Includi termini di tassonomia personalizzati nella ricerca


33

Ho due tassonomie personalizzate applicate a due tipi di post personalizzati. l'elenco dei termini sulla barra laterale va bene ed elencherà tutti i post ad esso associati. Tuttavia, se cerchi uno dei termini in particolare, non viene visualizzato un post con quel termine.

Esempio: http://dev.andrewnorcross.com/das/all-case-studies/ Cerca il termine "PQRI"

Non ho niente. Qualche idea? Ho provato a utilizzare vari plug-in di ricerca, ma essi interrompono i miei parametri di ricerca personalizzati o semplicemente non funzionano.


Nocross, puoi aggiungere un feedback alla risposta proposta da Jan? Probabilmente stai cercando un plug-in che funzioni?
Hakre,

Ho finito per abbandonare il piano. Da quando avevo creato 3 funzioni di ricerca separate (basate su esigenze diverse in determinate aree), tutti i plugin che ho testato hanno rotto quelle. Alla fine, ho detto al cliente di includere termini nel contenuto se lo desideravano ricercabili.
Norcross,

Risposte:


36

Consiglierei anche il plug-in Cerca tutto , ma se vuoi implementarlo usando la funzione di ricerca di WP, ecco il codice che sto usando nel mio tema Atom:

// 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');

Si basa sul plug-in Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23


1
Questo è fantastico: come è possibile modificare questo codice per escludere una serie di ID tassonomia dalla ricerca?
HandiworkNYC.com il

Va notato che i callback del filtro per questi hook accettano 2 argomenti; la seconda per tutte è l' istanza WP_Query che viene passata per riferimento. Qualsiasi controllo per is_search()o altre chiamate al metodo WP_Query ( is_search() is_home()ecc.) Deve sempre essere chiamato direttamente sull'istanza della query (ad es. $query->is_search()Supponendo che il nome della variabile di istanza sia $querynella firma del callback) piuttosto che la funzione template che farà sempre riferimento alla query principale , non la query per cui è in esecuzione il filtro.
Evan Mattson,

4
Inoltre, probabilmente non è una buona idea iniettare la stringa di ricerca non disponibile pubblicamente direttamente direttamente in una query SQL ... lettura consigliata
Evan Mattson

Vorrei solo aggiungere che questo è in conflitto con WPML perché WPML alredy usa 'T' nella parte di join, quindi usando qualcosa di personalizzato invece di tr, tt e t risolve questo problema
Bobz

7

È questa la ricerca standard di WordPress? Perché ciò non sembra includere tassonomie (nemmeno standard, come categorie e tag) nella ricerca. Il codice cerca in post_titlee post_content, ma se vuoi includere qualcos'altro devi agganciarti al posts_searchfiltro.


5

Ho provato la soluzione di Onetrickpony sopra https://wordpress.stackexchange.com/a/5404/37612 , il che è fantastico, ma ho trovato un problema lì, che non ha funzionato per me, e farei una piccola modifica:

  1. se ho cercato una stringa nel titolo della tassonomia, funziona benissimo
  2. se la tassonomia ha caratteri speciali, ad es. con "Umlauts" tedeschi (ö, ä, ü) e si cerca oe, ae, ue insteda di usare il carattere speciale - è necessario aggiungere la ricerca nella lumaca della tassonomia - OR t.slug LIKE '%".get_search_query()."%'

  3. se cerchi una combinazione di una query di ricerca e un filtro di tassonomia, anche questo funziona bene

  4. Ma il problema è che quando si tenta di utilizzare solo il filtro di tassonomia, l'hook di ricerca aggiunge una stringa vuota alla query se non viene cercato alcun testo e per questo motivo si ottengono TUTTI i post nel risultato, anziché solo quelli dal tassonomia filtrata. Una semplice istruzione IF risolve il problema. Quindi l'intero codice modificato sarebbe questo (funziona perfettamente per me!)

funzione custom_search_where ($ where) { 
  $ wpdb globale;
  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 = 'pubblichi') ";
  restituisce $ dove;
}

funzione custom_search_join ($ join) {
  $ wpdb globale;
  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 ";
  ritorna $ join;
}

funzione custom_search_groupby ($ groupby) {
  $ wpdb globale;

  // dobbiamo raggruppare sull'ID post
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) restituisce $ groupby;

  // groupby era vuoto, usa il nostro
  if (! strlen (trim ($ groupby))) restituisce $ groupby_id;

  // non era vuoto, aggiungi il nostro
  return $ groupby. ",". $ groupby_id;
}

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

3

Ho lo stesso livello di informazioni di Jan. So che è possibile estendere la ricerca anche con plugin.

Probabilmente cerca tutto (plugin Wordpress) è quello che stai cercando. Secondo l'elenco delle funzionalità, ora supporta tassonomie personalizzate.


+1 per il plugin Cerca tutto. Funziona come previsto e restituisce più risultati rispetto alla ricerca standard di Wordpress.
PNMG

2

Ho trovato la risposta di onetrickpony eccezionale, ma tratta ogni ricerca come un singolo termine e non tratterà nemmeno una frase di ricerca racchiusa tra virgolette. Ho modificato atom_search_whereun po 'il suo codice (in particolare la funzione) per far fronte a queste due situazioni. Ecco la mia versione modificata del suo codice:

// 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');

1

Ho lo stesso problema con il plug-in del carrello WooCommerce. I miei risultati di ricerca non includono il termine tassonomia personalizzato, "product_tag", perché non è un tag post standard. Ho trovato una soluzione in questo altro thread StackOverflow sull'argomento:

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

L'esempio di codice di tkelly ha funzionato per me quando ha sostituito il termine authornel suo esempio con product_tagsecondo le nostre esigenze per i plugin del carrello.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.