Как сделать асинхронный запрос в WordPress?

Вопрос или проблема

Есть ли способ сделать асинхронный запрос к WordPress, где я могу использовать функции WordPress?

Например:

Я создаю в своем плагине файл add_post.php, который содержит:

if($_POST['new_post'] == true) 
    wp_insert_post( $_POST['post_data'] );

и с помощью ajax я отправляю запрос для выполнения вышеприведенного кода.
Где wp_insert_post() – это функция WordPress, определенная в wp-includes/post.php.

Есть ли способ сделать асинхронный запрос к WordPress, где я могу использовать функции WordPress?

Да, но это:

  • супер хрупко и легко сломать
  • это большая проблема безопасности

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

Вместо этого, избавьте себя от проблем и используйте конечную точку REST API, или официальный AJAX API, например:

// добавьте конечную точку
add_action( 'rest_api_init', function () {
        register_rest_route( 'salk/v1', '/test/', array(
                'methods' => 'POST',
                'callback' => 'salk_rest_test'
        ) );
} );

function salk_rest_test( $request ) {
    // делайте здесь вещи
    // доступ к данным POST, например, так $request['post_data']
    // все, что вы вернете, будет закодировано в json и отправлено обратно в браузер
}

Поместите это в файл функций плагина или темы, а затем обновите постоянные ссылки/сохраните их, используйте jQuery.post с URL example.com/wp-json/salk/v1/test/

Тем лучше, WordPress уже предоставляет JS конечную точку по адресу /wp-json/wp/v2/posts, которую вы можете использовать для создания постов с фронтенда, если вы вошли в систему с помощью POST запросов

Ответ или решение

Как выполнить асинхронный запрос в WordPress с использованием встроенных функций

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

Опасности прямого использования PHP

Перед тем, как погрузиться в детали, важно отметить, что прямое использование PHP-файлов для обработки асинхронных запросов несет в себе серьезные риски. Если рассматривать подход с использованием файла add_post.php, где вы хотите вызвать wp_insert_post(), вы рискуете:

  • Создать уязвимости, которые могут быть использованы злоумышленниками для выполнения произвольного кода.
  • Затруднить отладку кода, так как неявная навигация между файлами может привести к ошибкам.

Рекомендуемый подход – REST API и AJAX

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

1. Использование REST API
Шаг 1: Регистрация REST эндпоинта

Прежде всего, необходимо зарегистрировать новый эндпоинт REST API в вашем плагине или файле функций темы:

add_action('rest_api_init', function () {
    register_rest_route('example/v1', '/add-post/', array(
        'methods' => 'POST',
        'callback' => 'example_add_post'
    ));
});
Шаг 2: Обработка запроса

Далее вам нужно создать функцию, которая будет обрабатывать входящие запросы и будет использовать функцию wp_insert_post():

function example_add_post($request) {
    // Получение данных из запроса
    $post_data = $request->get_json_params();

    // Вставка поста
    $post_id = wp_insert_post($post_data);

    // Проверка на успешное создание поста
    if (is_wp_error($post_id)) {
        return new WP_Error('error_insert_post', 'Ошибка при добавлении поста', array('status' => 500));
    }

    return array('id' => $post_id);
}
2. Отправка запроса через jQuery

Теперь, когда ваш эндпоинт зарегистрирован, вы можете отправлять асинхронные запросы с помощью jQuery:

jQuery(document).ready(function ($) {
    $('#submit-button').on('click', function () {
        const postData = {
            title: 'Заголовок',
            content: 'Содержание поста',
            status: 'publish'
        };

        $.post('/wp-json/example/v1/add-post/', JSON.stringify(postData))
        .done(function (response) {
            console.log('Пост добавлен с ID:', response.id);
        })
        .fail(function (error) {
            console.error('Ошибка при добавлении поста:', error);
        });
    });
});

Преимущества использования REST API

  • Безопасность: Благодаря встроенным механизмам проверки прав, такие как current_user_can(), вы можете контролировать, кто может выполнять запросы.
  • Чистота кода: Отделяя логику обработки запросов от фронтенда, вы улучшаете читаемость и поддерживаемость вашего кода.
  • Гибкость: Возможность легко расширять REST API и интегрироваться с другими системами через стандартные HTTP-запросы.

Заключение

При создании асинхронных запросов в WordPress используйте REST API или AJAX для обеспечения безопасности и стабильности вашего приложения. Путем правильной реализации вы не только защитите свой сайт, но и улучшите опыт пользователей, делая взаимодействие с вашим контентом более эффективным.

Оцените материал
Добавить комментарий

Капча загружается...