it-swarm.dev

Zahrnout vlastní termín taxonomie do vyhledávání

Mám dvě vlastní taxonomie aplikované na dva typy vlastních příspěvků. seznam termínů v postranním panelu je v pořádku a zobrazí seznam všech příspěvků, které jsou k němu přidruženy. Pokud však vyhledáváte některý z termínů specificky, nevyvolá to příspěvek s tímto termínem.

Příklad: http://dev.andrewnorcross.com/das/all-case-studies/ Hledat výraz "PQRI"

Nic nedostanu. Nějaké nápady? Snažil jsem se použít různé pluginy pro vyhledávání, ale buď porušují mé vlastní parametry vyhledávání, nebo prostě nefungují.

31
Norcross

Doporučil bych také Hledat vše plugin taky, ale pokud chcete implementovat tuto funkci pomocí vyhledávací funkce WP, zde je kód, který používám v tématu 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');

Je založen na zásuvném modulu Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

37
onetrickpony

Je to standardní WordPress hledání? Vzhledem k tomu, že se nezdá, že by do vyhledávání zahrnovaly taxonomie (dokonce ani standardní, jako jsou kategorie a značky). Kód hledá v post_title a post_content, ale pokud chcete zahrnout cokoliv jiného, ​​měli byste zavést do filtru posts_search.

7
Jan Fabry

Vyzkoušel jsem řešení Onetrickpony nad https://wordpress.stackexchange.com/a/5404/37612 , což je skvělé, ale našel jsem tam jeden problém, který pro mě nefungoval, a udělal bych jeden malá změna:

  1. pokud jsem hledal řetězec v názvu taxonomie - funguje to skvěle
  2. má-li taxonomie speciální znaky, např. s německými "Umlauts" (ö, ä, ü) a jedním hledáním oe, ae, ue insteda používání speciálního znaku - je třeba přidat vyhledávání v slimu taxonomie - OR t.slug LIKE '%".get_search_query()."%'

  3. pokud hledáte kombinaci vyhledávacího dotazu a filtru taxonomie - funguje to také dobře

  4. Problém však spočívá v tom, že při pokusu o použití pouze filtru taxonomie připojí vyhledávací háček k dotazu prázdný řetězec, pokud není prohledáván žádný text, a z tohoto důvodu získáváte VŠECHNY příspěvky ve výsledku namísto pouze těch z filtrovaná taxonomie. Jednoduchý příkaz IF řeší tento problém. Takže celý upravený kód by to byl (funguje mi v pořádku!)

 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 = 'publikovat 
 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-> termíny} t ON t.term_id = tt.term_id "; 
 return $ join; 
} 
 
 function custom_search_groupby ($ groupby) {
 global $ wpdb; 
 
 // musíme seskupit na poštu ID 
 $ groupby_id = "{$ wpdb-> posts} .ID"; 
 if (! is_search () || strpos ($ groupby, $ groupby_id) !== false ||! get_search_query ()) return $ groupby; 
 
 // groupby byl prázdný, použijte naše 
 if (! strlen (trim ($ groupby)) return $ groupby_id; 
 
 // nebyl prázdný, připojte naše 
. ] 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

Mám stejnou úroveň informací jako Jan. Vím, že je možné rozšířit vyhledávání také o pluginy.

Pravděpodobně Hledat vše (Wordpress Plugin) je to, co hledáte. Podle seznamu funkcí nyní podporuje vlastní taxonomie.

3
hakre

Našel jsem odpověď z onetrickpony, aby byla skvělá, ale zachází s nějakým hledáním jako s jedním termínem a také se nezabývá hledanou frází uzavřenou s uvozovkami. Upravil jsem jeho kód (konkrétně funkci atom_search_where), abych se vyrovnal s těmito dvěma situacemi. Zde je upravená verze kódu:

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

Mám stejný problém se děje s WooCommerce košíku plugin .. Moje výsledky vyhledávání nejsou včetně vlastní taxonomie termín, 'product_tag', protože to není standardní post tag. Našel jsem řešení v tomto jiném vlákně StackOverflow o této záležitosti:

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

Příklad kódu pomocí tkelly pracoval pro mě při nahrazování výrazu author v jeho příkladu product_tag podle našich potřeb pro pluginy do košíku.

1
mroncetwice