Inclure un terme de taxonomie personnalisé dans la recherche

33

J'ai deux taxonomies personnalisées appliquées à deux types de publication personnalisés. la liste des termes sur la barre latérale va très bien et listera tous les messages qui lui sont associés. Cependant, si vous recherchez l'un des termes en particulier, il ne fait pas apparaître de message avec ce terme.

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

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

Norcross
la source
Nocross, pouvez-vous ajouter quelques commentaires à la réponse proposée par Jan? Êtes-vous probablement à la recherche d'un plugin qui fait le travail?
hakre
J'ai fini par abandonner le plan. Depuis que j'avais créé 3 fonctions de recherche distinctes (basées sur des besoins différents dans certains domaines), tous les plugins que j'ai testés les ont cassés. En fin de compte, j'ai dit au client d'inclure des termes dans le contenu s'il voulait qu'il soit consultable.
Norcross

Réponses:

36

Je recommanderais également le plugin Search Everything , mais si vous souhaitez l'implémenter à 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

onetrickpony
la source
1
C'est génial - comment ce code peut-il être modifié pour exclure un tableau d'ID de taxonomie de la recherche?
HandiworkNYC.com
Il convient de noter que les rappels de filtre pour ces hooks acceptent 2 arguments; le 2e pour tous étant l' instance WP_Query qui est passée par référence. Toute vérification is_search()ou tout autre appel de méthode WP_Query ( is_search() is_home()etc.) doit toujours être appelé directement sur l'instance de requête (par exemple, en $query->is_search()supposant que le nom de la variable d'instance se trouve $querydans la signature de rappel) plutôt que sur la fonction de modèle qui fera toujours référence à la requête principale. , pas la requête pour laquelle le filtre s'exécute.
Evan Mattson
4
En outre, ce n'est probablement pas une bonne idée d'injecter la chaîne de recherche brute accessible au public directement dans une requête SQL ... lecture recommandée
Evan Mattson
Je voudrais juste ajouter que cela a un conflit avec WPML parce que WPML utilise déjà 'T' dans la partie join, donc utiliser quelque chose de personnalisé au lieu de tr, tt et t résout ce problème
Bobz
7

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

Jan Fabry
la source
5

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

  1. si je cherchais 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 "trémas" allemands (ö, ä, ü) et que l'on recherche 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 seulement celles du taxonomie filtrée. Une simple instruction IF résout le problème. Donc, tout le code modifié serait le suivant (fonctionne parfaitement pour moi!)

fonction 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 = 'publier') ";
  retourner $ où;
}

fonction 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 ";
  return $ join;
}

fonction custom_search_groupby ($ groupby) {
  global $ wpdb;

  // nous devons nous regrouper sur l'identifiant du message
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) return $ groupby;

  // groupby était vide, utilisez le nôtre
  if (! strlen (trim ($ groupby))) return $ groupby_id;

  // n'était pas vide, ajoutez le nôtre
  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');
Asped
la source
3

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 tout rechercher (plugin Wordpress) est ce que vous recherchez. Selon la liste des fonctionnalités, il prend désormais en charge les taxonomies personnalisées.

hakre
la source
+1 pour le plugin Search Everything. Il fonctionne comme prévu et renvoie plus de résultats que la recherche Wordpress standard.
PNMG
2

J'ai trouvé la réponse de onetrickpony excellente, mais elle traite toute recherche comme un seul terme et ne traite pas non plus d'une expression de recherche entourée de guillemets. J'ai un peu modifié son code (en particulier, la atom_search_wherefonction) 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');
Mojamba
la source
1

J'ai le même problème avec le plugin de 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 dans cet autre thread StackOverflow à ce sujet:

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

L'exemple de code de tkelly a fonctionné pour moi lors du remplacement du terme authordans son exemple par product_tagselon nos besoins pour les plugins de panier.

mroncetwice
la source