В современном WordPress часто возникает задача выполнять фоновые запросы к REST API для обновления данных, синхронизации или запуска периодических процессов без вмешательства пользователя. В этой статье мы подробно рассмотрим, как создать автоматический фоновый запрос в WordPress REST API, используя встроенные возможности WordPress и минимальный объем собственного кода.
Что такое фоновый запрос в WordPress и зачем он нужен
Фоновый запрос — это HTTP-запрос, который выполняется без непосредственного участия пользователя и без блокировки интерфейса сайта. Такие запросы полезны для асинхронного обновления информации, обработки больших объемов данных, автоматизации задач, например, очистки кэша, обновления метаданных или отправки уведомлений.
В WordPress для фоновых задач обычно используют wp-cron — встроенную систему планировщика заданий. Однако иногда нужно запустить запрос к REST API вне зависимости от посещений сайта или обеспечить дополнительную обработку результатов.
Автоматизация фоновых запросов с помощью wp_remote_post и wp_schedule_event
Настройка планировщика событий
Для создания автоматического фонового запроса нам нужно зарегистрировать событие в WordPress с помощью wp_schedule_event. Это позволит запускать функцию по расписанию, например, раз в час.
function wpdeveloper_schedule_background_request() {
if ( ! wp_next_scheduled( 'wpdeveloper_background_request_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpdeveloper_background_request_hook' );
}
}
add_action( 'wp', 'wpdeveloper_schedule_background_request' );Здесь мы проверяем, запланировано ли уже событие, и если нет — создаем его с интервалом в один час.
Обработка фонового запроса
Далее нужно описать функцию, которая будет выполняться по расписанию. В ней мы сделаем POST-запрос к нужному эндпоинту REST API.
function wpdeveloper_handle_background_request() {
$url = site_url('/wp-json/wp/v2/posts'); // пример запроса к REST API
$response = wp_remote_post( $url, array(
'body' => json_encode(array('status' => 'publish')),
'headers' => array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . wpdeveloper_get_api_token(),
),
'timeout' => 15,
) );
if ( is_wp_error( $response ) ) {
error_log( 'WPDeveloper background request error: ' . $response->get_error_message() );
} else {
error_log( 'WPDeveloper background request success: ' . wp_remote_retrieve_body( $response ) );
}
}
add_action( 'wpdeveloper_background_request_hook', 'wpdeveloper_handle_background_request' );Обратите внимание на функцию wpdeveloper_get_api_token() — в реальном проекте её нужно реализовать, чтобы получать токен авторизации для REST API, если требуется.
Обеспечение безопасности и производительности фоновых запросов
Авторизация и проверка прав
Если ваш REST API защищён, обязательно добавьте проверку токена или nonce. Для авторизации в фоновых запросах чаще всего применяют JWT или OAuth. Пример с токеном мы показали выше.
Для повышения безопасности создайте отдельный эндпоинт, который будет доступен только по авторизации и использоваться только для фоновых запросов.
Уменьшение нагрузки на сервер
Фоновые запросы могут создавать дополнительную нагрузку. Чтобы её снизить:
- Настраивайте редкие интервалы запуска (
twicedaily,daily). - Используйте кэширование результатов.
- Обрабатывайте ошибки и повторяйте запросы с экспоненциальной задержкой.
Пример использования WP-Cron и фонового REST API запроса на практике
Допустим, вам нужно каждую ночь обновлять кэш определённых данных, получаемых через REST API внешнего сервиса. В этом случае:
- Создайте кастомное событие с интервалом в сутки.
- В обработчике выполните запрос к API и сохраните результат в transient или опцию.
- В шаблоне выводите эти данные из кэша, чтобы не нагружать сайт запросами.
Вот пример кода для регистрации ежедневного события:
function wpdeveloper_schedule_daily_background_request() {
if ( ! wp_next_scheduled( 'wpdeveloper_daily_background_request_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpdeveloper_daily_background_request_hook' );
}
}
add_action( 'wp', 'wpdeveloper_schedule_daily_background_request' );Обработчик может выглядеть так:
function wpdeveloper_daily_background_request_handler() {
$response = wp_remote_get( 'https://external-api.example.com/data' );
if ( ! is_wp_error( $response ) && wp_remote_retrieve_response_code( $response ) === 200 ) {
$data = wp_remote_retrieve_body( $response );
set_transient( 'wpdeveloper_external_data', $data, DAY_IN_SECONDS );
} else {
error_log( 'Ошибка фонового запроса: ' . $response->get_error_message() );
}
}
add_action( 'wpdeveloper_daily_background_request_hook', 'wpdeveloper_daily_background_request_handler' );Плагины для управления WP-Cron и фоновой работой в WordPress
Если вы хотите упростить работу с фоновой автоматизацией, обратите внимание на плагины:
- WP Crontrol — позволяет управлять и просматривать задачи WP-Cron из админки.
- Action Scheduler — мощная библиотека для планирования и выполнения фоновых задач, используется в WooCommerce.
- Clearfy Pro — помогает оптимизировать работу WP-Cron и отключить лишние фоновые задачи.
Использование этих инструментов позволит вам контролировать и оптимизировать фоновые запросы и задачи.
Выводы и рекомендации по созданию фоновых запросов в WordPress REST API
Фоновые запросы с помощью WP-Cron и wp_remote_post или wp_remote_get — эффективный способ автоматизировать работу сайта, не нагружая пользователя. Главное — грамотно настроить расписание, безопасность и обработку ошибок.
Рекомендуется тестировать фоновые задачи в среде разработки и использовать логи для мониторинга их работы. В случае сложных сценариев стоит рассмотреть использование внешних систем планирования задач с вызовом REST API.
Для расширенной автоматизации можно использовать плагин Clearfy Pro, который помогает оптимизировать WP-Cron и избавиться от лишних фоновых процессов, что положительно скажется на производительности сайта.