Включить пользовательский таксономический термин в поиске

У меня есть две пользовательские таксономии, применяемые к двум пользовательским типам сообщений. список терминов на боковой панели просто прекрасен и перечислит все сообщения, связанные с ним. Однако, если вы ищете одно из терминов в конкретном, это не приводит к сообщению с этим термином.

Пример: http://dev.andrewnorcross.com/das/all-case-studies/ Поиск термина «PQRI»

Я ничего не получаю. Есть идеи? Я пробовал использовать различные плагины поиска, но они либо нарушают мои пользовательские параметры поиска, либо просто не работают.

30 голосов | спросил Norcross 6 +04002010-10-06T05:06:56+04:00312010bEurope/MoscowWed, 06 Oct 2010 05:06:56 +0400 2010, 05:06:56

6 ответов


35

Я бы порекомендовал плагин Искать все , но если вы хотите реализовать это с помощью функции поиска WP, вот код, который я использую в своей теме 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');

Он основан на плагине Tag-Search: http: //projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

ответил onetrickpony 15 WedEurope/Moscow2010-12-15T14:48:39+03:00Europe/Moscow12bEurope/MoscowWed, 15 Dec 2010 14:48:39 +0300 2010, 14:48:39
7

Это стандартный поиск WordPress? Потому что не включает в себя таксономии (даже не стандартные, подобные категории и теги) в поиске. Код ищет в post_title и post_content, но если вы хотите включить что-нибудь еще, вы должны подключиться к фильтру posts_search.

ответил Jan Fabry 7 +04002010-10-07T19:56:16+04:00312010bEurope/MoscowThu, 07 Oct 2010 19:56:16 +0400 2010, 19:56:16
5

Я попробовал решение Onetrickpony выше https://wordpress.stackexchange.com/a/5404/37612, что здорово, но я нашел там одну проблему, которая не работала для меня, и я сделал бы одну небольшую модификацию:

  1. Если я искал строку в заголовке таксономии - она ​​отлично работает
  2. , если таксономия имеет специальные символы, например. с немецкими «Umlauts» (ö, ä, ¼), и каждый ищет oe, ae, ue insteda с использованием специального символа - вам нужно добавить поиск в пул таксономии - OR t.slug LIKE '%".get_search_query()."%'

  3. , если вы ищете комбинацию поискового запроса и фильтр таксономии - это также отлично работает

  4. Но проблема в том, что при попытке использовать только фильтр таксономии - крюк поиска добавляет пустую строку в запрос, если текст не выполняется, и по этой причине вы получаете ВСЕ сообщения в результате, а не только из отфильтрованной таксономии. Проблема проста. Таким образом, весь измененный код будет таким (отлично работает для меня!)

function custom_search_where ($ where) {
  глобальный $ wpdb;
  if (is_search () & & get_search_query ())
    $ where. = "OR ((t.name LIKE '%". get_search_query (). "%' ИЛИ ​​t.slug LIKE '%". get_search_query (). "%') И {$ wpdb-> posts}. post_status = 'publish') ";
  return $ where;
}

function custom_search_join ($ join) {
  глобальный $ 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) {
  глобальный $ wpdb;

  //нам нужно сгруппировать по сообщению ID
  $ groupby_id = "{$ wpdb-> posts} .ID";
  if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) return $ groupby;

  //groupby was empty, используйте наш
  if (! strlen (trim ($ groupby))) return $ groupby_id;

  //не было пустым, добавьте наши
  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 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 09 Sep 2013 02:05:26 +0400 2013, 02:05:26
3

У меня такой же уровень информации, как Jan. Я знаю, что можно расширить поиск и с помощью плагинов.

Вероятно, Поиск всего (Wordpress Plugin) - это то, что вы ищете. Согласно списку функций, теперь он поддерживает пользовательские таксономии.

ответил hakre 6 62010vEurope/Moscow11bEurope/MoscowSat, 06 Nov 2010 20:17:22 +0300 2010, 20:17:22
1

У меня такая же проблема возникает с плагином для корзины WooCommerce. Мои результаты поиска не включают пользовательский термин таксономии «product_tag», потому что это не стандартный тег. Я нашел решение в этом другом потоке StackOverflow об этом:

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

Пример кода tkelly работал для меня при замене слова author в его примере с product_tag в соответствии с нашими потребностями для плагинов тележек.

ответил mroncetwice 9 SunEurope/Moscow2012-12-09T01:42:36+04:00Europe/Moscow12bEurope/MoscowSun, 09 Dec 2012 01:42:36 +0400 2012, 01:42:36
1

Я нашел ответ от onetrickpony, чтобы быть большим, но он рассматривает любой поиск как один термин, а также не будет обрабатывать поисковую фразу, заключенную с кавычками. Я изменил его код (в частности, функцию atom_search_where), чтобы справиться с этими двумя ситуациями. Вот моя модифицированная версия его кода:

// 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 12 42015vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2015 08:52:40 +0300 2015, 08:52:40

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132