web-dev-qa-db-fra.com

Inclure un terme de taxonomie personnalisé dans la recherche

J'ai deux taxonomies personnalisées appliquées à deux types de publication personnalisés. la liste des termes dans la barre latérale convient parfaitement et répertorie tous les messages qui lui sont associés. Toutefois, si vous recherchez l'un des termes en particulier, cela n'entraînera pas de publication avec ce terme.

Exemple: http://dev.andrewnorcross.com/das/all-case-studies/ Recherche du terme "PQRI"

Je n'ai rien. Des idées? J'ai essayé d'utiliser différents plugins de recherche, mais ils cassent mes paramètres de recherche personnalisés ou ne fonctionnent tout simplement pas.

31
Norcross

Je recommanderais également le plugin Search Everything , mais si vous souhaitez implémenter cela à l'aide de la fonction de recherche de WP, voici le code que j'utilise dans mon thème 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');

Il est basé sur le plugin Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

37
onetrickpony

Est-ce la recherche standard dans WordPress? Parce que ne semble pas inclure de taxonomies (pas même standard, comme les catégories et les balises) dans la recherche. Le code recherche dans post_title et post_content, mais si vous souhaitez inclure autre chose, vous devez vous connecter au filtre posts_search.

7
Jan Fabry

J'ai essayé la solution de Onetrickpony ci-dessus https://wordpress.stackexchange.com/a/5404/37612 , ce qui est génial, mais j'ai trouvé un problème qui ne fonctionnait pas pour moi et j'en ferais un petite modification:

  1. si j'ai cherché une chaîne dans le titre de la taxonomie - cela fonctionne très bien
  2. si la taxonomie a des caractères spéciaux, par exemple avec des "umlauts" allemands (ö, ä, ü) et on cherche oe, ae, ue insteda d’utiliser le caractère spécial - vous devez ajouter la recherche dans le slug de la taxonomie - OR t.slug LIKE '%".get_search_query()."%'

  3. si vous recherchez une combinaison d'une requête de recherche et d'un filtre de taxonomie, cela fonctionne également très bien

  4. Mais le problème est que, lorsque vous essayez d’utiliser uniquement le filtre de taxonomie - le crochet de recherche ajoute une chaîne vide à la requête si aucun texte n’est recherché, et pour cette raison, vous obtenez TOUTES les publications dans le résultat, au lieu de celles du taxonomie filtrée. Une simple instruction IF résout le problème. Donc tout le code modifié serait celui-ci (fonctionne parfaitement pour moi!)

 function custom_search_where ($ where) {
 global $ wpdb; 
 if (is_search () && get_search_query ()) 
 $ where. = "OU ((t .name LIKE '% ". get_search_query ()."%' OR t.slug LIKE '% ". get_search_query ()."%') ET {$ wpdb-> posts} .post_status = 'publish ') "; 
 renvoie $ où; 
} 
 
 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-> termes} t ON t.term_id = tt.term_id "; 
 renvoyer $ rejoindre; 
] 
 
 function custom_search_groupby ($ groupby) {
 global $ wpdb; 
 
 // nous devons grouper sur l'ID de poste 
 $ groupby_id = "{$ wpdb-> posts} .ID"; 
 if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) renvoie $ groupby; 
 
 // groupby était vide, utilisez notre 
 si (! strlen (trim ($ groupby)))) a retourné $ groupby_id; 
 
 // n'était pas vide, ajoutez notre 
 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'); 
6
Asped

J'ai le même niveau d'informations que Jan. Je sais qu'il est également possible d'étendre la recherche avec des plugins.

Probablement Rechercher tout (Wordpress Plugin) est ce que vous recherchez. Selon la liste des fonctionnalités, il prend désormais en charge les taxonomies personnalisées.

3
hakre

J'ai trouvé la réponse de onetrickpony très bonne, mais elle traite toute recherche comme un terme unique et ne traite pas non plus d'une phrase de recherche entourée de guillemets. J'ai modifié un peu son code (plus précisément la fonction atom_search_where) pour faire face à ces deux situations. Voici ma version modifiée de son code:

// 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

J'ai le même problème avec le plug-in du panier WooCommerce. Mes résultats de recherche n'incluent pas le terme de taxonomie personnalisé, 'product_tag', car ce n'est pas une balise de publication standard. J'ai trouvé une solution à ce sujet dans cet autre thread StackOverflow:

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

L'exemple de code fourni par tkelly a fonctionné pour moi en remplaçant le terme author dans son exemple par product_tag, selon nos besoins pour les plugins de panier.

1
mroncetwice