В ряде проектов на WordPress возникает необходимость автоматически удалять старый контент — устаревшие записи, черновики, или записи из определённых категорий, чтобы не засорять базу данных и улучшить производительность сайта. В этой статье подробно рассмотрим, как реализовать такую автоматизацию с помощью WP-Cron и собственного кода, а также приведём примеры плагинов, которые помогут в решении задачи.
Почему важно удалять старый контент и как это влияет на WordPress
С течением времени база данных WordPress может разрастаться за счёт большого количества устаревших записей, ревизий, автосохранений и мусора. Это замедляет работу сайта, увеличивает размер бэкапов и может влиять на SEO. Автоматическое удаление таких записей помогает поддерживать сайт в чистоте и стабильности.
Однако важно понимать, что удаление контента — операция необратимая, и нужно тщательно продумывать, какие именно записи удалять, чтобы не потерять важные данные.
Что такое WP-Cron и как он помогает
WP-Cron — встроенная система планировщика задач в WordPress. Она запускает запланированные события при посещении сайта, что позволяет выполнять задачи по расписанию, например, очистку базы или отправку email-рассылок.
Используя WP-Cron, мы можем создать функцию, которая будет регулярно запускаться и удалять старые записи по заданным условиям.
Пример кода для автоматического удаления записей старше 30 дней
Рассмотрим практическую реализацию — удаление записей типа post, созданных более 30 дней назад. Добавьте следующий код в файл вашего дочернего шаблона functions.php или в отдельный плагин.
<?php
// Регистрируем событие cron при активации темы/плагина
function wpboot_schedule_old_posts_cleanup() {
if ( ! wp_next_scheduled( 'wpboot_delete_old_posts_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpboot_delete_old_posts_hook' );
}
}
register_activation_hook( __FILE__, 'wpboot_schedule_old_posts_cleanup' );
// Отключаем событие при деактивации
function wpboot_clear_old_posts_cleanup() {
$timestamp = wp_next_scheduled( 'wpboot_delete_old_posts_hook' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wpboot_delete_old_posts_hook' );
}
}
register_deactivation_hook( __FILE__, 'wpboot_clear_old_posts_cleanup' );
// Основная функция удаления старых записей
function wpboot_delete_old_posts() {
global $wpdb;
$days = 30;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID постов старше 30 дней
$old_posts = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'post' AND post_date < %s AND post_status = 'publish'",
$date_threshold
) );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true ); // true - без возможности восстановления
}
}
}
add_action( 'wpboot_delete_old_posts_hook', 'wpboot_delete_old_posts' );
?>
В этом коде мы регистрируем задачу, которая запускается ежедневно и удаляет опубликованные записи старше 30 дней. Обратите внимание, что удаление происходит без помещения в корзину (второй параметр true в wp_delete_post).
Как проверить, что WP-Cron работает корректно
WP-Cron запускается при посещении сайта, но если трафик низкий, задачи могут не срабатывать вовремя. Для теста можно использовать плагин WP Crontrol, который позволяет просмотреть и запускать задачи вручную.
Также можно настроить системный cron (если есть доступ к серверу), чтобы вызывать WP-Cron регулярно, например, через wget или curl:
* * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Удаление записей из конкретной категории или с определённым мета-полем
Если нужно удалить записи не просто по дате, а по категории, добавим дополнительное условие WP_Query.
<?php
function wpboot_delete_old_category_posts() {
$days = 30;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'date_query' => array(
array(
'before' => $date_threshold,
),
),
'category_name' => 'novosti', // замените на вашу категорию
'post_status' => 'publish',
'fields' => 'ids',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post_id ) {
wp_delete_post( $post_id, true );
}
}
wp_reset_postdata();
}
add_action( 'wpboot_delete_old_posts_hook', 'wpboot_delete_old_category_posts' );
?>
Этот код удаляет посты из категории novosti, которым больше 30 дней.
Удаление по мета-значению
Если у записей есть пользовательское мета-поле, например expired со значением 1, можно фильтровать по нему:
<?php
function wpboot_delete_expired_posts() {
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_key' => 'expired',
'meta_value' => '1',
'post_status' => 'publish',
'fields' => 'ids',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post_id ) {
wp_delete_post( $post_id, true );
}
}
wp_reset_postdata();
}
add_action( 'wpboot_delete_old_posts_hook', 'wpboot_delete_expired_posts' );
?>
Какие плагины помогут с удалением старого контента
Если вы не хотите писать код, можно использовать следующие плагины:
- Bulk Delete — мощный инструмент для массового удаления записей по разным условиям, включая дату, категории, теги и мета-поля. Сайт плагина: https://wpshop.ru/bulk-delete
- WP Sweep — очищает мусор из базы данных, в том числе ревизии и автосохранения, но не удаляет посты по дате напрямую.
- Auto Post Scheduler — позволяет автоматически публиковать и удалять посты по расписанию.
При использовании плагинов обращайте внимание на отзывы, обновления и совместимость с вашей версией WordPress.
Советы по безопасности и тестированию
Перед тем, как внедрять автоматическое удаление, сделайте резервную копию базы данных. Тестируйте код на копии сайта, чтобы избежать случайной потери нужных данных.
Также можно добавить в код логирование удалённых записей, например, записывать ID в отдельный лог-файл или таблицу, чтобы иметь возможность проверить, что именно было удалено.
function wpboot_log_deleted_post( $post_id ) {
$log_file = WP_CONTENT_DIR . '/wpboot_deleted_posts.log';
$date = date( 'Y-m-d H:i:s' );
$entry = "{$date} - Deleted post ID: {$post_id}\n";
file_put_contents( $log_file, $entry, FILE_APPEND );
}
// Вызовите эту функцию внутри цикла удаления, например:
// wpboot_log_deleted_post($post_id);
Это поможет отследить работу скрипта и предотвратить ошибки.
Выводы и рекомендации
Автоматическое удаление старых записей в WordPress через WP-Cron — эффективный способ поддерживать сайт в порядке. Используйте приведённые примеры кода, адаптируйте их под свои задачи, обязательно тестируйте изменения на тестовом окружении.
Если не хотите писать код или нужна расширенная функциональность, рассмотрите плагины, например, Bulk Delete.