Как получить все функции с приоритетом ‘1’, прикрепленные к хуку ‘wp_head’

Вопрос или проблема

Как получить (пройтись по и отключить ненужные) все функции с приоритетом '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, который хранит все хуки с их аргументами, включая приоритеты. Рассмотрим шаги, которые необходимо выполнить для достижения этой цели, и представим соответствующий код.

Шаги для получения функций привязанных к хуку

  1. Создание функции: Изначально мы создадим анонимную функцию, которая будет привязана к хуку all. Это даст нам возможность проверять выполнение любого хука, включая wp_head.

  2. Проверка выполнения: Внутри функции проверяем, выполняется ли хук wp_head с помощью функции doing_action.

  3. Доступ к глобальному массиву фильтров: Используем глобальный массив $wp_filter, чтобы получить все функции, назначенные на хук wp_head.

  4. Итерация по приоритетам: Проходим по всем функциям и их приоритетам для того, чтобы выбрать только те, которые имеют приоритет "1".

  5. Сохранение в массив: Сохраним функции в массив для дальнейшего использования.

Пример кода

Вот пример реализации вышеописанных шагов:

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. Это позволит вам не отслеживать изменения вручную при каждом обновлении системы. Данный метод упрощает управление функциями, привязанными к хукам, и улучшает качество кода вашего сайта.

Оцените материал
Добавить комментарий

Капча загружается...