admin_post_(action)
Glossary overview

admin_post_(action)

В 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;
}