Ведение сайта на WordPress часто сопровождается накоплением большого объема устаревшего контента: старых записей, ревизий, черновиков и мусорных комментариев. Такой контент не только занимает место в базе данных, но и может замедлять работу сайта. В этой статье подробно разберем, как автоматически удалять старый контент с помощью встроенного планировщика задач WP-Cron, а также приведем примеры кода и рекомендации по настройке.
Что такое WP-Cron и почему он важен для автоматизации задач
WP-Cron — это имитация системного cron в WordPress, который позволяет запускать задачи в определенное время или с определенной периодичностью без необходимости в серверных cron-заданиях. Это мощный инструмент для автоматизации рутинных задач, таких как очистка базы данных, отправка уведомлений и многое другое.
Преимущества использования WP-Cron для удаления старого контента:
- Автоматизация без ручного вмешательства
- Гибкость настроек расписания
- Минимальное влияние на производительность, если настроено грамотно
Однако стоит помнить, что WP-Cron запускается при заходе посетителей на сайт, поэтому на сайтах с низкой посещаемостью задачи могут выполняться с задержкой.
Как настроить автоматическое удаление старых записей
Первым шагом создадим функцию, которая будет удалять записи, старше определенного срока. Например, удалим все записи старше 180 дней.
Пример функции удаления старых записей
function wpskill_delete_old_posts() {
global $wpdb;
$days = 180; // количество дней для хранения записей
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_date < %s AND post_status = 'publish' AND post_type = 'post'",
$date
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удаление без корзины
}
}
}Эта функция через прямой запрос к базе данных находит все опубликованные записи старше 180 дней и удаляет их без помещения в корзину.
Регистрация задачи в WP-Cron
Теперь нужно зарегистрировать задачу, которая будет запускать эту функцию по расписанию. Для этого добавим событие и хук:
function wpskill_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpskill_delete_old_posts_event')) {
wp_schedule_event(time(), 'daily', 'wpskill_delete_old_posts_event');
}
}
add_action('wp', 'wpskill_schedule_old_posts_deletion');
add_action('wpskill_delete_old_posts_event', 'wpskill_delete_old_posts');Здесь мы проверяем, запланировано ли уже событие, если нет — создаем его с интервалом 'daily' (один раз в сутки). При срабатывании события вызывается функция удаления.
Удаление старых ревизий и черновиков для оптимизации базы данных
Помимо старых записей, на сайте могут накапливаться ревизии и черновики, которые тоже стоит периодически чистить.
Функция для удаления ревизий старше 30 дней
function wpskill_delete_old_revisions() {
global $wpdb;
$days = 30;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_type = 'revision' AND post_date < %s",
$date
));
if (!empty($old_revisions)) {
foreach ($old_revisions as $revision_id) {
wp_delete_post($revision_id, true);
}
}
}Функция для удаления черновиков старше 60 дней
function wpskill_delete_old_drafts() {
global $wpdb;
$days = 60;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_drafts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_status = 'draft' AND post_date < %s",
$date
));
if (!empty($old_drafts)) {
foreach ($old_drafts as $draft_id) {
wp_delete_post($draft_id, true);
}
}
}Добавим их в расписание WP-Cron вместе с удалением старых записей:
add_action('wpskill_delete_old_revisions_event', 'wpskill_delete_old_revisions');
add_action('wpskill_delete_old_drafts_event', 'wpskill_delete_old_drafts');
function wpskill_schedule_cleanup_events() {
if (!wp_next_scheduled('wpskill_delete_old_revisions_event')) {
wp_schedule_event(time(), 'weekly', 'wpskill_delete_old_revisions_event');
}
if (!wp_next_scheduled('wpskill_delete_old_drafts_event')) {
wp_schedule_event(time(), 'weekly', 'wpskill_delete_old_drafts_event');
}
}
add_action('wp', 'wpskill_schedule_cleanup_events');Удаление старых комментариев и оптимизация базы данных
Старые спам-комментарии и неактивные отзывы тоже могут замедлять сайт. Рассмотрим, как их удалять автоматически.
Удаление спам-комментариев старше 30 дней
function wpskill_delete_old_spam_comments() {
global $wpdb;
$days = 30;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_spam_comments = $wpdb->get_col($wpdb->prepare(
"SELECT comment_ID FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_date < %s",
$date
));
if (!empty($old_spam_comments)) {
foreach ($old_spam_comments as $comment_id) {
wp_delete_comment($comment_id, true);
}
}
}
add_action('wpskill_delete_old_spam_comments_event', 'wpskill_delete_old_spam_comments');
function wpskill_schedule_spam_comments_cleanup() {
if (!wp_next_scheduled('wpskill_delete_old_spam_comments_event')) {
wp_schedule_event(time(), 'weekly', 'wpskill_delete_old_spam_comments_event');
}
}
add_action('wp', 'wpskill_schedule_spam_comments_cleanup');Полезные плагины для автоматизации очистки и оптимизации
Если не хочется писать код, можно использовать плагины, которые помогут автоматизировать удаление старого контента и оптимизацию базы данных.
- Clearfy Pro — расширенный набор инструментов для оптимизации WordPress, включая очистку базы данных от мусора, ревизий, черновиков и спама. Настраивается через удобный интерфейс, подходит для регулярной автоматической очистки.
- WP-Optimize — популярный плагин для очистки и оптимизации базы данных, удаления старых ревизий, спам-комментариев и автоматического кеширования.
- Advanced Database Cleaner — позволяет планировать удаление старых записей, ревизий, черновиков, а также оптимизировать таблицы базы данных.
Все эти плагины можно найти и скачать на WPSHOP.RU.
Рекомендации по безопасности и производительности
При автоматическом удалении контента важно соблюдать баланс между частотой очистки и нагрузкой на сервер. Рекомендуется:
- Планировать задачи на периоды низкой посещаемости.
- Тестировать функции на копии сайта перед внедрением на рабочем ресурсе.
- Использовать проверенные плагины с возможностью настройки.
- Создавать резервные копии базы данных перед автоматическими операциями.
Также можно добавить логирование удаляемых элементов для контроля и отладки.
Пример логирования удаленных постов
function wpskill_delete_old_posts() {
global $wpdb;
$days = 180;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_posts = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM $wpdb->posts WHERE post_date < %s AND post_status = 'publish' AND post_type = 'post'",
$date
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
error_log("[WPSkill] Удалена старая запись ID: " . $post_id);
}
}
}