Включить термин пользовательской таксономии в поиск
-
-
Норкросс,не могли бы вы добавить отзыв к ответу,предложенному Яном?Вы,наверное,ищете плагин,который сделает эту работу?Nocross, can you add some feedback to the answer proposed by Jan? Are you probably looking for a plugin that does the job?
- 0
- 2010-11-06
- hakre
-
В итоге я отказался от этого плана.Поскольку я создал 3 отдельные функции поиска (в зависимости от потребностей в определенных областях),все проверенные мной плагины сломали их.В конце концов,я сказал клиенту включить термины в контент,если он хочет,чтобы он был доступен для поиска.I ended up ditching the plan. Since I had created 3 separate search functions (based on different needs in certain areas), all the plugins I tested broke those. In the end, I told the client to include terms in the content if they wanted it searchable.
- 0
- 2010-11-13
- Norcross
-
6 ответ
- голосов
-
- 2010-12-15
Я бы также порекомендовал плагин 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
I would recommend the Search Everything plugin too, but if you want to implement this using WP's search function, here's the code I'm using in my Atom theme:
// 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');
It's based on the Tag-Search plugin: http://projects.jesseheap.com/all-projects/wordpress-plugin-tag-search-in-wordpress-23
-
Это замечательно - как можно изменить этот код,чтобы исключить из поиска массив идентификаторов таксономии?This is great-- how can this code be modified to exclude an array of taxonomy IDs from the search?
- 1
- 2012-01-06
- HandiworkNYC.com
-
Следует отметить,что обратные вызовы фильтра для этих перехватчиков принимают * 2 * аргумента;второй для всех - это экземпляр _WP_Query_,который передается по ссылке.Любые проверки на наличие `is_search ()` или других вызовов методов _WP_Query_ (`is_search (),is_home ()` и т. Д.) Всегда должны вызываться непосредственно в экземпляре запроса (например,`$ query->is_search ()` при условии,чтоимя переменной экземпляра - `$ query` в сигнатуре обратного вызова),а не функция шаблона,которая всегда будет ссылаться на основной запрос,а не на запрос,для которого выполняется фильтр.It should be noted that the filter callbacks for these hooks accept *2* arguments; the 2nd for all of them being the _WP_Query_ instance which is passed by reference. Any checks for `is_search()` or other _WP_Query_ method calls (`is_search()` `is_home()` etc.) should always be called directly on the query instance (eg. `$query->is_search()` assuming the name of the instance variable is `$query` in the callback signature) rather than the template function which will always refer to the main query, not the query that the filter is running for.
- 0
- 2014-06-07
- Evan Mattson
-
Кроме того,вероятно,не рекомендуется вставлять необработанную общедоступную строку поиска непосредственно в SQL-запрос ... [рекомендуемая литература] (http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks)Also, probably not a good idea to inject the raw publicly available search string directly into an SQL query... [recommended reading](http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks)
- 6
- 2014-06-07
- Evan Mattson
-
Я просто хотел бы добавить,что у этого есть конфликт с WPML,потому что WPML alredy использует 'T' в части соединения,поэтому использование чего-то индивидуального вместоtr,tt иt устраняет эту проблему.I would just like to add that this has a conflict with WPML because WPML alredy uses 'T' in join part, so using something custom instead of tr, tt and t fixes this problem
- 0
- 2016-02-09
- Bobz
-
@EvanMattson - выше вы отметили,что «вероятно,не рекомендуется вводить необработанную общедоступную строку поиска непосредственно в запрос SQL».Как можно было бы свести на нет этот риск?Я прочитал предоставленную вами ссылку,но не увидел,как она связана с исходным ответом.Большое спасибо,Эм.@EvanMattson — you commented above that it's "probably not a good idea to inject the raw publicly available search string directly into an SQL query." How would go about negating that risk? I read the link you provided but couldn't see how that links to the original answer. Many thanks Em.
- 1
- 2020-04-05
- The Chewy
-
@TheChewy ответ выше показывает `get_search_query ()`,используемый непосредственно в операторе MySQL предложения WHERE.Этот код уязвим для атак SQL-инъекций,когда любой может выполнять произвольные SQL-запросы на вашем сайте,передавая их через поле поиска.Очевидно,что в какой-то степени поиск работает именно так,но важно то,что этот ввод должен быть правильно подготовлен,чтобы гарантировать,что он интерпретируется как условия поиска,а не операторы SQL.Это то,для чего предназначен метод `$ wpdb->prepare ()`,для которого описан в указанной рекомендуемой литературе.@TheChewy the answer above shows `get_search_query()` used directly in the MySQL statement of the WHERE clause. This code is vulnerable to SQL injection attacks, where anyone can execute arbitrary SQL queries on your site by passing them through the search field. Obviously that's how searches work to some degree, but the important point is that this input needs to be prepared properly to ensure it is interpreted as search terms and not SQL statements. This is what the `$wpdb->prepare()` method is for which is described in said recommended reading
- 0
- 2020-04-19
- Evan Mattson
-
@TheChewy,вы также можете найти несколько хороших примеров в документации для `wpdb ::prepare ()` здесь: https://developer.wordpress.org/reference/classes/wpdb/prepare/@TheChewy you can also find some good examples in the docs for `wpdb::prepare()` here: https://developer.wordpress.org/reference/classes/wpdb/prepare/
- 0
- 2020-04-19
- Evan Mattson
-
@EvanMattson Привет,Эван,спасибо за вклад.Я новичок как вphp,так и в пользовательском коде WP,и это зашло мне слишком далеко.Сможете ли вы продублировать код с добавлением `$ wpdb->prepare ()`,если это не слишком сложно?Думаю,пройдут недели,прежде чем я приблизюсь к пониманию подобных вещей.@EvanMattson Hi Evan, thanks for the input. I'm new to both php and custom WP code and that has gone so far over my head. Would you be able to duplicate the code with the `$wpdb->prepare()` added if it isn't too hard? I think it'll be weeks before I get close to understanding that sort of thing.
- 1
- 2020-04-21
- The Chewy
-
- 2010-10-07
Это стандартный поиск WordPress?Поскольку этот ,похоже,не включает таксономии (дажестандартные,вроде категорий и тегов) в поиске.Код выполняет поиск в
post_title
иpost_content
,но если вы хотите включить что-нибудь еще,вам следует подключиться к фильтруposts_search
.Is this the standard WordPress search? Because that doesn't seem to include taxonomies (not even standard, like categories and tags) in the search. The code searches in
post_title
andpost_content
, but if you want to include anything else you should hook into theposts_search
filter. -
- 2013-09-08
Я пробовал решение Onetrickpony выше https://wordpress.stackexchange.com/a/5404/37612,и это здорово,но я обнаружил там одну проблему,которая у меня не сработала,и я бы сделал одно небольшое изменение:
- если я искал строку в названии таксономии - отлично работает
-
если в таксономии есть специальные символы,например с немецким "Umlauts" (ö,ä,ü) и поиск по oe,ae,ueinsteda с использованием специального символа - вам нужно добавить поиск в заголовок таксономии -
OR t.slug LIKE '%".get_search_query()."%'
-
если вы ищете комбинацию поискового запроса и таксономического фильтра - это тоже нормально
-
Но проблема в том,что когда вы пытаетесь использовать только фильтр таксономии - ловушка поиска добавляет к запросу пустую строку,если текст не ищется,и по этой причине вы получаете ВСЕ сообщения в результате,а не только из отфильтрованной таксономии. Простая инструкция IF решает проблему. Таким образом,весь модифицированный код будет таким (у меня отлично работает!)
function custom_search_where ($ where) { глобальный $ wpdb; если (is_search () &&get_search_query ()) $ where.="OR ((t.name LIKE '%".get_search_query (). "%' ORt.slug LIKE '%".get_search_query (). "%') AND {$ wpdb->posts} .post_status='опубликовать') "; вернуть $ где; } function custom_search_join ($join) { глобальный $ wpdb; если (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 ONtt.term_taxonomy_id=tr.term_taxonomy_id INNN $ wpdb->terms}t ВКЛt.term_id=tt.term_id "; return $join; } function custom_search_groupby ($groupby) { глобальный $ wpdb; //нам нужно сгруппировать по ID поста $groupby_id="{$ wpdb->posts} .ID"; если (!is_search ()|| strpos ($groupby,$groupby_id)!==false||!get_search_query ()) return $groupby; //groupby было пусто,используйте наш если (! 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');
I tried the solution of Onetrickpony above https://wordpress.stackexchange.com/a/5404/37612, which is great, but I found one issue there, which did not work for me, and I would make one small modification:
- if I searched for a string in the title of the taxonomy - it works great
if the taxonomy has special characters e.g. with german "Umlauts" (ö,ä,ü) and one searches for oe, ae, ue insteda of using the special char - you need to add the search in the slug of the taxonomy -
OR t.slug LIKE '%".get_search_query()."%'
if you search for a combination of a search query and a taxonomy filter - this also works fine
But the problem is, when you try to use only the taxonomy filter - the search hook append an empty string to the query if no text is searched for, and for that reason you get ALL posts in the result, instead of only those from the filtered taxonomy. A simple IF statement solves the problem. So the whole modified code would be this (works perfectly fine for me!)
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');
-
- 2010-11-06
У меня такой же уровень информации,как и у Яна. Я знаю,что поиск можно расширить с помощью плагинов.
Вероятно,вы ищете Search Everything (плагин Wordpress) .Согласно списку функций,теперь он поддерживает настраиваемые таксономии.
I have the same level of information like Jan. I know it's possible to extend search with plugins as well.
Probably Search Everything (Wordpress Plugin) is what you are looking for. According to the feature list, it now supports custom taxonomies.
-
Плагин +1 для поиска по всему.Он работает должным образом и возвращает больше результатов,чем стандартный поиск Wordpress.+1 For Search Everything plugin. It works as expected and returns more results than standard Wordpress search.
- 0
- 2010-12-02
- PNMG
-
- 2012-12-08
У меня такая же проблема с подключаемым модулем корзины WooCommerce. Мои результаты поиска не включают пользовательский термин таксономии "product_tag",потому что это не стандартный тег сообщения.Я нашел решение в этой другой ветке StackOverflow по этому поводу:
Пример кода от tkelly работал у меня при замене термина
author
в его примересproduct_tag
в соответствии с нашими потребностями в плагинах корзины.I have the same problem going on with the WooCommerce cart plugin.. My search results are not including the custom taxonomy term, 'product_tag', because it not a standard post tag. I found a solution in this other StackOverflow thread about the matter:
The code example by tkelly worked for me when replacing the term
author
in his example withproduct_tag
as per our needs for the cart plugins. -
- 2015-11-12
Я нашел ответ от 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');
I found the answer from onetrickpony to be great but it treats any search as a single term and also won't deal with a search phrase enclosed with quotation marks. I modified his code (specifically, the
atom_search_where
function) a bit to deal with these two situations. Here is my modified version of his code:// 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');
У меня есть две пользовательские таксономии,примененные к двум пользовательским типам сообщений.список терминов на боковой панели в порядке,и в нем будут перечислены все связанные с ним сообщения.Однако,если вы выполните поиск по одному из терминов,он не отобразит сообщение с этим термином.
Пример: http://dev.andrewnorcross.com/das/all-case-studies/а> Искать термин "PQRI"
Я ничего не получаю.Есть идеи?Я пробовал использовать различные плагины поиска,но они либо нарушают мои параметры пользовательского поиска,либо просто не работают.