Ласкаво просимо в четверту статтю з нашої серії, присвяченій вивченню WP_Query. У попередній частині ми познайомилися з 13 функціями WordPress, пов’язаними з класом WP_Query. Сьогодні ж ми хочемо розглянути WordPress-хуки (фільтри і дії), які можна використовувати разом з WP_Query.

Фільтри, пов’язані з WP_Query

У кодексі WordPress представлено 16 фільтрів, пов’язаних з WP_Query. І сьогодні ми будемо говорити саме про них.

Фільтруємо кількість знайдених записів по запиту: found_posts

Цей фільтр дозволяє змінювати кількість знайдених пунктів без ліміту, зазначеного в WP_Query аргументі posts_per_page.

Його зручно використовувати при створенні користувача пагинации. Давайте подивимося, що про нього йдеться в кодексі:

Наприклад, якщо ви оголошуєте довільне значення зміщення в запиті, WordPress НЕ буде враховувати зрушення з параметра $wp_query->found_posts. Наприклад, якщо у вас після зміщення з 10 записів є ще 45, WordPress буде ігнорувати зрушення, і found_posts все одно видасть результат з 55 записів.

Фільтруємо запит для отримання знайдених записів: found_posts_query

Кількість знайдених записів обчислюється за допомогою MySQL-команди SELECT FOUND_ROWS(). Цей фільтр дозволяє змінювати цю команду, якщо вам потрібно обчислити кількість знайдених записів яким-небудь іншим чином.

Фільтруємо весь SQL-запит: posts_request

Якщо ви хочете повністю змінити SQL-запит, то цей фільтр призначений саме для цих цілей. Він просто переписує SQL-запит, складений класом WP_Query.

Фільтруємо масив, який повертає запит: posts_results

Якщо вам потрібно змінити PHP-масив, який WP_Query генерує за допомогою SQL-запиту, то можна скористатися фільтром. Пропоную вам наочний приклад роботи фільтра.

Врахуйте, що цей фільтр працює з сирим масивом, який генерується з допомогою SQL-запиту.

Фільтруємо масив з отриманих записів: the_posts

На відміну від posts_results, фільтр the_posts обробляє дані після внутрішньої обробки масиву. Завдяки цьому масив буде перевірений на наявність неопублікованих або прикріплених записів. Цей фільтр можна використовувати, якщо вам потрібно виключити неопубліковані або прикріплені запису з масиву.

Фільтруємо список полів запиту (у тому числі поле SELECT запиту: posts_fields

Команда SQL-запиту SELECT визначає поля, які з отриманої бази даних будуть обрані, а фільтр допомагає реалізувати це.

Фільтруємо команду запиту LIMIT: post_limits

Команда SQL-запиту LIMIT встановлює обмеження для запиту, а фільтр допомагає реалізувати це.

Фільтруємо команду запиту DISTINCT: posts_distinct

Команда SQL-запиту DISTINCT вказує, що запит повинен повернути лише певні результати, а фільтр допомагає реалізувати це. Спочатку WP_Query не повертає якісь певні результати, але при використанні фільтра з функцією, яка повертає DISTINCT, запит можна налаштувати під певний тип результатів.

Фільтруємо частину запиту WHERE: posts_where

Команда SQL-запиту WHERE використовується для фільтрації MySQL-операторів SELECT, INSERT, UPDATE або DELETE, а фільтр допомагає реалізувати це. WP_Query виконує всю необхідну роботу по фільтрації результатів, але ви можете розширити можливості фільтрації за допомогою цього фільтра.

Фільтруємо частину запиту WHERE після підрахунку записів з посторінковим висновком: posts_where_paged

Цей фільтр є різновидом фільтра posts_where, який можна використовувати з запитами до записів, що складається з декількох сторінок.

Фільтруємо частину пошукового запиту WHERE: posts_search

Ще один різновид фільтра posts_where, яку можна використовувати для зміни поля запиту WHERE при отриманні результатів пошуку на WordPress.

Фільтруємо команду запиту JOIN: posts_join

Команда SQL-запиту JOIN дозволяє працювати з SQL-командами межах декількох таблиць бази даних, а фільтр допомагає реалізувати це. Це один з найбільш просунутих елементів MySQL, тому я не рекомендую вам використовувати цей фільтр, поки ви не опануєте принципами роботи JOIN в MySQL.

Фільтруємо команду запиту JOIN після підрахунку записів з посторінковим висновком: posts_join_paged

Як і posts_where_paged для posts_where, цей фільтр є ітерацією фільтра posts_join, який працює із запитами для записів, що складаються з декількох сторінок.

Фільтруємо частину запиту ORDER BY: posts_orderby

Команда SQL-запиту ORDER BY відповідає за послідовність запитів, а фільтр допомагає реалізувати це.

Фільтруємо частину запиту GROUP BY: posts_groupby

Команда SQL-запиту GROUP BY дозволяє запитом повернути «згруповані» по полях результати бази даних, а цей фільтр допомагає вибрати метод угрупування.

Фільтруємо всі команди запиту: posts_clauses

Якщо ви хочете працювати з усіма частинами запиту одночасно, то для цього існує спеціальний фільтр posts_clauses. Він охоплює команди WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, SELECT і LIMITS.

WP_Query: пов’язані дії

Коли ми ознайомилися з фільтрами, пов’язаними з WP_Query, давайте перейдемо до іншого типу хуків – до дій.

Втручаємося в запит перед його запуском: pre_get_posts

За допомогою цієї дії ви можете взаємодіяти з запитом до того, як він буде відправлений на обробку. Тобто вносити додаткові змінні запиту:

set( ‘category__not_in’, $excluded );
*/
set_query_var( ‘category__not_in’, $excluded );
}
add_action( ‘pre_get_posts’, ‘tutsplus_exclude_category’ );
?>

Працюємо над парсингом запиту: parse_query

На відміну від pre_get_posts, який дозволяє втрутитися в запит до того, як його змінні будуть виставлені, дія parse_query відповідає за процеси, що відбуваються після цього. Тобто ви можете використовувати це, якщо хочете перевірити поточні змінні.

Змінюємо об’єкт Post: the_post

Термін the_action може трохи збентежити вас, так як ця назва використовується для хука дії, пов’язаної функції і методи класу WP_Query.

Ця дія дозволяє змінювати об’єкт post відразу після виконання запиту. Використовуючи це дія, ви можете безпосередньо змінювати виводяться дані. Давайте розглянемо невеликий приклад:

На завершення

Бажаєте щось додати? Зробіть це, залишивши свій коментар нижче. Наступну частину серії ми присвятимо властивостей і методів класу WP_Query.

Переклад статті «Mastering WP_Query: Actions and Filters» був підготовлений дружною командою проекту Сайтостроение від А до Я.