Вопрос или проблема
Есть ли способ сделать асинхронный запрос к 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 для обеспечения безопасности и стабильности вашего приложения. Путем правильной реализации вы не только защитите свой сайт, но и улучшите опыт пользователей, делая взаимодействие с вашим контентом более эффективным.