Что такое WP-Cron и зачем он нужен для автоматизации задач
WP-Cron — это встроенный планировщик задач в WordPress, который позволяет запускать произвольные функции по расписанию. Он особенно полезен для автоматизации рутинных задач, например, удаления старого контента, очистки базы данных или отправки отчетов. В отличие от системного cron, WP-Cron запускается при загрузке сайта, что важно учитывать при настройке.
Диагностика: почему нужно автоматически удалять старые записи
Если на сайте накапливается большой объем устаревшего контента, это может негативно влиять на производительность базы данных, SEO и удобство работы с админкой. Ручное удаление неудобно и требует времени. Автоматизация решения позволяет поддерживать чистоту данных и ускорять работу сайта.
Пошаговое решение: как настроить WP-Cron для удаления записей старше 180 дней
1. Создаем функцию для удаления записей
Напишем функцию, которая удалит записи (посты) старше 180 дней. В этом примере удаляются записи типа post со статусом publish:
function wplesson_delete_old_posts() {
global $wpdb;
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID постов, которые старше указанной даты
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_date < %s",
$date_threshold
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — принудительное удаление без корзины
}
}
}2. Регистрируем новое событие WP-Cron
Добавим событие, которое будет запускаться ежедневно. Для этого используем хук wp и проверим, зарегистрировано ли наше событие:
function wplesson_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wplesson_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wplesson_daily_delete_old_posts');
}
}
add_action('wp', 'wplesson_schedule_old_posts_deletion');3. Подключаем функцию удаления к событию
add_action('wplesson_daily_delete_old_posts', 'wplesson_delete_old_posts');Проверка результата после внедрения
- В админке WordPress проверьте наличие удаленных записей старше 180 дней.
- Для отладки временно добавьте логирование в функцию удаления, например, запись ID удаленных постов в файл или в debug.log.
- Проверьте работу WP-Cron: введите
wp cron event listесли используете WP-CLI или используйте плагин WP Crontrol для проверки и запуска событий вручную.
Частые ошибки и как их исправить
- WP-Cron не срабатывает: Если на сайте низкий трафик, WP-Cron может не запускаться вовремя. Решение — настроить системный cron на сервере для вызова
wp-cron.phpрегулярно. - Удаление не происходит: Проверьте права пользователя, под которым работает WordPress, а также корректность SQL-запроса и статуса постов.
- Удаляются нужные записи: Перед удалением уточните условия выборки, чтобы не удалять важный контент. Можно добавить проверку по меткам или категориям.
Практические советы по безопасности и производительности
- Для больших сайтов с тысячами записей удаление большого объема данных за один раз может нагрузить сервер. Рекомендуется делать удаление частями (пакетами по 50-100 записей) с использованием транзиентов или записей в опции для отслеживания прогресса.
- Всегда делайте резервную копию базы данных перед автоматическими удалениями.
- Для отладки используйте включенный WP_DEBUG и логирование.
- Если сайт использует кеширование, после удаления старых записей сбрасывайте кеш.
Сравнение вариантов удаления старых записей
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + код | Автоматизация через встроенный планировщик и кастомный код | Гибкость, без сторонних плагинов, можно адаптировать под любые условия | Зависит от трафика, возможно, задержки с выполнением |
| Плагин «Auto Delete Posts» | Плагин с интерфейсом для удаления по условиям | Простота настройки, не требует кода | Может нагружать базу, не всегда гибок, риск конфликтов с другими плагинами |
| Системный cron + WP-CLI | Запуск команд WP-CLI по расписанию через системный cron | Надежность, точное выполнение без зависимости от трафика | Требуется доступ к серверу и знания командной строки |