Підступна війна росії проти України. Орієнтовні втрати ворога
(станом на 20.02.2025)
863580
осіб
370
літаків
331
гелікоптерів
10134
танків
21112
ББМ
23410
артилерія
1078
ППО
1291
РСЗВ
37961
машин
28
кораблі і катери
Використання запитів WP_Query у WordPress — частина 4 (хуки та фільтри)
Опубліковано

Використання запитів WP_Query у WordPress — частина 4 (хуки та фільтри)

 

 

Цим уроком ми продовжуємо серію уроків по роботі з запитами до бази даних 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(). А з допомогою цього фільтру ви можете змінити дану команду.

 

Фільтрування усього SQL запиту: 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.

 

Фільтрування умови JOIN запиту: 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.

 

Хуки (дії, екшени, actions), що пов’язані з запитом 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, що дозволять вам мати більше контролю над запитом.

 

 

Напишіть тут свою думку/питання

Ваша пошта не публікуватиметься. Обов’язкові поля позначені *


Швидкий доступ по сайту SebWeo
Пригости мене кавою