Хуки в WordPress (фільтри та події)
У цій статті я зібрав усю базову інформацію про хуки WordPress. А також постараюся пояснити, як працюють хуки максимально просто. Принцип роботи хуків не складний, але далеко не всі його розуміють добре і це велике недогляд, тому що хуки це дуже потужний інструмент для зміни поведінки ядра WP, створення плагінів та тем.
Є два типи хуків:
- Фільтр (filter)
- Змінює значення змінної – отримує значення та повертає його (змінене чи ні).
- Подія (action)
- Запускає довільний код – колбек функція прикріплений до хука спрацює в момент спрацювання хука в коді.
До хуків (фільтрів чи подій) прикріплюються PHP функції їх ще називають коллбеками (callback), потім ці функції спрацюють у момент спрацьовування хука. Така поведінка у програмуванні називається перехоплення .
У функцію, прикріплену до хука, можуть передаватися параметри (додаткові дані). На основі цих даних у функції можна створювати будь-яку логіку. Читайте нижче .
Простий приклад хука-події (action):
// Створимо функцію для хука - події function echo_1(){ echo 'Hello'; } // прив'яжемо функцію до хука add_action( 'my_hook', 'echo_1'); // створюємо/використовуємо/запускаємо хук do_action( 'my_hook'); //> виведе на екран слово "Hello"
Приклад із передачею параметра:
// Створимо функції для подій function echo_1( $data ){ echo $data[0] .' '. $data[1] .'!'; } // прив'яжемо функції до хука add_action( 'my_hook', 'echo_1'); // створюємо/використовуємо/запускаємо хук do_action( 'my_hook', [ 'Привіт', 'світ' ] ); //> виведе "Привіт світ!"
У програмній частині фільтри та події – це одне і теж, тобто. у коді і те, й інше працює однаково, можна наприклад замінити функцію add_action() – все буде працювати! Поділ потрібен, тому що це різні речі за змістом.
Список усіх хуків WP дивіться на сторінці «Всі хуки WordPress» .
Загалом у WordPress їх близько 2000. Деякі важливі хуки я описав і продовжую описувати, вони тут .
Як працюють Фільтри у WordPress
Для роботи фільтра використовуються дві функції:
add_filter( hook_name, function, priority, args_num ) — додає/прикріплює функцію до фільтра, яка буде викликана в момент спрацювання фільтра. Така функція називається «коллбек-функція».
- apply_filters( hook_name, value, args… ) – Створює хук-фільтр. Запускає прикріплені до фільтра колббек-функцію.
На момент спрацьовування хука в ньому відпрацюють ті колббеки, які вже були додані. Тобто. прикріплювати коллбек потрібно до того, як фільтр буде викликаний за допомогою apply_filters() .
приклад
// коллбек-функція function my_filter_function( $str ){ return 'Привіт'. $str; } // Прикріпимо коллбек до фільтра. add_filter( 'my_filter', 'my_filter_function'); // Виклик фільтра $name = apply_filters( 'my_filter', 'Володимир' ); echo $name; //> Доброго дня Володимир
Ще приклад
Припустимо, ми маємо функцію text() , яка повертає текст. Нам потрібно зробити так, щоб текст можна було змінювати за межами цієї функції. Для цього назвемо наш фільтр my_filter_name
і створимо хук:
function text( $text ){ // видалимо html теги з тексту $text = strip_tags($text); // Повертаємо текст через фільтр. return apply_filters( 'my_filter_name', $text); } // коллбек функція function my_filter_function( $text ){ // обріжемо текст до 30 знаків return mb_substr( $text, 0, 30 ) .'...'; } // Прикріпимо функцію до фільтра add_filter( 'my_filter_name', 'my_filter_function'); // Викликаємо text() // функція видалить з тексту html теги - це зробить вона сама за допомогою strip_tags (). // А далі обріже текст - це зробить наш фільтр $text = 'Lorem <b>Ipsum</b> is simply dummy text printing and typesetting industry.'; echo text($text); // виведе: // Lorem Ipsum is simply dummy te...
Фільтрів у WordPress багато і ви, напевно, з ними зустрічалися в темах і плагінах. Популярні з них: the_content
, body_class
, sanitize_user
, comment_form
.
Як працюють Події у WordPress
Для роботи події використовуються дві функції:
add_action( hook_name, function, priority, args_num ) — додає/прикріплює функції до події, що викликається за допомогою do_action() . Функція повинна прикріплюватися до події, перш ніж подія відбудеться. Потрібно, щоб під час спрацювання події PHP функції вже були прикріплені до події.
- do_action( hook_name, args … ) – Це і є подія. Запускає/викликає додані до події функції. Викликається там, де має спрацювати подію.
do_action() має викликатися після add_action() , тобто. після того, як до події додано функцію, що логічно…
приклад
Допустимо, ми робимо тему і в якомусь місці теми нам потрібно викликати функцію, але ми заздалегідь не знаємо, як функція буде називатися. Тобто. користувачі самі додаватиму функцію в це місце.
Для цього в цьому місці шаблону ми можемо викликати не функцію, а подію, назвемо її my_action
і потім прикріпити до цієї події функцію:
// Створимо функцію для події function my_action_function( $text ){ echo 'Подія "my_action" спрацювала зараз.'; } // Прикріпимо функцію до події 'my_action'. Це можна зробити в іншому файлі // Головне перш ніж подія спрацює. add_action( 'my_action', 'my_action_function'); // Виклик самої події. Вставляємо цей рядок у місце теми де потрібно, // щоб спрацювала прикріплена до нього функція do_action( 'my_action'); //> на місці цього коду буде виведено напис: // 'Подія "my_action" спрацювала зараз.'
З подіями ви теж зустрічалися їх багато і одні з найпопулярніших це: wp_head
, wp_footer
.
Пріоритет хука
Пріоритет важливий коли до хука прикріплюється кілька callback-функцій. Пріоритет визначає порядок, коли callback-функція буде виконуватися по відношенню до інших callback-функцій.
Пріоритет вказується в третьому параметрі для функції, яка прикріплює функцію до хука:
add_action( 'init', 'hook_callback1', 8); add_action( 'init', 'hook_callback2', 9);
Функція з пріоритетом 8
виконається раніше з пріоритетом 9
. Якщо пріоритет не вказано, то він дорівнює 10
пріоритет за замовчуванням.
Якщо дві функції прикріплені до одного хуку з однаковим пріоритетом, вони виконуватимуться у порядку їх прикріплення.
Розглянемо як працюють пріоритети на прикладі:
add_action( 'init', 'run_me_late', 11); add_action( 'init', 'run_me_early', 9); add_action( 'init', 'run_me_normal'); // пріоритет 10 за умовчанням add_action( 'init', 'run_me_normal_two'); // пріоритет 10 за умовчанням
У момент спрацьовування хука init
функції виконуватимуться в наступному порядку:
- run_me_early()
- run_me_normal()
- run_me_normal_two()
- run_me_late()
Як видно, що більше пріоритету, то пізніше виконатися хук.
- Якщо пріоритет не зазначений, як у першому прикладі, він дорівнює 10.
Для фільтрів пріоритети працюють так само.
Параметри хука
У колбек-функцію, що прикріплюється, можуть передаватися якісь дані – параметри. Їх можна використовувати в момент спрацьовування хука, щоб створити якусь логіку.
Наприклад, коли WordPress зберігає запис, запускається подія save_post . Цей хук може передати два параметри: ID записи
і объект записи
:
do_action( 'save_post', $post->ID, $post );
За промовчанням передається лише перший параметр $post->ID
:
add_action( 'save_post', 'my_save_post_callback'); function my_save_post_callback( $post_id ) { // Доступний один параметр }
Однак можна вказати, що ми хочемо отримати 2 параметри. Для цього вкажемо четвертий параметр add_action()
:
add_action( 'save_post', 'my_save_post_callback', 10, 2); function my_save_post_callback( $post_id, $post ) { // Доступні 2 параметри }
Обмеження в один параметр за промовчанням зроблено для швидкодії системи хуків.
Для фільтрів все працює аналогічно
При створенні фільтра в нього можна передати скільки завгодно параметрів через кому:
$str = apply_filters( 'my_filter', $str, $data1, $data2);
Тепер при додаванні коллбека. Ми можемо використовувати ці опції. Для цього потрібно вказати кількість параметрів, що передаються:
add_filter( 'my_filter', 'my_filter_function', 10, 3);
3
– кількість параметрів, які отримає функція my_filter_function() під час виклику.
Функція фільтра виглядатиме так:
function my_filter_function( $str, $data1, $data2 ){ // Можемо використовувати $data1, $data2 return $str; }
Видалення хука
Щоб видалити хук, потрібно змінити вихідний код і видалити виклик хука, зазвичай це зробити неможливо, тому що хуки знаходяться в ядрі або плагіні. Тут ми поговоримо про те, як можна видалити прикріплені до хука коллбек-функції.
Для видалення функції, прив’язаної до фільтра/події, використовується одна з функцій:
Для довідки. Це повністю однакові функції і обидві вони видаляють хук, а фільтр це чи подія, у разі, значення немає. Так наприклад, подію та фільтр ми можемо видалити, використовуючи тільки функцію remove_filter() або тільки remove_action() . Але для зрозумілості коду, все ж таки краще фільтри видаляти за допомогою remove_filter() , а події за допомогою remove_action() .
Для видалення хука потрібно знати:
- Назва хука , наприклад
wp_footer
; - Назва прикріпленої функції наприклад
my_action_function
з прикладу вище; Пріоритет виконання хука , якщо він був встановлений під час створення хука. Якщо при створенні пріоритет не було встановлено, він дорівнює 10 і при видаленні його вказувати не обов’язково.
Якщо потрібно видалити хук із пріоритетом відмінним від 10 і ви його не вказали, то хук НЕ буде видалено!
Приклад видалення хука
Допустимо десь у плагіні, до події wp_footer
прикріплена функція my_action_function
, яка виводить текст у підвалі теми:
add_action( 'wp_footer', 'my_action_function'); function my_action_function( $text ){ echo 'Це текст у підвалі!'; }
У темі нам потрібно видалити цю подію, щоби текст у підвалі не виводився. Для цього у файлі теми functions.php можна прописати такий код:
remove_action( 'wp_footer', 'my_action_function');
Важливий момент: видаляти хук потрібно після того, як він доданий, але ще не відпрацював.
Ще приклад видалення хука
Демонстрація додавання та видалення хука в одному коді:
// додаємо функцію до події my_action add_action( 'my_action', 'my_action_function'); function my_action_function( $text ){ echo 'Привіт!'; } // створюємо подію do_action( 'my_action'); //> Привіт! // видаляємо додану раніше подію remove_action( 'my_action', 'my_action_function'); // створюємо подію ще раз do_action( 'my_action'); // нічого не виведе...
Видалення з пріоритетом (пріоритет повинен збігатися):
add_filter( 'my_filter', 'function_name', 99); // так додано remove_filter( 'my_filter', 'function_name', 99); // так треба видаляти
Видалення статичного методу класу:
add_filter( 'my_filter', [ 'My_Class', 'method_name' ], 15 ); // так додано remove_filter( 'my_filter', [ 'My_Class', 'method_name' ], 15 ); // так треба видаляти
Видалення нестатичного методу класу, який доданий за допомогою $this :
class A { function __construct(){ add_action( 'my_action', [ $this, 'method_name' ], 15); } function method_name(){ echo 'Привіт!'; } } $ class = new A; // екземпляр // Для видалення потрібно знайти змінну в яку було збережено // екземпляр класу під час створення, зараз це $class remove_action( 'my_action', [$class, 'method_name'], 15);
Видалення хука доданого анонімною функцією
Видалити хук із замиканням не так просто, наприклад такий код не спрацює:
add_action( 'my_action', function(){ echo 'Привіт!'; } ); remove_action( 'my_action', function(){ echo 'Привіт!'; } ); // не працює!
Надійно видалити хук із використанням замикання, можна тільки якщо замикання створювалося в змінну і ми маємо доступ до цієї змінної:
$my_func = function(){ echo 'Привіт!'; }; add_action( 'my_action', $ my_func ); remove_action( 'my_action', $ my_func ); // Працює!
Ненадійний, але все ж таки спосіб видалити хук із замиканням, коли у нас немає доступу до замикання:
/** * Removes the hook when it has been added by a closure. * Завзятість функції не є гарантованою - перший шлунок * Що збираються priority і число думок arguments will be removed. * * @param string $name * @param int $priority * @param int $accepted_args */ function kama_remove_closure_hook( $name, $priority = 10, $accepted_args = 1 ){ Global $wp_filter; $callbacks = & $wp_filter[ $name ]->callbacks[ $priority ]; // find our hook // it is not always possible to identify it unambiguously // at least we know that it was created with a closure // and we know it's priority foreach( $callbacks as $key => $cb ){ if( ! ( $cb['function'] instanceof Closure ) ) continue; if( $cb['accepted_args'] !== $accepted_args ) continue; // remove unset($callbacks[$key]); // First Suitable only break; } }
Приклад її використання:
add_action( 'my_action', function(){ echo 'Привіт!'; } ); do_action( 'my_action'); // Вітання! kama_remove_closure_hook( 'my_action', 10, 1); do_action( 'my_action'); // (Порожньо)
Видалення події/фільтра для невідомого екземпляра класу
Якщо вам потрібно видалити подію/фільтр для об’єкта класу, до якого ви не маєте доступу, ви можете зробити це за допомогою такої функції:
if(! function_exists('remove_class_filter')): /** * Remove Class Filter Without Access to Class Object * * В order to use the core WordPress remove_filter() on a filter added with the callback * to a class, ви повинні мати доступ до класу об'єкта, або це буде бути call * to a static method. Цей метод дозволить вам скористатися filtrами з callback to a class * Ви не маєте access to. * * Works with WordPress 1.2+ (4.7+ support added 9-19-2016) * Updated 2-27-2017 використовувати internal WordPress removal for 4.7+ (to prevent PHP warnings output) * * @param string $tag Filter to remove * @param string $class_name Class name for the filter's callback * @param string $method_name Method name for filter's callback * @param int $priority Priority of the filter (детальніше 10) * * @return bool Whether the function is removed. */ function remove_class_filter( $tag, $class_name = '', $method_name = '', $ priority = 10 ) { Global $wp_filter; // Check that filtr actually exists first if( ! isset( $wp_filter[ $tag ] ) )){ return false; } /** * Якщо файл config is an object, means we're using WordPress 4.7+ and config is no longer * a simple array, rather it is object that implements the ArrayAccess interface. * * Щоб бути backwards compatible, we set $callbacks equal to the correct array as a reference (so $wp_filter is updated) * * @see https://make.wordpress.org/core/2016/09/08/wp_hook-next-generation-actions-and-filters/ */ if( is_object( $wp_filter[ $tag ] ) && isset( $wp_filter[ $tag ]->callbacks ) ){ // Create $fob object from filter tag, use below $fob = $wp_filter[$tag]; $callbacks = &$wp_filter[ $tag ]->callbacks; } else { $callbacks = &$wp_filter[$tag]; } // Exit if there aren't any callbacks for specified priority if( empty( $callbacks[ $priority ] ) ) ){ return false; } // Loop через кожний filtr для спеціальної priority, висловлюючи для нашого класу & метод foreach( (array) $callbacks[ $priority ] as $filter_id => $filter ){ // Filter should always be an array - array( $this, 'method' ), if not goto next if( ! isset( $filter['function'] ) || ! is_array( $filter['function'] ) ){ continue; } // If first value in array is not an object, it can't be a class if( ! is_object( $filter['function'][0] ) ){ continue; } // Method doesn't match the one we're looking for, goto next if( $filter['function'][1] !== $method_name ){ continue; } // Method matched, now let's check the Class if( get_class( $filter['function'][0] ) === $class_name ){ // WordPress 4.7+ use core remove_filter() since we found the class object if( isset( $fob ) ){ // Handles removing filter, reseting callback priority keys mid-iteration, etc. $fob->remove_filter( $tag, $filter['function'], $priority ); } else { // Use legacy removal process (pre 4.7) unset( $callbacks[ $priority ][ $filter_id ] ); // and if it was the only filter in that priority, unset that priority if( empty( $callbacks[ $priority ] ) ) ){ unset($callbacks[$priority]); } // and if only filter for that tag, set the tag to empty array if( empty( $callbacks ) ){ $callbacks = []; } // Remove this filter from merged_filters, which specifies if filters have been sorted unset( $GLOBALS['merged_filters'][ $tag ] ); } return true; } } return false; } endif;
Обгортка для видалення подій. Попередня функція також обробляє події, але для зрозумілості в коді, зробимо обгортку для неї з більш мовною назвою функції:
if( ! function_exists( 'remove_class_action') ) : /** * Remove Class Action Without Access to Class Object * * В order to use the core WordPress remove_action() on an action added with the callback * to a class, ви повинні мати доступ до класу об'єкта, або це буде бути call * to a static method. Цей метод дозволяє виконати рішення з callback to a class * Ви не маєте access to. * * Works with WordPress 1.2+ (4.7+ support added 9-19-2016) * * @param string $tag Action to remove * @param string $class_name Class name for the action's callback * @param string $method_name Method name for action's callback * @param int $priority Priority of the action (детальніше 10) * * @return bool Whether the function is removed. */ function remove_class_action( $tag, $class_name = '', $method_name = '', $ priority = 10 ) { remove_class_filter($tag, $class_name, $method_name, $priority); } endif;
https://gist.github.com/tripflex/c6518efc1753cf2392559866b4bd1a53
Створення свого хука
При написанні плагіна, до нього можна і потрібно додавати хуки, щоб дати можливість користувачам впроваджуватися в код плагіна, не змінюючи код плагіна. Так, прикріплюючи коллбеки до вашого хуку, користувачі вашого плагіна зможуть змінювати його код з коду іншого плагіна або теми.
Щоб створити подію або фільтр у коді, до якого потім можна буде додавати функції, використовується функція
- do_action() – для подій.
- apply_filters() – для фільтрів.
Синтаксис у цих функцій такий:
do_action( $tag, $arg_a, $arg_b, ...); apply_filters($tag, $value, $arg_a, $arg_b, ...);
-
$tag
(рядок) (обов’язковий) - Назва хука.
-
$value
(рядок/масив/число/об’єкт/логічний) (обов’язковий) - Значення, яке передаватиметься функції у її першому аргументі – значення, яке потрібно відфільтрувати.
-
$arg_a
(рядок/масив/число/об’єкт/логічний) - Значення аргументу.
-
$arg_b
(рядок/масив/число/об’єкт/логічний) - Значення ще одного аргументу.
Приклад створення хука-події
Припустимо, у нас є плагін опитування і при голосуванні добре додати подію цього голосування. Щоб можна було з іншого коду підключитися до нашого плагіна і, припустимо, під час голосування, записати якісь дані користувача до себе базу даних. Такий функціонал може не передбачатися плагіном, але він може стати в нагоді користувачам вашого плагіна і за наявності хука, вони легко його допишуть.
Отже, у нас є функція плагіна add_vote() – записує голос, до кінця цієї функції додамо подію:
function add_vote(){ // код функції // Тут визначається ID опитування - $poll_id і обрана відповідь - $answer // Передамо ці дані в хук. // створюємо хук do_action( 'my_plugin_add_vote', $poll_id, $answer ); }
Тепер розробник теми або іншого плагіна може використовувати цей хук і виконати в момент події потрібні йому дії.
add_action( 'my_plugin_add_vote', 'my_add_vote_logic', 10, 2); function my_add_vote_logic( $poll_id, $answer ){ Global $wpdb; // запишемо до таблиці ліг, замітку що хтось проголосував $wpdb->insert( $wpdb->log_table, [ 'user_id' => 5, 'log_massage' => 'Проголосували за опитування'. $get_poll( $poll_id )->name ]); }
Функції хуків у WordPress
do_action() | Створює подію (можливість запустити php функції у потрібний момент роботи коду). Підключати php функцію до події за допомогою add_action() . |
do_action_ref_array() | Створює подію (хук), на яку потім можна прикріпити PHP функції. Аргументи передаються як масиву. |
do_action_deprecated() | Fires functions attached to a deprecated action hook. |
add_action() | Прикріплює вказану PHP функцію на вказаний хук. Зазначена функція спрацює в момент події, яка запускається за допомогою do_action() . |
remove_action() | Видаляє хук (подія або фільтр). Видаляє функцію, прикріплену до зазначеного хука. |
remove_all_actions() | Removes all of the callback functions від an ction hook. |
did_action() | Отримує число, скільки разів було викликано вказану подію (хук). |
current_action() | Retrieves the name of the current action hook. |
doing_action() | Перевіряє обробляється в даний момент зазначений хук (фільтр, подія). |
has_action() | Перевіряє, чи була зареєстрована функція для хука-події. |
apply_filters() | Застосовує прикріплену до зазначеного фільтра PHP функцію. |
apply_filters_ref_array() | Виконує функції, прикріплені до зазначеного хука (фільтра). Параметри передаються у масиві. Дозволяє передати параметр за посиланням. |
apply_filters_deprecated() | Fires functions attached to a deprecated filter hook. |
add_filter() | Прикріплює вказану PHP функцію до вказаного фільтра. Так, під час спрацьовування фільтра значення буде опрацьовано зазначеною PHP функцією. |
remove_filter() | Видаляє цю функцію, прикріплену до зазначеного фільтра. |
remove_all_filters() | Видаляє всі хуки у зазначеного фільтра. |
current_filter() | Отримує назву поточного фільтра. |
has_filter() | Перевіряє, чи була прикріплена до зазначеного фільтра якась функція. Можна вказати назву конкретної функції. |
doing_filter() | Перевіряє обробляється в даний момент зазначений хук (фільтр, подія). |
Допоміжні функції WordPress для фільтрів
У WordPress є спеціальні функції, які полегшують роботу з фільтрами.
Функція | Опис |
---|---|
__return_true() | Просто повертає true. Допоміжна функція WordPress. |
__return_false() | Просто вертає false. Допоміжна функція WordPress. |
__return_zero() | Просто повертає 0. Допоміжна функція WordPress. |
__return_empty_string() | Просто повертає порожній рядок: ” . Допоміжна функція WordPress. |
__return_empty_array() | Просто повертає порожній масив: array(). Допоміжна функція WordPress. |
__return_null() | Просто повертає null. Допоміжна функція WordPress. |
Наприклад, ми можемо відключити всі стандартні віджети WordPress за допомогою фільтра load_default_widgets
, так:
function is_load_default_widgets(){ return false; } add_filter( 'load_default_widgets', 'is_load_default_widgets' );
Або можна не створювати окрему функцію, яка поверне false , а використовувати вже готову функцію з ядра WordPress: __return_false() :
add_filter( 'load_default_widgets', '__return_false');
Щоб було зрозуміліше як це працює, давайте подивимося на виклик фільтра load_default_widgets
:
function wp_maybe_load_widgets(){ if ( ! apply_filters( 'load_default_widgets', true ) ) return; require_once( ABSPATH . WPINC . '/default-widgets.php' ); add_action( '_admin_menu', 'wp_widgets_add_menu'); }
При виклику wp_maybe_load_widgets() спрацьовує фільтр. За замовчуванням він завжди повертає true і умова не виконується віджет підключаються. А в прикладах вище ми повертаємо false і умова виконується віджети не підключаються.
Це демонстративний приклад із коду WordPress, щоб пояснити принцип роботи. У практиці його краще не використовувати, для відключення віджетів використовуйте код опису функції unregister_widget() .
Аналогічний приклад
Так можна вимкнути можливість публікувати записи по протоколу xmlrpc
. Який, до речі, за замовчуванням включений, але ним мало хто користується.
// відключимо публікацію з xmlrpc add_filter( 'xmlrpc_enabled', '__return_false');
Ще один приклад
Закриємо можливість скидання пароля, за допомогою фільтра allow_password_reset
:
add_filter( 'allow_password_reset', '__return_false');
Тепер усі користувачі не зможуть скидати паролі на сайті.
Список всіх хуків WordPress
Отримати список всіх хуків може знадобитися. У процесі розробки або пошуку помилок.
Як я згадував вище, всі хуки записуються в загальний масив, а точніше в глобальну змінну $wp_filters
. До речі, якщо видалити з $wp_filters елемент масиву (хук), то хук перестане працювати.
Наступний код виведе список усіх хуків (фільтрів та подій), які зареєстровані на момент виклику цього коду:
/** * Виводить на екран список усіх хуків WordPress та функцій до них прикріплених. * * @param рядок $hook_name Назва хука список функцій якого потрібно вивести. * * @version 2.1 */ function hooks_list( $hook_name = '' ){ Global $wp_filter; $wp_hooks = $wp_filter; // для версії 4.4 - переробимо в масив if( is_object( reset( $wp_hooks ) ) ) ){ foreach( $wp_hooks as & $object ) $object = $object->callbacks; unset($object); } if( $hook_name ){ $hooks[ $hook_name ] = @ $wp_hooks[ $hook_name ]; if( ! is_array($hooks[$hook_name]) ){ trigger_error( "Nothing found for '$hook_name' hook", E_USER_WARNING ); return; } } else { $hooks = $wp_hooks; ksort($wp_hooks); } $out = ''; foreach( $hooks as $name => $funcs_data ){ ksort($funcs_data); $out .= "nхукt<b>$name</b>n"; foreach( $funcs_data as $priority => $functions ){ $out. = "$priority"; foreach( array_keys($functions) as $func_name ) $out .= "t$func_namen"; } } echo '<'.'pre>'. $out .'</pre'.'>'; }
Приклад використання:
hooks_list(); /* Отримаємо список такого формату: хук wp_enqueue_scripts 10 lambda_2 99 theme_scripts_styles хук wp_footer 0 0000000072b7ec0d00002b862c2211a0enqueue_jquery_if_need 10 0000000072b7edb400002b862c2211a0footer_scripts 0000000072b7eb7b00002b862c2211a0main_js 20 wp_print_footer_scripts 99 0000000072b7ec0d00002b862c2211a0add_script_to_footer 0000000072b7eb1600002b862c208180 question_close_ajax_js add_question_rating_ajax_js add_comment_rating_ajax_js 999 0000000072b7edb600002b862c2211a0footer_script 1000 wp_admin_bar_render 9999999999 0000000072b7eb0b00002b862c208180 ... і т.д. ... */
А так виглядає елемент масиву в змінній $wp_filter :
Як отримати функції прикріплені до вказаного хука ?
Часто буває потрібно подивитися, які функції прикріплені до окремого фільтра чи події.
Код вище дозволить це зробити, для цього потрібно вказати в ньому параметр $hook_name :
hooks_list('the_title'); /* Отримаємо: хук the_title 10 wptexturize convert_chars trim func_title_add_brackets 11 capital_P_dangit */
Інший варіант – це просто отримати дані масиву
Використовуємо глобальну змінну $wp_filters . У ній зберігаються дані всіх хуків.
Дані в $wp_filters додаються по ходу обробки коду, тому має значення коли використовується змінна $wp_filters : наприклад, якщо її використовувати на початку файлу теми functions.php , то в ній будуть всі функції хуків який були додані до підключення цього файлу, але не буде додано до цього файлу або пізніше.
/** * Виводить список функцій прикріплених до вказаного хука * @param (str) $hook Назва хука, функції якого потрібно вивести. */ function print_filters_for( $hook ){ Global $wp_filter; $data = isset( $wp_filter[$hook] ) ? $wp_filter[$hook] : "Хук `$hook` не знайдено..."; echo '<pre>', print_r( $data, 1 ) .'</pre>'; }
Тепер, щоб вивести список всіх функцій/методів прикріплених до фільтра або події, потрібно викликати цю функцію, і вказати їй назву хука.
Наприклад, отримаємо всі функції додані до події wp_footer . В індексі callbacks ми отримаємо всі функції прикріплені до хука, як пріоритет їхнього виклику.
print_filters_for( 'wp_footer'); /* Виведе: WP_Hook Object ( [callbacks] => Array ( [0] => Array ( [echo_ads_tpls] => Array ( [function] => echo_ads_tpls [accepted_args] => 1 ) ) [20] => Array ( [wp_print_footer_scripts] => Array ( [function] => wp_print_footer_scripts [accepted_args] => 1 ) ) [99] => Array ( [question_close_ajax_js] => Array ( [function] => question_close_ajax_js [accepted_args] => 1 ) [add_question_rating_ajax_js] => Array ( [function] => add_question_rating_ajax_js [accepted_args] => 1 ) ) [1000] => Array ( [wp_admin_bar_render] => Array ( [function] => wp_admin_bar_render [accepted_args] => 1 ) ) ) [iterations:WP_Hook:private] => Array() [current_priority:WP_Hook:private] => Array() [nesting_level:WP_Hook:private] => 0 [doing_action:WP_Hook:private] => ) */
–
Швидкі та дешеві лайки на будь-які пости в Instagram можна придбати на сайті Doctor SMM із гарантією на виконання замовлення. Тільки тут Ви знайдете ресурс на власний смак! На сайті представлений широкий вибір формату лайків: російські, англомовні, автолайки, тв-лайки, мікс та ін. Робіть замовлення зараз та отримуйте вигідні оптові знижки!