Автоматическое удаление устаревшего или неактуального контента на сайте WordPress — частая задача для администраторов и разработчиков. Регулярное удаление таких записей помогает поддерживать базу данных в порядке, улучшает производительность сайта и освобождает место на сервере. В этой статье подробно разберём, как настроить автоматическую очистку старого контента с помощью WP-Cron и кастомного кода.
Что такое WP-Cron и почему он важен для автоматизации задач
WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет запускать определённые функции по расписанию без необходимости настраивать системный cron на сервере. В отличие от классического cron, WP-Cron запускается при посещении сайта, что удобно для большинства хостингов.
С помощью WP-Cron можно автоматизировать самые разные процессы — от отправки уведомлений до очистки базы данных. В нашем случае мы используем WP-Cron для регулярного удаления постов, которые старше определённого срока.
Важно понимать, что WP-Cron работает только при активности пользователей на сайте. Если сайт малопосещаемый, стоит рассмотреть альтернативы, например, системный cron с вызовом wp-cron.php.
Определяем критерии для удаления старого контента
Перед реализацией автоматического удаления нужно чётко определить, какой контент считать «старым» и подлежащим удалению. Чаще всего это записи определённого типа, например, посты блога, которые не обновлялись или были опубликованы более 6 месяцев назад.
Можно также учитывать статус записи — удалять только черновики, или наоборот, только опубликованные записи. В некоторых случаях имеет смысл сохранять определённые записи, например, закреплённые или с определённой категорией.
Пример критериев:
- Тип записи: post
- Дата публикации: старше 180 дней
- Статус: опубликовано
Создание функции для удаления старого контента в WordPress
Пишем кастомную функцию, которая будет искать и удалять записи по заданным критериям. Вот пример кода:
function wpteam_delete_old_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '180 days ago',
),
),
'fields' => 'ids',
'posts_per_page' => -1
);
$old_posts = get_posts( $args );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true ); // true для полного удаления
}
}
}
В этом коде мы получаем ID всех опубликованных постов старше 180 дней и полностью удаляем их из базы данных.
Регистрация задачи в WP-Cron для регулярного запуска
Чтобы функция wpteam_delete_old_posts запускалась автоматически, нужно добавить задачу в WP-Cron. Сделаем это с помощью хуков:
function wpteam_register_cron_event() {
if ( ! wp_next_scheduled( 'wpteam_daily_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpteam_daily_cleanup' );
}
}
add_action( 'wp', 'wpteam_register_cron_event' );
add_action( 'wpteam_daily_cleanup', 'wpteam_delete_old_posts' );
Здесь мы регистрируем ежедневное событие с именем wpteam_daily_cleanup, которое вызывает нашу функцию удаления.
Можно изменить интервал запуска, например, на еженедельный, создав собственный интервал через фильтр cron_schedules:
function wpteam_custom_cron_schedules( $schedules ) {
if ( ! isset( $schedules['weekly'] ) ) {
$schedules['weekly'] = array(
'interval' => 604800, // 7 дней в секундах
'display' => __( 'Еженедельно' )
);
}
return $schedules;
}
add_filter( 'cron_schedules', 'wpteam_custom_cron_schedules' );
Как проверить и отладить работу WP-Cron
Проверка работы WP-Cron иногда вызывает сложности из-за его особенностей. Вот несколько советов:
- Используйте плагин WP Crontrol для просмотра и управления cron-задачами.
- Добавьте логирование в функцию удаления, чтобы видеть, сколько записей удаляется при каждом запуске.
- Для тестирования можно временно изменить интервал на минутный — чтобы проверить выполнение сразу.
Пример добавления логирования:
function wpteam_delete_old_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '180 days ago',
),
),
'fields' => 'ids',
'posts_per_page' => -1
);
$old_posts = get_posts( $args );
if ( ! empty( $old_posts ) ) {
foreach ( $old_posts as $post_id ) {
wp_delete_post( $post_id, true );
}
error_log( 'wpteam: Удалено постов: ' . count( $old_posts ) );
} else {
error_log( 'wpteam: Нет старых постов для удаления' );
}
}
Альтернативные решения: плагины для автоматического удаления контента
Если писать код не хочется или нужны более тонкие настройки, можно использовать плагины. Например:
- Auto Delete Posts — простой плагин для удаления постов по дате публикации.
- WP Bulk Delete — расширенный инструмент для массового удаления постов, страниц и других типов записей с множеством фильтров.
Для интеграции с WPShop можно рассмотреть плагин Clearfy Pro, который помогает оптимизировать сайт и включает опции для управления контентом.
Резюме и рекомендации по безопасности
Автоматическое удаление записей — мощный инструмент, но требует аккуратного подхода. Перед внедрением на живом сайте обязательно сделайте резервную копию базы данных. Тестируйте функцию в безопасной среде и добавьте логирование.
Также продумайте, какие записи можно удалять без риска потерять важный контент. При необходимости добавьте исключения по категориям, тегам или метаданным.
Используя WP-Cron и кастомный код, вы получите гибкий и эффективный механизм автоматизации, который поможет поддерживать сайт чистым и быстрым.