it-swarm.com.ru

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

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

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

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

31
Norcross

Я бы порекомендовал также плагин 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

37
onetrickpony

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

7
Jan Fabry

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

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

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

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

 функция 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 ') "; 
 вернуть $ где; 
} 
 
 функция 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-> term} t ON t.term_id = tt.term_id "; 
 return $ join; 
} 
 
 function custom_search_groupby ($ groupby) {
 global $ wpdb; 
 
 // нам нужно сгруппировать по идентификатору записи 
 $ groupby_id = "{$ wpdb-> posts} .ID"; 
 if (! is_search () || strpos ($ groupby, $ groupby_id)! == false ||! get_search_query ()) return $ groupby; 
 
 // groupby был пуст, используйте наш 
 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'); 
6
Asped

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

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

3
hakre

Я нашел ответ от 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
Mojamba

У меня та же проблема, что и с плагином корзины 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
mroncetwice