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


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

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

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

Author: Johannes Pille, 2010-10-06

6 answers

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

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

 39
Author: onetrickpony, 2010-12-15 11:48:39

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

 8
Author: Jan Fabry, 2010-10-07 15:56:16

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

  1. если я искал строку в названии таксономии - это отлично работает
  2. Если в таксономии есть специальные символы, например, с немецкими "умлаутами" (ö, ä,ü), и один ищет oe, ae, 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
Author: Asped, 2017-04-13 12:37:39

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

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

 3
Author: hakre, 2010-11-06 17:17:22

У меня такая же проблема с плагином WooCommerce cart.. Мои результаты поиска не включают пользовательский термин таксономии "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 в соответствии с нашими потребностями в плагинах корзины.

 2
Author: mroncetwice, 2017-05-23 12:40:05

Я нашел ответ от 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');
 2
Author: Mojamba, 2015-11-12 05:52:40