Фильтр по дополнительным полям в вордпресс. Добавляем фильтр таксономий на Ajax в поиск WordPress

На сегодняшний день WordPress – одна из самых популярных систем управления контентом в мире. Одна из причин, благодаря которым она заслужила такую популярность, является возможность быстрого расширения функционала. В этой серии статей мы расскажем о фильтрах – одним из лучших способов точной настройки WordPress .

В основе этого способа лежат хуки — фильтры и действия WordPress . Без них мы не сможем воспользоваться расширяемостью WordPress в полной мере. В этой серии статей мы остановимся на фильтрах для WP — одном из лучших методов настройки для этой CMS . Серия состоит из семи частей. В них все наше внимание мы сосредоточим на следующем:

  • определим понятия WordPress -фильтра;
  • рассмотрим методы их внедрения в систему;
  • приведем примеры использования (в статье, которую вы читаете сейчас );
  • изучим 50 WordPress – фильтров (по десять в каждой статье ) с примерами;
  • и напишем итоговую статью, в которой резюмируем проведенную работу.

Есть буквально сотни WordPress -фильтров в ядре и эти 50 примеров только малая часть из них (около 10% ), так что вы сами можете добавить что-то из того списка и предложить примеры использования новых фильтров.

В любом случае, время для введения в WordPress -фильтры настало. Давайте начнем!

Что такое WordPress — фильтр

В Кодексе WordPress фильтрам дано следующее определение:

Фильтры используются как промежуточное звено между базой данных и браузером. Обычно ввод и вывод данных в WordPress проходит, как минимум, через один фильтр. По умолчанию в WordPress уже работает фильтрация, но, с помощью плагинов, вы можете добавить свои фильтры.

Итак, фильтр это функция на php , которая записывается в стек вызовов встроенной системы фильтров WordPress . Но в себе она может содержать сторонние функции и другие конструкции. Фильтр является одним из двух видов хуков (hooks ) в WordPress . Второй — действие (action ), но это предмет для другой серии статей.

Возможно, эта тема покажется вам сложной, но фильтры (как и действия ) очень легко понять. Вначале моего знакомства с этими понятиями мне самому показалось все довольно сложным и запутанным, но, увидев, насколько они просты, я познакомился с сотнями фильтров и действий, просто изучая кодекс WordPress или копаясь в исходном коде. Определенно, вам также стоит узнать о сотнях фильтров. Но для начала вы должны научиться их использовать.

Используем фильтры в WordPress

Использовать фильтры в WordPress , как я уже сказал, довольно легко. Некоторые основные функции стоит выучить и узнать о том, что делает каждый фильтр. Стоит признать, что довольно тяжело выучить функционал всех фильтров сразу, но этого и не стоит делать. Вы познакомитесь с ними в процессе работы, по мере необходимости.

В этой статье мы собираемся проделать четыре вещи:

  • Создадим функцию фильтра;
  • Сделать из нее хук;
  • Убрать функцию из фильтра;
  • Создать свой собственный фильтр.

Создаем функцию и прикрепляем ее к фильтру

Для того чтобы поиграть с данными, которые мы получим из фильтра, необходимо создать функцию, которая определит, какие действия она будет выполнять с данными и затем подключить ее к фильтру.

Давайте предположим, что мы будем писать плагин для удаления гласных в заголовках публикаций. Вместо того чтобы писать «удалить гласные в моих постах », мы пишем «подключить функцию удаление гласных из заголовков моих публикаций к фильтру ».

Сложно? На самом деле, нет. В приведенном ниже примере, мы напишем код функции, которая удаляет гласные во всем тексте:

Функция берет строку заголовка $title , удаляет гласные и возвращает строку. Довольно просто, верно? Теперь прыгнем на уровень выше, сделаем хук, и прицепим его к фильтру:

Заметили новую функцию? Взглянем на add_filter():

  • $tag (обязательный параметр ) – имя фильтра;
  • $function_to_add (обязательный параметр ) – имя функции для хука;
  • $priority (опция ) – Целое число для определения момента исполнения функции. По умолчанию равно 10: Функция сработает раньше, если вы снизите значение, и позже, если вы повысите его;
  • $accepted_args (опция ) — Значение, нужное чтобы определить количество аргументов, которые пропускает фильтр. Значение по умолчанию равно1.

Удаляем фильтр

Конечно же, мы также можем убрать функцию, прикрепленную к фильтру. Для этого используем функцию remove_filter() . И смотрим, как она работает:

