Додавання додаткових фільтрів до списку записів у адмінці WordPress, вебісторій
Іноді потрібно додати додаткові фільтри до списку записів для фільтрації по різних полях і таксономії. Часто фільтрація потрібна у списках постів у плагінах, там, де пости мають кастомні поля.
У моєму прикладі я додаватиму фільтри до списку записів типу «hotel_room», я додам туди два нових фільтри - «тип номера» та «назва готелю»:
Як дізнатися тип запису (поста), куди вам потрібно додати фільтри? Дуже просто, потрібно на сторінці, на яку ви хочете додати фільтри, у рядку браузера подивитися GET параметр "post_type", зверніть увагу на скріншот вище і вам відразу все стане ясно.
Зауважте, що у списку «Записи -> Усі записи» параметр post_type відсутній. Тобто, щоб додати фільтри на сторінку цього списку записів, потрібно перевіряти відсутність параметра post_type.
Якщо не використовувати перевірку на тип посту, ваші нові фільтри будуть відображатися у всіх списках постів, що я вкрай не рекомендую робити.
Отже, давайте додамо два нових фільтри до списку записів, у моєму випадку з типом hotel_room. Для додавання нових фільтрів до файлу functions.php вашої теми потрібно додати кілька нових функцій. Файл functions.php знаходиться в папці wp-content/themes/ваша_тема, якщо його там немає, просто створіть його.
Додаємо дію "admin_posts_filter_restrict_manage_posts" до функції wordpress "restrict_manage_posts":
Але це ще не все, зараз фільтри відображаються в адмінці, але не працюють. Ми налаштували їх відображення, тобто frontend частина, тепер потрібно зробити обробку даних на стороні сервера, тобто backend частину.
Перший варіант – додати фільтр (функція add_filter) до функції wordpressparse_query(), додавши до функції значення наших фільтрів. Працює тільки якщо ви робите пошук по мета-полю посту:
Але що, якщо нам потрібно фільтрувати пости за таксономією, чи іншим (не мета) полям посту? У цьому випадку можна внести зміни в сам запит sql, який формується для завантаження списку постів. Для цього необхідно використовувати функцію wordpress posts_where(). Додамо фільтр для цієї функції у functions.php:
Приклад реалізації функції для фільтрації таксономії: