Хуки в 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

Для роботи фільтра використовуються дві функції:

  1. add_filter( hook_name, function, priority, args_num ) — додає/прикріплює функцію до фільтра, яка буде викликана в момент спрацювання фільтра. Така функція називається «коллбек-функція».

  2. 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

Для роботи події використовуються дві функції:

  1. add_action( hook_name, function, priority, args_num ) — додає/прикріплює функції до події, що викликається за допомогою do_action() . Функція повинна прикріплюватися до події, перш ніж подія відбудеться. Потрібно, щоб під час спрацювання події PHP функції вже були прикріплені до події.

  2. 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функції виконуватимуться в наступному порядку:

  1. run_me_early()
  2. run_me_normal()
  3. run_me_normal_two()
  4. 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() .

Для видалення хука потрібно знати:

  1. Назва хука , наприклад wp_footer;
  2. Назва прикріпленої функції наприклад my_action_functionз прикладу вище;
  3. Пріоритет виконання хука , якщо він був встановлений під час створення хука. Якщо при створенні пріоритет не було встановлено, він дорівнює 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( $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 :

Global $wp_filter;

print_r($wp_filter);

/*
	[wp_title] => WP_Hook Object
		(
			[callbacks] => Array
				(
					[10] => Array
						(
							[wptexturize] => Array
								(
									[function] => wptexturize
									[accepted_args] => 1
								)

							[convert_chars] => Array
								(
									[function] => convert_chars
									[accepted_args] => 1
								)

							[esc_html] => Array
								(
									[function] => esc_html
									[accepted_args] => 1
								)

						)

					[11] => Array
						(
							[capital_P_dangit] => Array
								(
									[function] => capital_P_dangit
									[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] =>
		)

	[widget_title] => WP_Hook Object
		(
		............... і т.д.
*/


Як отримати функції прикріплені до вказаного хука ?

Часто буває потрібно подивитися, які функції прикріплені до окремого фільтра чи події.

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

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *