Вопрос или проблема
Как получить (пройтись по и отключить ненужные) все функции с приоритетом '1'
, прикрепленные к хуку 'wp_head'
('_wp_render_title_tag'
, 'wp_enqueue_scripts'
, 'noindex'
и т.д.)?
Необходимо сделать это автоматически, чтобы после каждой новой версии WordPress не отслеживать, нет ли чего-то еще с приоритетом '1'
.
Что-то вроде:
$array_priority_1 = [];
if (doing_action('wp_head')) {
// Здесь мы получаем и проходимся по всем функциям, связанным с 'wp_head'
// и сразу проверяем их приоритет '1'?
// подходящие добавляем в массив '$array_priority_1'
//
// ...я не знаю, как их получить и проверить приоритет
}
А здесь мы проходим по нашему готовому массиву:
foreach ($array_priority_1 as ...
Спасибо!
Глобальный $wp_filter
хранит хуки, а также их аргументы, включая приоритет. Поэтому вы можете создать небольшую функцию для их отладки. Следующая функция поможет вывести все функции, их аргументы, если они вызваны на wp_head
. Цикл foreach добавляет приоритет хука через выполнение, делая. Таким образом, вы можете перечислить все функции для хука wp_head
с приоритетом 10 в качестве примера через var_dump($hooked[0][10]);
.
add_action('all', function($hook) {
if (doing_action('wp_head')) {
global $wp_filter;
if ( ! isset( $wp_filter[ $hook ] ) ) {
return;
}
$hooked = (array) $wp_filter[ $hook ];
foreach ( $hooked as $priority => $function ) {
// Предотвратить переполнение буфера PHP_INT_MAX для ключей массива.
// Поэтому сбрасываем ключи массива.
$hooked = array_values( $hooked );
$hooked[] = $function;
}
// Напечатать все функции с приоритетом `1`.
print '<pre>'; print_r($hooked[0][1]); print '</pre>';
}
return $hook;
});
Результат
Для моего тестового примера напечатать все функции с приоритетом 1
Array
(
[_wp_render_title_tag] => Array
(
[function] => _wp_render_title_tag
[accepted_args] => 1
)
[wp_enqueue_scripts] => Array
(
[function] => wp_enqueue_scripts
[accepted_args] => 1
)
[noindex] => Array
(
[function] => noindex
[accepted_args] => 1
)
[wp_post_preview_js] => Array
(
[function] => wp_post_preview_js
[accepted_args] => 1
)
)
Дополнительная подсказка, источник
Также эта функция внутри плагина-отладчика должна помочь вам это понять – https://github.com/bueltge/debug-objects/blob/master/inc/class-page_hooks.php#L90
Ответ или решение
Чтобы получить все функции с приоритетом "1", прикрепленные к хуку "wp_head" в WordPress, мы можем воспользоваться глобальным массивом $wp_filter
, который хранит все хуки с их аргументами, включая приоритеты. Рассмотрим шаги, которые необходимо выполнить для достижения этой цели, и представим соответствующий код.
Шаги для получения функций привязанных к хуку
-
Создание функции: Изначально мы создадим анонимную функцию, которая будет привязана к хуку
all
. Это даст нам возможность проверять выполнение любого хука, включаяwp_head
. -
Проверка выполнения: Внутри функции проверяем, выполняется ли хук
wp_head
с помощью функцииdoing_action
. -
Доступ к глобальному массиву фильтров: Используем глобальный массив
$wp_filter
, чтобы получить все функции, назначенные на хукwp_head
. -
Итерация по приоритетам: Проходим по всем функциям и их приоритетам для того, чтобы выбрать только те, которые имеют приоритет "1".
-
Сохранение в массив: Сохраним функции в массив для дальнейшего использования.
Пример кода
Вот пример реализации вышеописанных шагов:
add_action('all', function($hook) {
if (doing_action('wp_head')) {
global $wp_filter;
if (!isset($wp_filter[$hook])) {
return;
}
$array_priority_1 = []; // Инициализация массива для сохранения функций с приоритетом 1
$hooked = (array)$wp_filter[$hook];
// Проход по всем приоритетам и функциям
foreach ($hooked as $priority => $functions) {
if ($priority == 1) { // Проверка на приоритет 1
foreach ($functions as $function) {
// Сохраняем функцию в массиве
$array_priority_1[] = $function['function'];
}
}
}
// Здесь можно использовать массив $array_priority_1
// Например, выводим все функции с приоритетом 1
echo '<pre>'; print_r($array_priority_1); echo '</pre>';
}
return $hook;
});
// В этом месте, например, можем просмотреть массив функций с приоритетом 1
Результат выполнения
Запустив вышеуказанный код в вашей теме или плагине WordPress, вы получите массив всех функций, которые имеют приоритет "1" и привязаны к хуку wp_head
. Пример вывода будет выглядеть следующим образом:
Array
(
[_wp_render_title_tag]
[wp_enqueue_scripts]
[noindex]
[wp_post_preview_js]
)
Заключение
Код, приведенный выше, помогает автоматически собирать функции с определенным приоритетом, что актуально при обновлениях WordPress. Это позволит вам не отслеживать изменения вручную при каждом обновлении системы. Данный метод упрощает управление функциями, привязанными к хукам, и улучшает качество кода вашего сайта.