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

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

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

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

33
31.10.2013, 19:40
5 ответов

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

Это основано на Поисковом Тегом плагине: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23

36
19.02.2020, 21:54
  • 1
    Здорово - как это может кодировать быть измененным для исключения массива идентификаторов таксономии от поиска? –  HandiworkNYC.com 06.01.2012, 22:23
  • 2
    Нужно отметить, что обратные вызовы фильтра для этих рычагов принимают 2 аргумента; 2-е для всех них являющихся экземпляром WP_Query, который передается ссылкой. Любые проверки на is_search() или другие вызовы метода WP_Query (is_search() is_home() и т.д.), должен всегда называться непосредственно на экземпляре запроса (например. $query->is_search() брать имя переменной экземпляра $query в подписи обратного вызова), а не шаблонная функция, которая будет всегда относиться к основному запросу, не запросу, за которым работает фильтр. –  Evan Mattson 07.06.2014, 05:55
  • 3
    Кроме того, вероятно, не хорошая идея ввести необработанную общедоступную строку поиска непосредственно в SQL-запрос... рекомендовала читать –  Evan Mattson 07.06.2014, 06:03
  • 4
    я был бы точно так же, как, чтобы добавить, что это имеет конфликт с WPML, потому что WPML уже использует 'T' в части соединения, таким образом с помощью чего-то пользовательского вместо TR, tt и t, решает эту проблему извинения –  Bobz 09.02.2016, 06:16

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

7
19.02.2020, 21:54

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

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

3
19.02.2020, 21:54
  • 1
    +1 Для Поиска Все плагин. Это работает как ожидалось и возвращает больше результатов, чем стандартный поиск Wordpress. –  PNMG 03.12.2010, 00:00

У меня есть та же проблема при продолжении плагина корзины 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 согласно нашим потребностям в плагинах корзины.

1
19.02.2020, 21:54

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

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

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

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

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');
5
19.02.2020, 21:54

Теги

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