Как создать настройки для плагина с AJAX в WordPress

В этой статье мы подробно разберём, как создать собственную страницу настроек для плагина WordPress с использованием AJAX, чтобы обеспечить динамическое сохранение и загрузку данных без перезагрузки страницы. Такой подход значительно улучшает пользовательский опыт и делает управление плагином удобным и современным.

Почему стоит использовать AJAX в настройках плагина WordPress

Традиционно страницы настроек плагинов в WordPress отправляют форму и перезагружают страницу для сохранения изменений. Это неудобно и замедляет работу. AJAX позволяет отправлять данные на сервер в фоне, получать ответ и обновлять интерфейс без перезагрузки. Это делает интерфейс более отзывчивым и понятным.

Кроме того, AJAX поможет вам реалистично отлавливать ошибки и сразу выводить сообщения пользователю, не заставляя его ждать обновления страницы.

В нашем примере мы создадим простой плагин, где пользователь может настроить ключ API и выбрать включение/отключение функции. Все данные будут сохранены через AJAX.

Создание страницы настроек плагина

Для начала создадим меню и страницу настроек WordPress. В файле плагина (например, wpmarket-settings.php) добавьте следующий код:

add_action('admin_menu', 'wpmarket_add_settings_page');
function wpmarket_add_settings_page() {
    add_options_page(
        'Настройки WPMarket',
        'WPMarket',
        'manage_options',
        'wpmarket-settings',
        'wpmarket_render_settings_page'
    );
}

function wpmarket_render_settings_page() {
    ?>
    <div class="wrap">
        <h1>Настройки WPMarket</h1>
        <form id="wpmarket-settings-form">
            <table class="form-table">
                <tr>
                    <th scope="row"><label for="wpmarket_api_key">API ключ</label></th>
                    <td><input name="wpmarket_api_key" type="text" id="wpmarket_api_key" value="" class="regular-text"></td>
                </tr>
                <tr>
                    <th scope="row">Включить функцию</th>
                    <td><input name="wpmarket_feature_enabled" type="checkbox" id="wpmarket_feature_enabled" value="1"></td>
                </tr>
            </table>
            <p class="submit">
                <button type="submit" class="button button-primary">Сохранить настройки</button>
            </p>
        </form>
        <div id="wpmarket-message"></div>
    </div>
    <?php
}

Этот код добавляет страницу настроек с двумя полями и кнопкой сохранения. Но пока что форма не работает.

Обработка сохранения настроек через AJAX

Добавим обработчик AJAX на сервере. Используем WordPress AJAX API и зарегистрируем два действия: для залогиненных и для гостей (если нужно). В нашем случае только для администраторов — залогиненных пользователей.

add_action('wp_ajax_wpmarket_save_settings', 'wpmarket_save_settings_callback');
function wpmarket_save_settings_callback() {
    // Проверяем права
    if (!current_user_can('manage_options')) {
        wp_send_json_error('Нет прав для сохранения настроек');
    }

    // Проверяем nonce
    if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'wpmarket_save_settings_nonce')) {
        wp_send_json_error('Ошибка безопасности');
    }

    // Получаем и санитизируем данные
    $api_key = isset($_POST['api_key']) ? sanitize_text_field($_POST['api_key']) : '';
    $feature_enabled = isset($_POST['feature_enabled']) && $_POST['feature_enabled'] === '1' ? '1' : '0';

    // Сохраняем в options
    update_option('wpmarket_api_key', $api_key);
    update_option('wpmarket_feature_enabled', $feature_enabled);

    wp_send_json_success('Настройки успешно сохранены');
}

Этот обработчик проверяет права пользователя, nonce для безопасности, затем сохраняет полученные данные в таблицу опций WordPress.

Подключение JavaScript для AJAX-запроса

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

add_action('admin_enqueue_scripts', 'wpmarket_admin_scripts');
function wpmarket_admin_scripts($hook) {
    if ($hook !== 'settings_page_wpmarket-settings') {
        return;
    }
    wp_enqueue_script('wpmarket-admin-js', plugin_dir_url(__FILE__) . 'admin.js', ['jquery'], null, true);
    wp_localize_script('wpmarket-admin-js', 'wpmarket_ajax', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('wpmarket_save_settings_nonce'),
    ]);
}

Создайте файл admin.js рядом с плагином и добавьте туда:

jQuery(document).ready(function($) {
    // Загружаем текущие настройки при загрузке страницы
    $.post(wpmarket_ajax.ajax_url, {
        action: 'wpmarket_load_settings',
        nonce: wpmarket_ajax.nonce
    }, function(response) {
        if (response.success) {
            $('#wpmarket_api_key').val(response.data.api_key);
            $('#wpmarket_feature_enabled').prop('checked', response.data.feature_enabled === '1');
        }
    });

    $('#wpmarket-settings-form').on('submit', function(e) {
        e.preventDefault();
        var apiKey = $('#wpmarket_api_key').val();
        var featureEnabled = $('#wpmarket_feature_enabled').is(':checked') ? '1' : '0';

        $.post(wpmarket_ajax.ajax_url, {
            action: 'wpmarket_save_settings',
            api_key: apiKey,
            feature_enabled: featureEnabled,
            nonce: wpmarket_ajax.nonce
        }, function(response) {
            var messageDiv = $('#wpmarket-message');
            if (response.success) {
                messageDiv.html('<div class="notice notice-success is-dismissible"><p>' + response.data + '</p></div>');
            } else {
                messageDiv.html('<div class="notice notice-error is-dismissible"><p>' + response.data + '</p></div>');
            }
        });
    });
});

Этот скрипт при загрузке страницы подгружает текущие значения настроек, а при отправке формы — отправляет данные AJAX-запросом и показывает сообщение об успехе или ошибке.

Загрузка текущих настроек AJAX-запросом

Для загрузки текущих настроек добавим еще один AJAX-обработчик:

add_action('wp_ajax_wpmarket_load_settings', 'wpmarket_load_settings_callback');
function wpmarket_load_settings_callback() {
    if (!current_user_can('manage_options')) {
        wp_send_json_error('Нет прав для загрузки настроек');
    }

    if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'wpmarket_save_settings_nonce')) {
        wp_send_json_error('Ошибка безопасности');
    }

    $api_key = get_option('wpmarket_api_key', '');
    $feature_enabled = get_option('wpmarket_feature_enabled', '0');

    wp_send_json_success([
        'api_key' => $api_key,
        'feature_enabled' => $feature_enabled
    ]);
}

Итог и рекомендации

Мы создали простую, но полнофункциональную страницу настроек плагина WordPress с динамическим сохранением и загрузкой данных через AJAX. Такой подход позволяет сделать интерфейс более отзывчивым и удобным.

Для реальных плагинов рекомендую расширять валидацию данных, использовать Clearfy Pro для оптимизации и безопасности, а также добавлять более сложные элементы интерфейса — например, динамические списки, селекты с поиском и т.п.

Если вам интересны готовые решения для создания интерфейсов и управления настройками, обратите внимание на WPRemark — мощный инструмент для расширенного взаимодействия с пользователем.

Как создать автоматический импорт атрибутов в WooCommerce с помощью кода
04.04.2026
Как установить и настроить WPRemark для автоматизации управления отзывами в WordPress
31.03.2026
Как удалить старые вариации товаров WooCommerce и ускорить базу
02.05.2026
Как автоматически отключать неиспользуемые вариации товаров в WooCommerce
03.06.2026
WooCommerce: как удалить старые вариации товаров и ускорить базу
13.05.2026