Параметры такие же, как и в случае с add_filter() :

  • $tag (обязательный параметр ) – имя фильтра;
  • $function_to_remove (обязательный параметр ) – имя функции для удаления;
  • $priority (опция ) — приоритет функции (определено при первом подключении функции ).

Еще одна функция, remove_all_filters() , у которой всего лишь два параметра ($tag и $priority ), в которых указываются имя функции и приоритет. Имя функции говорит само за себя. Она отключает все функции, прицепленные к фильтру.

Создаем свой собственный фильтр

Хотите знать, как создаются фильтры? Для этого существует специальная функция apply_filters() , находящаяся в ядре. Конечно же, ее можно использовать и вне ядра, и это означает то, что мы можем создавать фильтры внутри наших плагинов.
Посмотрим, как это работает на практике:

  • $tag (обязательный параметр ) – имя привязываемой функции;
  • $value (обязательный параметр ) — значение, которое будет меняться функцией, подключенной к фильтру через add_filter();
  • $var1, $var2 и так далее (опционально ) – параметры фильтра (столько, сколько потребуется). Функция фильтра может использовать эти параметры, но они не смогут быть возвращены функциями.

Подумаем над таким примером: Представьте, что вы пишите функцию, которая возвращает только известную цитату Питера Гриффина:

Если вы хотите дать возможность пользователю отфильтровать эту цитату (не трогая код вашего плагина ), вам нужно использовать функцию apply_filters() следующим образом:

Таким образом, другой разработчик сможет использовать ваш плагин и обработать данные вашей функции как в этом примере:

Теперь, каждый раз, когда будет вызвана функция peter_griffin_quote() , цитата Питера будет слегка видоизменяться, при этом код плагина останется неизменным. Отлично!

Заключение

Чем больше вы работаете с фильтрами, тем веселее идут дела. Есть сотни фильтров, и, изучая их, вы каждый раз подходите на один шаг ближе к тому, чтобы стать WordPress — гуру. В следующей части этой серии статей мы собираемся рассказать о 10 WordPress — фильтрах:

  • login_errors;
  • comment_post_redirect;
  • allowed_redirect_hosts;
  • body_class;
  • locale;
  • sanitize_user;
  • the_content;
  • the_password_form;
  • the_terms;
  • wp_mail_from.

Мне не терпится приступить к написанию следующей статьи из этой серии, и я надеюсь, что она окажется полезна вам, так же, как и мне. Если вы думаете, что сможете помочь мне с уроками, предлагая другие фильтры или примеры, не стесняйтесь, поделитесь своими мыслями в комментариях.

Наличие на сайте поискового механизма позитивно сказывается на его посещении. Ведь таким образом посетитель может быстрее найти необходимую ему информацию даже в том случае, если присутствует хорошая навигация или карта сайта.

Среди стандартных инструментов WordPress имеется необходимая система поиска, которую в принципе можно вывести в любой части сайта. Безусловно, это очень удобно, так как эта гибкость может быть использована при разработке любой темы. Но тут есть один момент. Стандартный поисковый механизм не позволяет как-либо фильтровать результаты поиска. Но было бы неплохо иметь такую возможность, особенно если на сайте много категорий или меток.

Как в WordPress добавить фильтр в поиске?

Одним из способов решения этой задачи является использование бесплатного WordPress-плагина Search & Filter .

Плагин Search & Filter

С помощью Search & Filter посетители Вашего сайта смогут выполнять поиск по категориям, тегам, пользовательской таксономии, типу записей, дате публикации или любой их комбинации, чтобы действительно улучшить поисковые запросы. Поля фильтра могут отображаться в виде выпадающего меню, флажков, переключателей или множественных выборок.

Во-первых, плагин нужно установить и активировать. После активации плагин добавит новый пункт меню Search & Filter в панель администратора WordPress. Нажав по нему, Вы перейдете на страницу использования плагина с подробной документацией о том, как его использовать.

Следует отметить, что плагин не добавляет поисковые фильтры на сайт в автоматическом режиме. Для этого он предлагает специальные шорткоды, которые принимают разные параметры для отображения параметров фильтрации. Вы можете использовать их любом месте сайте, включая виджеты, что обеспечивает гибкость в отображении и настройке.

Например, для отображения в окне поиска раскрывающегося списка категорий и тегов Вы можете использовать следующий шорткод:

Для вставки его в любое место WordPress-шаблона используют служебную команду do_shortcode() , которая отображает на странице содержимое шорткода. Она будет иметь вид:

