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

33

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

Пример: http://dev.andrewnorcross.com/das/all-case-studies/ Поиск по термину "PQRI"

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

Norcross
источник
Нокросс, можешь добавить отзыв к предложенному Яном ответу? Вы, наверное, ищете плагин, который делает эту работу?
2010 г.
Я закончил тем, что отказался от плана. Поскольку я создал 3 отдельные функции поиска (в зависимости от потребностей в определенных областях), все протестированные плагины сломали их. В конце я сказал клиенту включить термины в контент, если он хочет, чтобы он был доступен для поиска.
Норкросс

Ответы:

36

Я бы тоже порекомендовал плагин Search Everything , но если вы хотите реализовать это с помощью функции поиска 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
источник
1
Это здорово - как этот код можно изменить, чтобы исключить массив идентификаторов таксономии из поиска?
HandiworkNYC.com
Следует отметить, что обратные вызовы фильтра для этих ловушек принимают 2 аргумента; 2-й для всех из них является экземпляром WP_Query, который передается по ссылке. Любые проверки is_search()или другие вызовы метода WP_Query ( is_search() is_home()и т. Д.) Всегда должны вызываться непосредственно в экземпляре запроса (например, $query->is_search()предполагая, что имя переменной экземпляра находится $queryв сигнатуре обратного вызова), а не в функции шаблона, которая всегда будет ссылаться на основной запрос. , а не запрос, для которого работает фильтр.
Эван Маттсон,
4
Кроме того, вероятно, не очень хорошая идея вставлять необработанную общедоступную строку поиска непосредственно в SQL-запрос ... рекомендуется к прочтению
Эван Мэтсон
Я просто хотел бы добавить, что это конфликтует с WPML, потому что WPML уже использует «T» в соединяемой части, так что использование чего-то нестандартного вместо tr, tt и t решает эту проблему
Bobz
7

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

Ян Фабри
источник
5

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

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

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

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

function custom_search_where ($ where) { 
  глобальный $ wpdb;
  if (is_search () && get_search_query ())
    $ where. = "OR ((t.name LIKE '%". get_search_query (). "%' OR t.slug LIKE '%". get_search_query (). "%') И {$ wpdb-> posts} .post_status) = 'опубликовать') ";
  вернуть $ где;
}

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-> term} t ON t.term_id = tt.term_id ";
  вернуть $ join;
}

function custom_search_groupby ($ groupby) {
  глобальный $ wpdb;

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

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

  // не было пусто, добавьте наш
  вернуть $ 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
источник
3

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

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

hakre
источник
+1 для поиска все плагин. Он работает как положено и возвращает больше результатов, чем стандартный поиск Wordpress.
PNMG
2

Я нашел ответ от 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
источник
1

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

/programming/13491828/how-to-amend-wordpress-search-so-it-queries-taxonomy-terms-and-category-terms

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

mroncetwice
источник