WordPress. Как работают хуки

27.02.2019

Теги: CMSHookPHPWeb-разработкаWordPressСобытиеФункция

В процессе загрузки WordPress происходит множество событий. К каждому из этих событий можно привязать функцию, которая выполнит какое-то действие (action) или изменит данные (filter). Разделение нужно, потому что по смыслу это разные вещи. Действие просто отрабытывает в нужный момент и ничего не возвращает, а фильтр — обрабатывает переданные данные и обязательно должен их вернуть.

Как работают хуки

Это упрощенный вариант реализации хуков, который наглядно показывает, как это работает:

$actions = array(); 

function add_action($hook, $function) { 
    global $actions; 
    if (!isset($actions[$hook])) {
        $actions[$hook] = array();
    }
    $actions[$hook][] = $function; 
}
   
function do_action($hook) {
    global $actions; 
    if (isset($actions[$hook])) { 
        foreach($actions[$hook] as $function) {
            call_user_func($function);
        }
    } 
}

Функция add_action() назначает обработчик $function для события $hook. Функция do_action() инициирует событие $hook, после чего вызываются на выполнение все функции-обработчики этого события.

Примеры хуков-действий

// создадим функцию для хука
function echo_one() {
    echo 'one';
}

// привяжем функцию к хуку
add_action('some_hook', 'echo_one');

// выполним хук
do_action('some_hook'); // выведет «one»
// создадим функции для событий
function echo_one($data) {
    echo $data[0];
}
function echo_two($data) {
    echo $data[1];
}

// привяжем эти функции к хуку
add_action('some_hook', 'echo_one');
add_action('some_hook', 'echo_two');

// выполним хук
do_action('some_hook', array('Привет', ' мир!') ); // выведет «Привет мир!»

Функция add_action()

add_action($hook, $function, $priority, $count);

Прикрепляет указанную функцию на указанный хук. Функция $function сработает в момент события $hook, которое в свою очередь запускается с помощью do_action().

Функция do_action()

do_action($hook, $arg1, $arg2,);

Инициирует событие $hook, к которому могут быть прикреплены произвольные функции. Чтобы функция сработала в момент события, её нужно подключить к этому событию с помощью функции add_action().

Примеры хуков-фильтров

// создадим функцию для хука
function some_filter($str) {
    return 'Привет ' . $str . '!';
}

// привяжем функцию к хуку
add_filter('some_hook', 'some_filter');

// выполним хук
$data = apply_filters('some_hook', 'мир');
// посмотрим, что получилось
echo $data; // выведет «Привет мир!»
// создадим функцию для хука
function crop_string($string) {
    return iconv_substr($string, 0, 6) . '…';
}

// привяжем функции к хуку
add_filter('prepare_string', 'strip_tags');
add_filter('prepare_string', 'crop_string');

// выполним хук
$data = apply_filters('prepare_string', '<h1>Привет, мир!</h1>');
// посмотрим, что получилось
echo $data; // выведет «Привет…»

Функция add_filter()

add_filter($hook, $function, $priority, $count);

Прикрепляет указанную функцию на указанный хук. Функция $function сработает в момент события $hook, которое в свою очередь запускается с помощью apply_filters().

Функция apply_filters()

apply_filters($hook, $value, $arg1, $arg2,);

Инициирует событие $hook, к которому могут быть прикреплены произвольные функции. Чтобы функция сработала в момент наступления события, её нужно подключить к этому событию с помощью функции add_filter().

Поиск: CMS • PHP • Web-разработка • Хук • Hook • Событие • Event • Функция • Function • Filter • Фильтр

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.