Цим уроком ми продовжуємо серію уроків по роботі з запитами до бази даних WP_Query у ВордПрес. Сьогодні ми зосередимось на пов’язаних з запитом фільтрах (filters) та хуках (дії, actions). Це повинно додати вам ще більше впевненості у своїх силах в якості WP-програміста.
Як ви вже знаєте, при роботі з класом WP_Query
ми можемо задіювати не лише спеціальні функції, а також додаткові хуки та фільтри. І сьогоднішній практичний урок присвячено саме цьому.
WP_Query
Давайте детальніше розглянемо фільтри WordPress, що спеціально «налаштовані» під клас WP_Query
. В попередньому уроці ми розглянули 10 спеціальних функцій цього класу, а сьогодні продовжимо і розглянемо основні фільтри та хуки WP_Query
у WordPress.
found_posts
Цей фільтр дозволяє змінювати кількість знайдених елементів, не зважаючи на обмеження, що встановлено аргументом posts_per_page
запиту WP_Query
.
Використання цього фільтру буде особливо корисним, якщо потрібно створити, наприклад, спеціальну розбивку результатів на окремі сторінки.
found_posts_query
Кількість знайдених елементів в результаті запиту обчислюється з допомогою SQL команди SELECT FOUND_ROWS()
. А з допомогою цього фільтру ви можете змінити дану команду.
posts_request
Якщо ви хочете внести зміни у вже сформований SQL-запит, тоді можете скористатися даним фільтром. Іншими словам, цей фільтр повністю «перероблює» SQL-запит, що був сформований класом WP_Query
.
posts_results
Якщо вам потрібно змінити результуючий PHP масив, що був отриманий в результаті запиту WP_Query
(SQL-команди), тоді скористайтеся цим фільтром. Зауважте лише, що даний фільтр працює з необробленим (row) масивом, отриманим SQL запитом.
the_posts
На відміну від попереднього фільтру posts_results
, фільтр the_posts
спрацьовує після внутрішньої обробки масиву. Це може бути корисним, наприклад, коли вам потрібна перевірка неопублікованих та закріплених публікацій.
SELECT
в запиті: posts_fields
Команда SELECT
в SQL запиті визначає, які поля бази даних буде вибрано з результуючих записів, а цей фільтр допоможе «відфільтрувати» її.
LIMIT
в запиті: post_limits
Команда LIMIT
запиту SQL встановлює обмеження для запиту, і цей фільтр допоможе «відфільтрувати» її.
DISTINCT
запиту: posts_distinct
Команда DISTINCT
в SQL запиті вказує, що запит має повертати лише унікальні результати, а цей фільтр допоможе «відфільтрувати» її. Початково WP_Query
не повертає лише унікальні результати, але коли ви використаєте цей фільтр, запит буде скориговано і буде повернено лише унікальні результати.
WHERE
в запиті: posts_where
Команда WHERE
в запиті SQL використовується для операторів SELECT, INSERT
, UPDATE
або DELETE
, і з допомогою даного фільтру ви можете «відфільтрувати» її. Хоча в класі WP_Query
зроблено всю необхідну роботу для фільтрації результатів, для більшого контролю ви можете використовувати цей фільтр.
ДОДАТКОВО: для фільтрування умови WHERE
в запиті після обчислення пейджінгу використовуйте фільтр posts_where_paged
. Цей фільтр є ітерацією до фільтра posts_where
, який можна використовувати із запитами розбивки на сторінки (пейджінг, paging).
ДОДАТКОВО: для фільтрування умови WHERE
у пошуковому запиті використовуйте фільтр posts_search
, який можна використовувати для зміни SQL запиту при отриманні результатів пошуку в WordPress.
posts_join
Оператор JOIN
SQL-запиту дозволяє працювати з кількома таблицями бази даних, а цей фільтр допоможе «відфільтрувати» його. Але потрібно використовувати його дуже обережно.
ДОДАТКОВО: для фільтрування умови JOIN
запиту після обчислення пейджінгу, використовуйте фільтр posts_join_paged
, який подібно до posts_where_paged
працює із запитами розбивки на сторінки.
ORDER BY
в запиті: posts_orderby
Речення (оператор) ORDER BY
в SQL запиті використовується для впорядкування запиту (сортування), а цей фільтр допоможе «відфільтрувати» його.
GROUP BY
в запиті: posts_groupby
Оператор (речення) GROUP BY
запиту SQL змушує запит повертати «згруповані» результати за стовпцем(цями) бази даних, а цей фільтр допоможе «відфільтрувати» його і вказати, як вам потрібно групувати результати.
posts_clauses
Якщо ви хочете мати справу з усіма операторами одночасно, для цього випадку також є відповідний фільтр: posts_clauses
. З допомогою цього фільтру у вас буде контроль над елементами запиту SELECT
, WHERE
, DISTINCT
, JOIN
, GROUP BY
, ORDER BY
та LIMIT
.
WP_Query
А зараз давайте перейдемо від розгляду фільтрів, що пов’язані з класом WP_Query
, до розгляду іншого виду «зачіпок»: хуків.
pre_get_posts
Перш ніж запит буде проаналізовано, у вас є змога взаємодіяти з ним (наприклад, щоб додати додаткові змінні) з допомогою цього хуку. Нижче наведено практичний приклад можливого застосування (якщо є необхідність виключити певну категорію з основного циклу):
<?php add_action( 'pre_get_posts', 'sebweo_exclude_some_category' ); function sebweo_exclude_some_category( $wp_query ) { // додайте категорію до масиву категорій для виключення $excluded = array( 25 ); // якщо потрібно виключити з циклу категорію під ID 25 // $excluded = array( '-1' ); // якщо потрібно виключити найпершу категорію з циклу set_query_var( 'category__not_in', $excluded ); // $wp_query->set( 'category__not_in', $excluded ); // інший варіант написання попереднього речення } ?>
parse_query
На відміну від попереднього хуку pre_get_posts
, який втручається в запит до встановлення змінних запиту, хук parse_query
буде «втручатися» в процес вже після встановлення всіх змінних для запиту. Його можна використовувати, наприклад, якщо вам потрібно перевірити поточні змінні та, при потребі, відкоригувати це.
the_post
Термін the_post
може трохи спантеличити, оскільки це може бути назвою хука дії, або пов’язаної з класом WP_Query
функції, або ж методом WP_Query
класу.
В даному випадку мова піде про дію, яка дозволяє змінювати об’єкт публікації одразу після формування запиту та його встановлення. Тобто, використовуючи цей хук, ви можете безпосередньо змінити результат. Нижче показано простий практичний приклад цього:
<?php add_action('the_post', 'sebweo_novinky_badge'); function sebweo_novinky_badge($post) { if (is_single() && in_category('novinky')) { // якщо це одиночний пост і в категорії з ID (чи слагом) novinky - показати цей бейдж echo '<div class="novinky-badge">' . __('НОВИНКИ', 'i18n') . '</div>'; } } ?>
Ось і все, тема сьогоднішнього уроку вичерпана. Ви лише поверхово познайомились з хуками та фільтрами, адже це не лише цікава тема, але й дуже комплексна, про яку можна багато говорити та писати. Але це виходить за рамки поточного уроку серії. В подальших уроках дана тема буде детальніше оглянута та розкрита.
В наступній частині уроків ми поговоримо про властивості та методи класу WP_Query
, що дозволять вам мати більше контролю над запитом.
Цей практичний урок буде присвячений розгляду аргументів, які можна використовувати для отримання публікацій певних категорій…
Сьогоднішній урок є практичним і слугує ціллю закріпити отримані теоретичні знання з попередніх уроків по…
Продовжуємо серію уроків по роботі з запитами до бази даних WP_Query у ВордПрес. Сьогоднішній урок…
У сучасному цифровому світі питання безпеки, анонімності та швидкого доступу до інтернет-ресурсів стає дедалі актуальнішим.…
Цей урок є продовженням серії про роботу з запитами до бази даних WP_Query у ВордПрес.…