Функции обратного вызова: создание и управление событиями в 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.