Если добавить этот код в файл search.php , то страница поиска будет выглядеть так:

Рассмотрим другой пример, включающий включающий категории, теги, типы записей и дату.

Теперь вместо использования выпадающего поля выбора Вы также можете использовать флажки и добавлять метки для каждого поля. Для этого нужно добавить еще два параметра в наш шорткод.

Если Вы используете отдельную страницу для отображения своих сообщений в блоге, Вы можете добавить этот короткий код на страницу.

Если Вы используете несколько полей, типов и заголовков, то нужно убедиться, что элементы находятся в одном порядке для каждого параметра.

Давайте посмотрим другой пример. На этот раз мы добавим поля категорий, тегов и почтовых полей с разными заголовками и типами полей формы.

Также эти шорткоды можно использовать в виджетах.

Часто бывает необходимо не выводить все категории на главную страницу блога wordpress. Нужно фильтровать записи по принадлежности к категории. Здесь вариантов два, первый фильтр - не выводить записи некоторых категорий, а второй выводить записи только избранных категорий. Я думаю чаще приходится сталкиваться с первым фильтром. Я захотел отфильтровать записи определенной категории, заполненной только справочной информацией. Зачем создавать кучу коротких постов на главной странице, к тому же в этой куче будут ещё и тематические статьи, а для них у меня категорий побольше, чем категорий со справочной информацией. Так что отфильтрую записи одной категории из вывода на главной странице и всё.

Есть замечательная функция в wordpress, которая изменяет стандартный запрос при прохождении циклом по базе. Это функция query_posts() , она принимает очень много параметров, влияющих на запрос, и как следствие вывод записей на страницу. Мне нужно указать категорию которую не нужно выводить. Для этих целей есть несколько вариантов:

  • параметр category__not_in - записи, не входящие в указанную категорию;
  • параметр cat - id категории.

Выберу ту что короче.

Запишем функцию для нашего случая:

query_posts(array(‘cat’ => -1));

Указывать значения рубрик, которые не будут входить в вывод нужно через запятую. Располагаете этот код выше цикла wordpress на главной странице «index.php» и записи из указанных категорий выводится не будут.

-1, -5));?>

Этот код отфильтрует категории 1 и 5, которые не будут выводится на главной странице.
Запускаем, проверяем.

Все работает - записи указанных категорий в выводе не обнаружены. Но есть одно НО!

Внизу страницы под записями находится постраничная навигация. В админ-панели можно ограничить количество выводимых записей на странице, и чтоб увидеть остальные записи придется воспользоваться этой навигацией. Только не вышло у меня этого сделать, кликаю по ссылкам навигации, а статьи все те-же. Начался квест, в финале которого приз - решение проблемы с постраничной навигацией. Я сразу не догадался от чего такое поведение. Часа два поисков и оказывается этот самый вызов функции query_posts() , причина такого поведения постраничной навигации. Но мне очень нужно убрать из вывода категории со справочной информацией и … Квест продолжается.

Долго ли, коротко ли…. Думал уже отложить поиск решения. Как зацепился за параметр ‘paged’ . Он отвечает за постраничную навигацию и для нормализации работы навигации нужно задать этому параметру значение get_query_var(‘paged’), что указывает на текущий номер страницы в постраничной навигации.

В итоге получаем функцию, которая переопределяет 2 параметра:

-1, "paged" => get_query_var("paged")));?>

Закрываем для вывода первую категорию и задаем параметр ‘paged’ .
Теперь код работает, как хотелось.

(Всего посетителей: 1 134, сегодня: 1)

Всем привет, сегодня хочу продолжить тему поиска по WordPress. На этот раз я расскажу вам как сделать поиск по полям wordpress (имеется ввиду произвольным полям, пользовательским, дополнительным полям они же custom fields).

В предыдущих статьях я рассказывал и показывал вам , а также описывал . В этих темах я частично затрагивал тему поиск по полям wordpress, теперь попробую описать более разлого.

Зачем нужен wordpress поиск по дополнительным полям

В первую очередь поиск по полям wordpress нужен, если у вас не стандартный сайт или блог на WP, в смысле, информация записанная не только в тексте (контенте) поста.

Штатная функция поиска WP, к сожалению, ищет только в заголовках и тексте поста или страницы. На большее она не способна, по этому приходится или писать свою функцию поиск по дополнительным полям или использовать плагин.

