В современных проектах на WordPress часто возникает задача выполнять периодические расчёты, обновлять данные или создавать отчёты автоматически. В этой статье мы подробно разберём, как настроить автоматизацию расчётов в WordPress с помощью системного CRON и PHP-кода, интегрированного в платформу. Рассмотрим как использовать встроенный WP-Cron, а также как настроить системный CRON для более надёжной работы. Приведём примеры кода и рекомендации по оптимизации.
Что такое CRON и зачем он нужен в WordPress
CRON — это планировщик задач в Unix-системах, который позволяет запускать скрипты и команды по расписанию. WordPress имеет собственный механизм WP-Cron, который эмулирует системный CRON, выполняя задачи при загрузке сайта. Однако WP-Cron зависит от посещений сайта и может не сработать вовремя на малопосещаемых ресурсах.
Для критичных расчётов и обновлений лучше использовать системный CRON, который запускает PHP-скрипт по расписанию независимо от активности пользователей. Это повышает надёжность и точность автоматизации.
Разница между WP-Cron и системным CRON
- WP-Cron: запускается при загрузке страниц, зависим от трафика;
- Системный CRON: запускается по расписанию из операционной системы, более точный;
- Для тяжёлых и регулярных задач системный CRON предпочтительнее.
Как создать задачу автоматического расчёта с помощью WP-Cron
Для начала создадим простую задачу, которая будет выполнять расчёт и сохранять результат в базу данных.
Регистрация задачи и хука
function wpcalc_schedule_events() {
if ( ! wp_next_scheduled( 'wpcalc_cron_calculate_event' ) ) {
wp_schedule_event( time(), 'hourly', 'wpcalc_cron_calculate_event' );
}
}
add_action( 'wp', 'wpcalc_schedule_events' );
add_action( 'wpcalc_cron_calculate_event', 'wpcalc_perform_calculation' );
function wpcalc_perform_calculation() {
// Пример расчёта: сумма значений из пользовательской мета
$users = get_users();
$total = 0;
foreach ( $users as $user ) {
$value = (int) get_user_meta( $user->ID, 'wpcalc_value', true );
$total += $value;
}
update_option( 'wpcalc_total_value', $total );
}
Этот код регистрирует событие, которое срабатывает каждый час и запускает функцию wpcalc_perform_calculation. В функции происходит пример расчёта — суммирование пользовательских мета-значений и сохранение результата в опцию.
Проверка и удаление задачи
Чтобы убедиться, что задача работает, можно проверить наличие события через плагин WP Crontrol. Для удаления задачи используйте:
wp_clear_scheduled_hook( 'wpcalc_cron_calculate_event' );Настройка системного CRON для WordPress-заданий
WP-Cron не всегда надёжен, особенно при низком трафике. Чтобы повысить стабильность, рекомендуют отключить WP-Cron и настроить системный CRON.
Отключение WP-Cron
В wp-config.php добавьте строку:
define('DISABLE_WP_CRON', true);Создание системного CRON-задания
Допустим, WordPress установлен в /var/www/wpcalc, тогда добавьте в системный CRON строку (отредактируйте через crontab -e):
*/15 * * * * wget -q -O - https://wpcalc.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1<Это будет запускать WP-Cron каждые 15 минут. Можно настроить и вызов PHP напрямую:
*/15 * * * * php /var/www/wpcalc/wp-cron.php >/dev/null 2>&1Пример: автоматический расчёт стоимости подписки с WP-Cron
Рассмотрим более полный пример, где выполняется пересчёт стоимости подписок пользователей с учётом скидок и обновление результата в базе.
add_action( 'wpcalc_cron_subscription_update', 'wpcalc_update_subscription_prices' );
function wpcalc_update_subscription_prices() {
$users = get_users( array('role' => 'subscriber') );
foreach ( $users as $user ) {
$base_price = (float) get_user_meta( $user->ID, 'wpcalc_base_price', true );
$discount = (float) get_user_meta( $user->ID, 'wpcalc_discount', true );
$final_price = max(0, $base_price - $discount);
update_user_meta( $user->ID, 'wpcalc_final_price', $final_price );
}
}
function wpcalc_schedule_subscription_update() {
if ( ! wp_next_scheduled( 'wpcalc_cron_subscription_update' ) ) {
wp_schedule_event( time(), 'daily', 'wpcalc_cron_subscription_update' );
}
}
add_action( 'wp', 'wpcalc_schedule_subscription_update' );
Задача запускается раз в день и обновляет цены для всех подписчиков с учётом скидок.
Использование плагина для управления CRON в WordPress
Для управления задачами WP-Cron и отладки удобно использовать плагин WP Crontrol. Он позволяет просматривать, создавать и удалять события прямо из админки.
Если вы хотите расширенные возможности по автоматизации, обратите внимание на плагин Clearfy Pro, который оптимизирует работу CRON и предлагает дополнительные инструменты контроля.
Рекомендации по оптимизации и безопасности автоматических расчётов
При настройке автоматических расчётов обратите внимание на следующие моменты:
- Минимизируйте нагрузку: выполняйте тяжёлые операции по частям или с использованием транзиентов;
- Логирование: записывайте результаты и ошибки в отдельный лог для отладки;
- Безопасность: при вызове PHP-скриптов из CRON используйте проверку nonce или секретных ключей, чтобы предотвращать несанкционированный запуск;
- Тестирование: запускайте задачи вручную и убеждайтесь в корректности работы перед автоматизацией.
Например, для проверки секретного ключа в запросе WP-Cron:
add_action( 'wpcalc_cron_calculate_event', 'wpcalc_secure_perform_calculation' );
function wpcalc_secure_perform_calculation() {
$secret = isset($_GET['secret']) ? sanitize_text_field($_GET['secret']) : '';
if ( $secret !== 'your_secret_key_here' ) {
return; // Неавторизованный вызов
}
// Логика расчёта
}
Заключение
Автоматизация расчётов в WordPress с помощью CRON и PHP — мощный инструмент для поддержки актуальных данных и экономии времени. Используйте WP-Cron для простых задач и системный CRON для стабильности и точности. Не забывайте о безопасности и оптимизации, применяйте проверенные подходы и инструменты, такие как плагин WP Crontrol и Clearfy Pro.