Хуки в 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 із гарантією на виконання замовлення. Тільки тут Ви знайдете ресурс на власний смак! На сайті представлений широкий вибір формату лайків: російські, англомовні, автолайки, тв-лайки, мікс та ін. Робіть замовлення зараз та отримуйте вигідні оптові знижки!