Проблема з розумінням apply_filters ()


19

In apply_filters ()

apply_filters( $tag, $value, $var ... );

У мене виникли проблеми з обгорткового мою голову навколо $valueі $var. Я читаю кодекс, і це здається, що його $valueможна змінити $var, але ні, але я не знайшов прикладів цього в дикій природі. Здається, він використовується як спосіб передачі змінної. У такому випадку, яка різниця між тим і тим $var?

Відповіді:


35

Спробуйте побачити функцію з кращими іменами:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);

Отже, коли ця функція називається так:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );

Ви можете використовувати…

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );

… І отримайте дві змінні, передані цій функції. Ви повертаєте перше, друге забезпечує лише більше контексту:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}

Додаткові змінні є для того, щоб зробити ваші рішення простішими, а також не змінювати їх.


Якщо я правильно розумію. Я не додаю змінну для збору повернутого значення з apply_filters, оскільки воно автоматично застосовується до $ value_to_change?
r00tAcc3ss

@ r00tAcc3ss Нічого не відбувається автоматично. Вам потрібно змінити значення зворотного дзвінка. Ви також можете повернути його без змін, якщо хочете - залежно від контексту.
fuxia

О так. Я мав на увазі, я не повинен приймати повернене значення в іншу змінну і присвоювати йому значення $. Це робиться, якщо я змінив значення $ у підключеній функції і повернувся "автоматично".
r00tAcc3ss

11

Що таке фільтри?

Фільтри - це функції, через які WordPress передає дані, в певні моменти виконання, безпосередньо перед тим, як здійснити певні дії з даними (наприклад, додати їх до бази даних або відправити на екран браузера). Фільтри розташовуються між базою даних та браузером (коли WordPress генерує сторінки) та між браузером та базою даних (коли WordPress додає до бази нових публікацій та коментарів); більша частина вводу та виводу в WordPress проходить принаймні один фільтр. WordPress виконує деяку фільтрацію за замовчуванням, і ваш плагін може додати власну фільтрацію.

Зачеплення у фільтр

Для того, щоб дозволити користувачам змінювати деякі конкретні дані (значення, вихід функції тощо), гачки фільтрів забезпечуються за допомогою apply_filtersфункцій.
Ці гачки фільтрів включають ім'я (або тег ) фільтра та принаймні ім'я функції, яке має використовуватися для фільтрації (тобто деяким чином змінити) даних.

Щоб змінити назву публікації, ви можете використовувати the_titleгачок фільтра, який визначається наступним чином:

apply_filters( 'the_title', $title, $id );

Це означає, що фільтр має тег / ім'я the_title, перший параметр $title- це дані, які слід змінити (тобто, назва посади), а другий параметр $id- додаткова інформація (у цьому випадку ідентифікатор повідомлення).

Наприклад, для відображення заголовка кожної публікації в ПОНОВНІ, можна використовувати наступний рядок:

add_filter('the_title', 'strtoupper');

Якщо ми подивимось на add_filterфункцію, то побачимо, що вона визначається наступним чином:

add_filter( $tag, $function_to_add, $priority, $accepted_args );

Ми вказали лише перший та другий (необхідний) параметр, тоді як третій та четвертий параметри встановлені у відповідному значенні за замовчуванням (тобто, 10та 1).

Більш складний фільтр

Якщо ви хочете відфільтрувати лише певну публікацію , ви можете скористатися додатковою інформацією (у випадку цього фільтра: ідентифікатором). Для цього потрібно вказати кількість параметрів (що в даному випадку становить 2), і для того, щоб це зробити ще раз, потрібно вказати параметр пріоритету (який постає перед кількістю аргументів).

Припустимо, ми хочемо впливати лише на назву публікації з ідентифікатором 42, то це виглядає приблизно так:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper

У цьому випадку ми повинні вказати всі чотири доступні параметри.

Які параметри у мене є?

Щоб визначити (кількість) доступних параметрів певного фільтра, ви повинні шукати, де він визначений (у даному випадку: тут ).


Список літератури :


2
+1 за ретельну відповідь та бездоганний клас (приємне форматування брошури)!
bosco

Дякую, це дуже ретельно, але насправді не пояснює, про що я питав. напр. різниця між змінною значення $ та змінною $ var у фільтрі.
r00tAcc3ss

Гм, я б сказав, так і є, але це, звичайно, моє суб'єктивне почуття. Я додамо деяку інформацію про фільтр та його параметри.
tfrommen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.