У меня есть две пользовательские таксономии, примененные к двум пользовательским типам сообщений. список терминов на боковой панели просто прекрасен, и в нем будут перечислены все сообщения, связанные с ним. Однако, если вы выполняете поиск по одному из терминов конкретно, сообщение с этим термином не появится.
Пример: http://dev.andrewnorcross.com/das/all-case-studies/ Поиск термина «PQRI»
Я ничего не получаю. Есть идеи? Я пытался использовать различные поисковые плагины, но они либо нарушают мои пользовательские параметры поиска, либо просто не работают.
Nocross, можете ли вы добавить отзыв к ответу, предложенному Яном? Вы, вероятно, ищете плагин, который делает эту работу?
В итоге я отказался от плана. Поскольку я создал 3 отдельные функции поиска (исходя из разных потребностей в определенных областях), все плагины, которые я тестировал, сломали их. В конце концов, я сказал клиенту включить термины в контент, если он хочет, чтобы он был доступен для поиска.
Это здорово — как можно изменить этот код, чтобы исключить из поиска массив идентификаторов таксономии?
Следует отметить, что обратные вызовы фильтра для этих хуков принимают 2 аргумента; второй для всех из них является экземпляром WP_Query, который передается по ссылке. Любые проверки
is_search()
или другие вызовы метода WP_Query ( и т. дis_search()
is_home()
.) всегда должны вызываться непосредственно в экземпляре запроса (например$query->is_search()
, при условии, что имя переменной экземпляра находится$query
в сигнатуре обратного вызова), а не в функции шаблона, которая всегда будет ссылаться на основной запрос., а не запрос, для которого работает фильтр.Кроме того, вероятно, не стоит вводить необработанную общедоступную строку поиска непосредственно в SQL-запрос… рекомендуется к прочтению
@EvanMattson — вы прокомментировали выше, что «вероятно, не очень хорошая идея вводить необработанную общедоступную строку поиска непосредственно в запрос SQL». Как можно свести на нет этот риск? Я прочитал предоставленную вами ссылку, но не понял, как она связана с исходным ответом. Большое спасибо Эм.
@EvanMattson Привет, Эван, спасибо за вклад. Я новичок как в php, так и в пользовательском коде WP, и это так далеко зашло мне в голову. Сможете ли вы продублировать код с
$wpdb->prepare()
добавленным, если это не слишком сложно? Я думаю, что пройдут недели, прежде чем я смогу приблизиться к пониманию такого рода вещей.+1 Для плагина Search Everything. Он работает так, как ожидалось, и возвращает больше результатов, чем стандартный поиск WordPress.
Я бы также порекомендовал плагин Search Everything, но если вы хотите реализовать это с помощью функции поиска WP, вот код, который я использую в своей теме Atom:
Он основан на плагине Tag-Search: 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 решает проблему. Таким образом, весь модифицированный код будет таким (у меня отлично работает!)
Я нашел ответ от onetrickpony отличным, но он рассматривает любой поиск как один термин, а также не будет обрабатывать поисковую фразу, заключенную в кавычки.
atom_search_where
Я немного изменил его код (в частности, функцию), чтобы иметь дело с этими двумя ситуациями. Вот моя модифицированная версия его кода:У меня такой же уровень информации, как у Яна. Я знаю, что поиск можно расширить и с помощью плагинов.
Вероятно, Search Everything (плагин WordPress) — это то, что вы ищете. Согласно списку функций, теперь он поддерживает пользовательские таксономии.
У меня та же проблема с плагином корзины 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
на соответствующий нашим потребностям для плагинов корзины.