Uwzględnij niestandardowy termin taksonomii w wyszukiwaniu

33

Mam dwie niestandardowe taksonomie zastosowane do dwóch niestandardowych typów postów. lista terminów na pasku bocznym jest w porządku i zawiera listę wszystkich powiązanych z nią postów. Jeśli jednak przeszukujesz jeden z określonych terminów, nie pojawi się post z tym terminem.

Przykład: http://dev.andrewnorcross.com/das/all-case-studies/ Wyszukaj termin „PQRI”

Nic nie dostaję Jakieś pomysły? Próbowałem używać różnych wtyczek wyszukiwania, ale albo psują moje niestandardowe parametry wyszukiwania, albo po prostu nie działają.

Norcross
źródło
Nocross, czy możesz dodać jakieś uwagi zwrotne do odpowiedzi zaproponowanej przez Jana? Prawdopodobnie szukasz wtyczki, która spełnia swoje zadanie?
hakre
W końcu rzuciłem plan. Ponieważ stworzyłem 3 osobne funkcje wyszukiwania (oparte na różnych potrzebach w niektórych obszarach), wszystkie testowane wtyczki je złamały. Na koniec powiedziałem klientowi, aby zawarł warunki w treści, jeśli chce, aby można ją było przeszukiwać.
Norcross,

Odpowiedzi:

36

Polecam również wtyczkę Search Everything , ale jeśli chcesz to zaimplementować za pomocą funkcji wyszukiwania WP, oto kod, którego używam w moim motywie 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');

Opiera się na wtyczce Tag-Search: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

onetrickpony
źródło
1
To świetnie - w jaki sposób można zmodyfikować ten kod, aby wykluczyć tablicę identyfikatorów systematyki z wyszukiwania?
HandiworkNYC.com
Należy zauważyć, że wywołania zwrotne filtrów dla tych haków akceptują 2 argumenty; drugim dla wszystkich jest instancja WP_Query, która jest przekazywana przez referencję. Wszelkie sprawdzenia is_search()lub inne wywołania metod WP_Query ( is_search() is_home()itp.) Powinny zawsze być wywoływane bezpośrednio w instancji zapytania (np. $query->is_search()Zakładając, że nazwa zmiennej instancji znajduje się $queryw sygnaturze wywołania zwrotnego), a nie funkcja szablonu, która zawsze będzie odnosić się do głównego zapytania , a nie zapytanie, dla którego działa filtr.
Evan Mattson
4
Również prawdopodobnie nie jest dobrym pomysłem wstrzyknięcie surowego publicznie dostępnego ciągu wyszukiwania bezpośrednio do zapytania SQL ... zalecana lektura
Evan Mattson
Chciałbym tylko dodać, że ma to konflikt z WPML, ponieważ WPML alredy używa „T” w części złączenia, więc użycie czegoś niestandardowego zamiast tr, tt i t rozwiązuje ten problem
Bobz
7

Czy to standardowe wyszukiwanie WordPress? Ponieważ wydaje się, że nie obejmuje to taksonomii (nawet standardowych, takich jak kategorie i tagi) w wyszukiwaniu. Kod przeszukuje post_titlei post_content, ale jeśli chcesz dołączyć coś jeszcze, powinieneś podłączyć się do posts_searchfiltra.

Jan Fabry
źródło
5

Wypróbowałem rozwiązanie Onetrickpony powyżej https://wordpress.stackexchange.com/a/5404/37612 , co jest świetne, ale znalazłem tam jeden problem, który nie działał dla mnie, i zrobiłbym jedną małą modyfikację:

  1. gdybym szukał łańcucha w tytule taksonomii - działa świetnie
  2. jeśli taksonomia ma znaki specjalne, np. z niemieckimi „Umlautami” (ö, ä, ü) i ktoś szuka oe, ae, ue insteda użycia znaku specjalnego - należy dodać wyszukiwanie do informacji o taksonomii - OR t.slug LIKE '%".get_search_query()."%'

  3. jeśli szukasz kombinacji zapytania wyszukiwania i filtru taksonomii - to również działa dobrze

  4. Problem polega jednak na tym, że gdy próbujesz użyć tylko filtru taksonomii - haczyk wyszukiwania dołącza do zapytania pusty ciąg, jeśli nie jest wyszukiwany tekst, i dlatego w wyniku otrzymujesz WSZYSTKIE posty, a nie tylko te z filtrowana taksonomia. Prosta instrukcja IF rozwiązuje problem. Cały zmodyfikowany kod byłby taki (działa dla mnie idealnie!)

funkcja custom_search_where ($ gdzie) { 
  globalny $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "OR ((t.nazwa LIKE '%". get_search_query (). "%' OR t.slug LIKE '%". get_search_query (). "%") AND {$ wpdb-> posty} .post_status = „opublikuj”) ”;
  zwróć $ gdzie;
}

funkcja custom_search_join ($ join) {
  globalny $ wpdb;
  if (is_search () && get_search_query ())
    $ join. = "LEFT JOIN {$ wpdb-> term_relationships} tr ON {$ wpdb-> posty} .ID = tr.object_id INNER JOIN {$ wpdb-> term_taxonomy} tt ON tt.term_taxonomy_id = tr.term_taxonomy_id {INNER JOIN $ wpdb-> warunki} t ON t.term_id = tt.term_id ";
  return $ join;
}

funkcja custom_search_groupby ($ groupby) {
  globalny $ wpdb;

  // musimy pogrupować według identyfikatora postu
  $ groupby_id = "{$ wpdb-> posty} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) return $ groupby;

  // groupby było puste, użyj naszego
  if (! strlen (trim ($ groupby))) return $ groupby_id;

  // nie było puste, dołącz nasze
  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
źródło
3

Mam taki sam poziom informacji jak Jan. Wiem, że można również rozszerzyć wyszukiwanie za pomocą wtyczek.

Prawdopodobnie szukasz wszystkiego (Wordpress Plugin) jest tym, czego szukasz. Zgodnie z listą funkcji obsługuje teraz niestandardowe taksonomie.

hakre
źródło
Wtyczka +1 do wyszukiwania wszystkiego. Działa zgodnie z oczekiwaniami i zwraca więcej wyników niż standardowe wyszukiwanie Wordpress.
PNMG
2

Uważam, że odpowiedź z onetrickpony jest świetna, ale traktuje każde wyszukiwanie jako pojedynczy termin, a także nie zajmuje się wyszukiwaną frazą opatrzoną cudzysłowem. Zmodyfikowałem atom_search_wherenieco jego kod (konkretnie funkcję), aby poradzić sobie z tymi dwiema sytuacjami. Oto moja zmodyfikowana wersja jego kodu:

// 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
źródło
1

Mam ten sam problem z wtyczką koszyka WooCommerce. Moje wyniki wyszukiwania nie zawierają niestandardowego terminu taksonomii „product_tag”, ponieważ nie jest to standardowy znacznik pocztowy. Znalazłem rozwiązanie w tym innym wątku StackOverflow na ten temat:

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

Przykład kodu tkelly zadziałał dla mnie, zastępując termin authorw jego przykładzie, product_tagzgodnie z naszymi potrzebami dotyczącymi wtyczek kart.

mroncetwice
źródło