Функции обратного вызова: создание и управление событиями в WordPress

Раздел: CMS -> WordPress

Основные принципы работы с действиями в WordPress

Действия (actions) в WordPress представляют собой механизм хуков, позволяющий выполнять пользовательские функции в определённые моменты выполнения кода. Основная цель - расширение функциональности без изменения исходных файлов. Для добавления обработчика используется функция add_action(), а для инициирования собственных событий - do_action().

Как правильно добавить скрипт в подвал сайта с помощью действия?

add_action('wp_footer', 'my_custom_footer_script');
function my_custom_footer_script() {
    ?>
    <script>
        console.log('Footer loaded');
    </script>
    <?php
}

Wp php (разработка под wordpress на php)

Этот код помещается в файл functions.php темы. Хук wp_footer срабатывает перед закрывающим тегом </body>. Функция выводит JavaScript напрямую. Обратите внимание: для вставки сложных скриптов лучше использовать wp_enqueue_script().

Типичная ошибка - вызов wp_footer без предварительной регистрации функции. Если скрипт не появляется, проверьте, не переопределён ли хук другим плагином. Также убедитесь, что функция не содержит синтаксических ошибок. Для отладки используйте error_log().

Как добавить код в секцию <head>?

add_action('wp_head', 'custom_head_meta');
function custom_head_meta() {
    echo '<meta name="author" content="Ваше имя">';
}

Wp admin php (администрирование wordpress)

Хук wp_head выполняется внутри <head>. Используется для мета-тегов, дополнительных стилей или скриптов, которые должны загружаться раньше остальных. Важно: избегайте вывода больших объёмов данных, чтобы не замедлять загрузку.

Проблема: если несколько плагинов используют один и тот же хук, содержимое может дублироваться. Решение - проверять, не существует ли уже нужный мета-тег, или использовать условные проверки (is_front_page() и т.д.).

Как использовать анонимную функцию в add_action?

add_action('init', function() {
    register_post_type('book', [
        'public' => true,
        'label'  => 'Книги'
    ]);
});

Php action function (функция действия (action) в php (wordpress))

Анонимные функции удобны для коротких действий, но их нельзя отключить с помощью remove_action(). Если требуется удаление, следует назначать именованную функцию.

Ошибка: попытка удалить анонимную функцию приводит к непредсказуемому поведению. Лучше избегать анонимных функций, если планируется дальнейшее управление хуками.

Как удалить ранее добавленное действие?

remove_action('wp_footer', 'my_custom_footer_script');

Localhost wp admin php (администрирование wordpress на localhost)

Удаление выполняется с тем же приоритетом, который был указан при добавлении. По умолчанию приоритет 10. Если функция была добавлена с приоритетом, его нужно указать повторно.

Типичная ошибка - попытка удалить действие до его добавления (например, если код удаления расположен раньше add_action в порядке выполнения). Нужно убедиться, что remove_action вызывается после регистрации обработчика.

Как создать собственное действие для других разработчиков?

do_action('my_plugin_before_save', $post_id, $post_data);

В месте, где происходит сохранение данных, разработчик вызывает do_action, передавая необходимые параметры. Пользователи могут подключаться к этому событию через add_action.

Распространённая проблема - неправильное количество аргументов. Количество аргументов в do_action должно соответствовать третьему параметру add_action (по умолчанию 1). Если нужно передать больше, явно укажите число.

Расширенные примеры работы с действиями

Пример 1: Добавление класса к тегу <body> в зависимости от роли пользователя

Пример
add_action('body_class', 'add_user_role_body_class');
function add_user_role_body_class($classes) {
    if (is_user_logged_in()) {
        $user = wp_get_current_user();
        $roles = $user->roles;
        foreach ($roles as $role) {
            $classes[] = 'user-role-' . $role;
        }
    }
    return $classes;
}

Результат: при входе администратора в HTML-атрибут class тега <body> добавится строка user-role-administrator.

<body class="... user-role-administrator">

Пример 2: Вывод уведомления в админ-панели после обновления записи

Пример
add_action('post_updated', 'show_admin_notice_on_post_update', 10, 3);
function show_admin_notice_on_post_update($post_id, $post_after, $post_before) {
    // Убедимся, что это не автосохранение
    if (wp_is_post_autosave($post_id)) return;
    // Добавляем временное сообщение
    set_transient('post_updated_notice', 'Запись успешно обновлена', 30);
}

add_action('admin_notices', 'display_post_update_notice');
function display_post_update_notice() {
    $notice = get_transient('post_updated_notice');
    if ($notice) {
        echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($notice) . '</p></div>';
        delete_transient('post_updated_notice');
    }
}

Результат: после сохранения записи в админ-панели появляется зелёное уведомление.

Пример 3: Кастомное действие для логирования действий пользователя

Пример
// Определяем событие
add_action('user_login', 'log_user_login', 10, 2);
function log_user_login($user_login, $user) {
    $log_message = date('Y-m-d H:i:s') . ' - ' . $user_login . ' вошёл в систему.';
    error_log($log_message, 3, WP_CONTENT_DIR . '/user-logins.log');
}

Функция log_user_login записывает в файл user-logins.log строку с временем и именем пользователя. Файл будет создан автоматически, если существует папка wp-content.

Пример 4: Изменение заголовка страницы в зависимости от времени суток

Пример
add_action('wp_head', function() {
    $hour = current_time('H');
    if ($hour < 12) {
        $greeting = 'Доброе утро';
    } elseif ($hour < 18) {
        $greeting = 'Добрый день';
    } else {
        $greeting = 'Добрый вечер';
    }
    echo '<meta name="greeting" content="' . esc_attr($greeting) . '">';
});

После выполнения в секции <head> появится мета-тег с приветствием. Это может быть использовано для динамического изменения контента через JavaScript.

Функция действия (action) в PHP (WordPress) - comments

En
Php action function (php)