Включить пользовательский термин таксономии в поиск
У меня есть две пользовательские таксономии, применяемые к двум пользовательским типам записей. список терминов на боковой панели просто прекрасен, и в нем будут перечислены все связанные с ним сообщения. Однако, если вы выполните поиск по одному из конкретных терминов, он не вызовет сообщение с этим термином.
Пример: http://dev.andrewnorcross.com/das/all-case-studies / Поиск термина "PQRI"
Я ничего не получаю. Есть какие-нибудь идеи? Я пробовал использовать различные плагины поиска, но они либо нарушают мой пользовательский поиск параметры или просто не работают.
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
Это стандартный поиск WordPress? Потому что это , похоже, не включает в поиск таксономии (даже не стандартные, такие как категории и теги). Код выполняет поиск в post_title
и post_content
, но если вы хотите включить что-либо еще, вам следует подключиться к фильтру posts_search
.
Я попробовал решение Onetrickpony выше https://wordpress.stackexchange.com/a/5404/37612 , что здорово, но я нашел там одну проблему, которая не сработала для меня, и я бы сделал одну небольшую модификацию:
- если я искал строку в названии таксономии - это отлично работает
Если в таксономии есть специальные символы, например, с немецкими "умлаутами" (ö, ä,ü), и один ищет oe, ae, ue вместо использования специального символа - вам нужно добавить поиск в слаге таксономии -
OR t.slug LIKE '%".get_search_query()."%'
Если вы ищете комбинацию поискового запроса и фильтра таксономии - это также отлично работает
Но проблема в том, что при попытке использовать только фильтр таксономии - поисковый крючок добавляет пустую строку в запрос, если текст не ищется, и по этой причине вы получаете ВСЕ сообщения в результате, а не только те, которые из отфильтрованной таксономии. Простое утверждение 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');
У меня такой же уровень информации, как у Яна. Я знаю, что также можно расширить поиск с помощью плагинов.
Вероятно, Поиск всего (плагин Wordpress) - это то, что вы ищете. Согласно списку функций, теперь он поддерживает пользовательские таксономии.
У меня такая же проблема с плагином WooCommerce cart.. Мои результаты поиска не включают пользовательский термин таксономии "product_tag", потому что это не стандартный тег публикации. Я нашел решение в этом другом потоке StackOverflow по этому вопросу:
Пример кода tkelly сработал для меня при замене термина author
в его примере с product_tag
в соответствии с нашими потребностями в плагинах корзины.
Я нашел ответ от 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');