Например, на сайте недвижимости, магазине, каталоге и тому подобное, поиск по произвольным полям критически необходим. Ведь как найти вещь в магазине по артикулу или адрес квартиры, или модификацию товара. Конечно можно записать эти данные в заголовок или текст страницы, но тогда это будет не сайт, а просто какой то монстр. Более подробно, зачем нужны я уже описывал. Также, заводилась тема по поводу их удобного использования с помощью плагина .

Поиск по произвольным полям wordpress позволяет:

  • выводить более релевантные результаты;
  • манипулировать с поиском WP;
  • показывать результаты, в которых не встречается поисковая фраза (например указывать слова с ошибкой и тому подобное).

Как организовать поиск по полям wordpress

Думаю существует множество вариантов реализации поиска по произвольным полям, один из них написание собственных MySQL запросов. Но этот способ не доступе рядовом блогеру, да и вряд ли он будет лучше чем поисковый плагин. Хотя иногда используется и самопальный поиск, например для создания фильтров и прочих задач. Но сегодня не о них. Сейчас я покажу вам несколько плагинов поиска для Вордпресс, которые умеют делать поиск по полям.

Поиск по полям на Relevanssi

Отличный плагин, который позволяет по мимо прочего делать поиск по полям вордпрес. Весь процесс настройки очень простой и интуитивно понятный.

Имеется русский язык интерфейса и многое другое.

Для создания поиска достаточно указать в настройках какие поля нужно учитывать в поиске. Можно указать все, исключить скрытые или через запятую записать массив имен полей.

Чтобы сделать поиск по произвольным полям wordpress вам нужно:


К преимуществам этого плагина можно отнести то, что поисковый индекс создается заблаговременно, то есть нагрузка на сервер при поиске минимальная. Это очень полезно, если у вас большой сайт или очень много уникальных пользователей в сутки.

Поиск по произвольным полям на Search Everything

Второй плагин для поиска по дополнительным полям, который я хочу порекомендовать, - Search Everything. Он имеет меньше настроек чем предыдущий, но это не мешает ему хорошо делать поиск по полям wordpress.

Чтобы подключить поиск по произвольным полям вам нужно:


Этот плагин предназначен для фильтрации записей по рубрикам и меткам. Плагин может фильтровать записи как для главной страницы, так и для какой-либо другой страницы вашего блога. Вы можете настроить фильтр для любой страницы, однако он будет работать только в случае, если на этой странице размещен код. Возможно отключение фильтра для конкретной страницы с сохранением всех настроек.

Скачать плагин можно отсюда . Ну а теперь - подробности.

Плагин фильтрует записи в трех режимах:

  1. По рубрикам;
  2. По меткам;
  3. По рубрикам и меткам.

Несколько особенностей работы фильтра:

  • eсли запись размещена хотя бы в одной указанной в настройках фильтра рубрике, она будет выведена;
  • если запись содержит хотя бы одну указанную в настройках фильтра метку, она будет выведена;
  • фильтрация “по рубрикам и меткам” работает по следующему правилу - запись будет отображена только в случае, если она содержит указанный тег И содержится в указанной рубрике.

Возможно указание количества записей на страницу отдельно для каждой страницы. По умолчанию используется значение “Записей на страницу” из настроек Wordpress (Настройки → Чтение).

Код для страницы

Для того, чтобы плагин фильтровал записи на определенной странице, на ней должен быть размещен специальный код. По умолчанию этот код выглядит так:

В таком формате плагин отфильтрует записи, используя свои настройки. В более развернутом формате возможно переопределение заданных настроек плагина:

Выше приведен пример развернутой записи кода со всеми параметрами и их значениями по умолчанию. Указывать все параметры необязательно. Определение параметров:

  • heading_tag - параметр для задания тега заголовка записи. По умолчанию - h2 ;
  • heading_class - параметр для задания стиля заголовка. По умолчанию - entry-title ;
  • content_tag - параметр для задания тега выдержки записи. По умолчанию - div ;
  • content_class - параметр для задания стиля выдержки записи. По умолчанию - entry-content ;
  • per_page - параметр для задания количества записей на страницу. По умолчанию - значение из Настройки → Чтение или 10.

Свои комментарии, отзывы, и т.п. можете оставить здесь. Также можете создать обсуждение . Если вы нашли какие-либо баги, или у вас есть предложение о том, как улучшить плагин, вы можете использовать инструмент для отслживания ошибок . Если вы хотите локализовать плагин на свой язык, вы можете взять файл wp-posts-filter.pot за основу для перевода. О том, как создать файл локализации, можно прочитать . Если вы хотите, чтобы ваша локализация была включена в дистрибутив плагина, свяжитесь со мной.