В WordPress хук admin_post_(action) используется для обработки кастомных действий (action) из форм, отправленных в админку или даже с фронтенда, если пользователь авторизован. Это мощный способ создать свои обработчики форм, аналогично AJAX, но проще по структуре.
Как работает admin_post_(action)
WordPress перехватывает формы, отправленные на /wp-admin/admin-post.php, и ищет значение action в $_POST или $_GET.
Он запускает хук вида:
do_action( 'admin_post_' . $_REQUEST['action'] );
Если пользователь авторизован.
Если пользователь не авторизован, запускается:
do_action( 'admin_post_nopriv_' . $_REQUEST['action'] );
✅ Пример: отправка формы и обработка
1. Форма HTML:
<form action="<?php echo admin_url('admin-post.php'); ?>" method="post">
<input type="hidden" name="action" value="my_custom_action">
<input type="text" name="my_field" value="">
<input type="submit" value="Отправить">
</form>
2. Обработчик:
add_action('admin_post_my_custom_action', 'handle_my_custom_action');
add_action('admin_post_nopriv_my_custom_action', 'handle_my_custom_action'); // если надо и для неавторизованных
function handle_my_custom_action() {
$value = $_POST['my_field'] ?? '';
// тут можно делать всё — валидацию, запись в БД, отправку почты и т.д.
// редирект после обработки
wp_redirect(home_url('/спасибо/'));
exit;
}
📌 Что важно:
actionдолжен быть уникальным ключом, по которому вы обрабатываете логику.- Пользуйтесь
check_admin_referer()иcurrent_user_can()для безопасности. - Обязательно делайте
exit;послеwp_redirect().
Хотя admin_post_(action) чаще всего применяют для обработки форм, на самом деле этот механизм можно использовать в любом случае, когда нужно выполнить какое-то действие на стороне сервера в WordPress — особенно если ты хочешь:
- обновить настройки, обработать файл, выполнить импорт/экспорт, изменить статус поста и т.д.
- использовать GET-запросы с подтверждением действия (например, по ссылке).
- запустить тяжелую задачу с интерфейсом “в админке” или без него.
🧾 1. Экспорт данных (CSV, JSON)
add_action('admin_post_export_users', 'handle_user_export');
function handle_user_export() {
if (!current_user_can('manage_options')) {
wp_die('Доступ запрещён');
}
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="users.csv"');
$users = get_users();
echo "ID,Username,Email\n";
foreach ($users as $user) {
echo "{$user->ID},{$user->user_login},{$user->user_email}\n";
}
exit;
}
И, например, кнопка:
<a href="<?php echo admin_url('admin-post.php?action=export_users'); ?>">Скачать CSV</a>
2. 🖼️ Импорт файла через форму
<form action="<?php echo admin_url('admin-post.php'); ?>" method="post" enctype="multipart/form-data">
<input type="hidden" name="action" value="import_file">
<input type="file" name="my_file">
<input type="submit" value="Импортировать">
</form>
add_action('admin_post_import_file', 'handle_file_import');
function handle_file_import() {
if (!current_user_can('upload_files')) {
wp_die('Нет прав');
}
if (!empty($_FILES['my_file']['tmp_name'])) {
$content = file_get_contents($_FILES['my_file']['tmp_name']);
// обрабатываем файл
}
wp_redirect(admin_url('tools.php?page=import-result'));
exit;
}