Inclure un terme de taxonomie personnalisé dans la recherche

31

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: enlace 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.

    
posée Norcross 06.10.2010 - 03:06

6 réponses

35

Je recommanderais également le plug-in Tout rechercher , 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: enlace

    
réponse donnée onetrickpony 15.12.2010 - 12:48
7

Est-ce la recherche standard dans WordPress? Parce que cette ne semble pas inclure de taxonomie (même pas 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 accrocher au filtre posts_search .

    
réponse donnée Jan Fabry 07.10.2010 - 17:56
5

J'ai essayé la solution de Onetrickpony ci-dessus enlace , ce qui est très bien, mais j'y ai trouvé un problème: ne fonctionnait pas pour moi, et je ferais une petite modification:

  1. si j'ai recherché 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 - il faut 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 ceux de la taxonomie filtrée. Une simple instruction IF résout le problème. Donc tout le code modifié serait ceci (fonctionne parfaitement pour moi!)

function 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 = '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;
}

function custom_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 || !get_search_query()) 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','custom_search_where');
add_filter('posts_join', 'custom_search_join');
add_filter('posts_groupby', 'custom_search_groupby');
    
réponse donnée Asped 09.09.2013 - 00:05
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, Rechercher dans tout (plugin Wordpress) est ce que vous recherchez. Selon la liste des fonctionnalités, il prend désormais en charge les taxonomies personnalisées.

    
réponse donnée hakre 06.11.2010 - 18:17
1

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 fil de discussion StackOverflow:

enlace

L'exemple de code fourni par tkelly a fonctionné pour moi lors du remplacement du terme author dans son exemple par product_tag as selon nos besoins pour les plugins de panier.

    
réponse donnée mroncetwice 08.12.2012 - 22:42
1

J'ai trouvé que la réponse de onetrickpony était excellente, mais elle traitait toute recherche comme un terme unique et ne traitait pas non plus d'une phrase de recherche entourée de guillemets. J'ai modifié son code (plus précisément la fonction atom_search_where ) pour traiter 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');
    
réponse donnée Mojamba 12.11.2015 - 06:52

Lire d'autres questions sur les étiquettes