Як фільтри та гачки дійсно працюють у PHP


21

Як фільтри та гачки насправді працюють у WordPress?

Я запитую про щось просунуте. Як це реалізується в PHP? Наприклад, як він збирає всі гачки з різних плагінів і "прикріплює" їх до основних крюків тощо.


2
Наскільки я знаю, у php немає "гачків" або "фільтрів", є функції. Wordpress має спеціальні функції, які перед їх виконанням використовують зворотний виклик інших функцій.
Офір Барух


3
@OfirBaruch, я впевнений, що ОП посилався на їх реалізацію в WordPress, і не припускав, що існує якась реальна реалізація PHP.
Том Ожер

Відповіді:


33

Огляд

В основному " API плагінів ", який викликає фільтри та гачки, складається з таких функцій:

  1. apply_filters()- виконати
  2. do_action- виконати
  3. apply_filters_ref_array()- виконати
  4. do_action_ref_array()- виконати
  5. add_filter()- додати до стека
  6. add_action()- додати до стека

Основні внутрішні

Загалом, є кілька глобальних (що ще у світі WordPress):

global $wp_filter, $wp_actions, $wp_current_filter, $merged_filters;

Перший $wp_filter- це глобальний, Arrayякий містить усі назви фільтрів як підрядні. Кожен з цих підривків містить ще більше підмагістралей, які викликаються зворотними дзвінками під пріоритетним масивом.

Короткий поглиблений

Отже, коли викликається функція Execute , WordPress здійснює пошук у цих масивах глобалів для ключів з цим ім'ям. Тоді додані зворотні виклики виконують пріоритет після пріоритету. Єдине, що відбувається спереду - це зворотні дзвінки, прикріплені до allфільтра.

Коли ви додаєте зворотний дзвінок за допомогою add_actionабо add_filter, то WordPress спочатку обчислює "унікальний" ідентифікатор, щоб не замінити вже додані зворотні дзвінки.

$idx = _wp_filter_build_unique_id($tag, $function_to_add, $priority);

Потім додає зворотний дзвінок до global $wp_filterстеку:

$wp_filter[ $tag ][ $priority ][ $idx ] = array(
    'function'      => $function_to_add,
    'accepted_args' => $accepted_args
);

Як ви бачите, основним масивом підрозділу є $tag(або ім'я дії / фільтра), тоді все викликається під певний пріоритет, і тоді "унікальний" рядок зворотного виклику / ідентифікатора використовується як ключ.

Пізніше, коли викликається фільтр - що відбувається з $tag/ ім'ям / ім'ям фільтра - масив отримує пошук і викликає зворотній зв'язок. Оскільки він використовує, call_user_func_arrayнасправді не має значення, скільки аргументів додається. WordPress вирішує це сам.

foreach ( (array) current( $wp_filter[ $tag ] ) as $the_ )
{
    call_user_func_array(
        $the_['function'], 
        array_slice(
            $args, 
            0, 
            (int) $the_['accepted_args']
        )
    );
}

3
не забувайте, що під час проходження зворотних викликів він наказує виконання декількох зворотних викликів на одному гачку, використовуючи їх "пріоритет", який встановлюється (необов'язково) за допомогою додавання () та apply_filters () та за замовчуванням до 10.
Том Auger

1
@TomAuger Будь ласка, додайте будь-які додаткові замітки та зміни до відповіді.
кайзер

5

Гачки входять як в основні файли WordPress, так і в деякі файли батьківських тем. Вони дозволяють підключити вміст у певному місці файлу.

Приклад - гак wp_head в WordPress. Ви можете використовувати цей гачок у своїй дочірній темі, щоб додати вміст у цьому місці "

Приклад:

add_action('wp_head', 'add_content_to_head');
function add_content_to_head() {
echo 'Your Content';
}

Деякі теми преміум класу також містять гачки дій, які ви можете використовувати в дочірній темі, щоб зробити те саме. Ось візуальна карта, яка містить усі гачки дій та положення, в якому вони виводять ваш вміст, в тему Genesis.

Приклад:

add_action('genesis_header', 'add_content_to_header');
function add_content_to_header() {
echo 'Your Content';
}

Ось як виглядає гачок, якщо ви відкрили файл header.php в рамках теми Genesis:

do_action( 'genesis_header' );

Ось список гачків WordPress, якими ви можете користуватися багатьма способами.

Фільтри дозволяють змінювати вихідну діючу функцію і вона входить як в основні файли WordPress, так і в деякі батьківські теми, такі як Genesis.

Ось перелік фільтрів, які можна використовувати разом із програмою Genesis Design Framework

Ось список фільтрів, що входять у WordPress

Ось приклад того, як можна використовувати фільтр у такій темі, як Genesis:

add_filter( 'comment_author_says_text', 'custom_comment_author_says_text' );
function custom_comment_author_says_text() {
return 'author says';
}

Наведений вище код можна використовувати в дочірній темі, щоб змінити текст автора у ваших коментарях. Він працює в будь-якій темі.

Ось ще один приклад, який налаштовує довжину уривків до 50 слів:

add_filter( 'excerpt_length', 'change_excerpt_length' );
function change_excerpt_length($length) {
return 50; 
}

Ви знайдете функцію the_excerpt () у файлі wp- include / post-template.php.

Ось як це виглядає:

  function the_excerpt() {
        echo apply_filters('the_excerpt', get_the_excerpt());
}

Ви також можете використовувати гачки та фільтри в плагінах, щоб зробити те саме, і код не буде втрачений, коли ви оновлюєте батьківську тему або WordPress.

В основному, гачки та фільтри дозволяють вам налаштувати та змінити як WordPress, так і батьківську тему, не редагуючи основні файли WordPress або файли батьківських тем.

Значно простіше налаштувати дочірню тему, коли основна тема теми містить гачки та фільтри, оскільки вам ніколи не потрібно редагувати файли шаблонів батьківських тем. Таким чином ви можете сміливо змінювати теми.


2
Це чудовий загальний огляд гачків та фільтрів, але я побоююсь, що цілком не пропускає питання ОП, що стосується внутрішніх принципів роботи гачків та того, як WordPress створює, зберігає та обробляє їх. Чудова відповідь; ви, ймовірно, повинні посилатися на ваш підручник на сайтах WP.
Том Ожер

Гаразд, я його видалю. Моє погано, як я мав би прочитати питання краще, але подумав, що відповіді, які вже були, буде легше для початківців зрозуміти, якби вони знали основне перше.
Бред Далтон

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