В этой статье рассмотрим, как настроить в WordPress автоматическое удаление старых записей по определенным условиям с помощью встроенной системы планировщика задач — WP-Cron. Такой подход помогает поддерживать базу данных в порядке, уменьшает размер и оптимизирует работу сайта без необходимости вручную искать и удалять устаревший контент.
Что такое WP-Cron и зачем удалять записи автоматически
WP-Cron — это виртуальный планировщик задач, встроенный в WordPress, который запускает функции по расписанию. В отличие от системного cron на сервере, WP-Cron срабатывает при посещении сайта. Это удобно, но требует, чтобы трафик был хотя бы минимальный.
Автоматическое удаление старых записей полезно в нескольких случаях:
- Вы ведете блог с новостями и хотите, чтобы публикации старше, например, года, удалялись автоматически.
- На сайте создаются временные записи — акции, события, которые утрачивают актуальность.
- Чтобы не перегружать базу данных устаревшим контентом и не замедлять работу сайта.
Можно задать удаление не только по дате, но и по другим условиям — по типу записи, категории, меткам или пользовательским полям.
Как настроить задачу cron для удаления записей
Для начала создадим функцию удаления и зарегистрируем задачу в WP-Cron. Ниже пример, который удаляет записи типа post старше 180 дней.
function wplike_delete_old_posts() {
global $wpdb;
$days = 180; // количество дней
$date = 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 = %s AND post_status = %s AND post_date < %s",
'post', 'publish', $date
));
if (!empty($old_posts)) {
foreach($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удалить без возможности восстановления
}
}
}
// Планируем задачу при инициализации
function wplike_schedule_delete_old_posts() {
if (!wp_next_scheduled('wplike_cron_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wplike_cron_delete_old_posts');
}
}
add_action('wp', 'wplike_schedule_delete_old_posts');
// Хук для выполнения
add_action('wplike_cron_delete_old_posts', 'wplike_delete_old_posts');
Этот код добавляет ежедневную задачу, которая ищет и удаляет публикации старше 180 дней.
Как изменить условия удаления
Для удаления записей по другим условиям достаточно изменить SQL-запрос или использовать WP_Query. Например, удалить записи определенной категории:
function wplike_delete_old_category_posts() {
$days = 90;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'date_query' => [
[
'before' => $date,
],
],
'category_name' => 'news',
'fields' => 'ids',
'post_status' => 'publish',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
Использование плагина Clearfy Pro для автоматизации
Если вы не хотите писать код вручную, можно использовать плагин Clearfy Pro, который предлагает множество инструментов оптимизации, в том числе автоматическое удаление устаревших записей и ревизий.
В панели Clearfy можно задать условия удаления по типу, дате, статусу и другим параметрам, а также расписание запуска. Это удобно для тех, кто не хочет погружаться в код.
Советы по безопасности и производительности
При автоматическом удалении контента важно:
- Убедиться, что удаление безвозвратно — используйте
wp_delete_post($post_id, true)только если уверены. - Тестировать функцию на локальном или тестовом сайте перед запуском на живом проекте.
- Не перегружать WP-Cron задачами — если удаляется много записей, лучше разбивать на части.
- Настроить системный cron на сервере для вызова WP-Cron, если трафик низкий, чтобы задачи запускались вовремя.
Пример разбивки удаления на части
Чтобы избежать тайм-аутов, можно удалять по 20 записей за один запуск:
function wplike_delete_old_posts_batch() {
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_type = %s AND post_status = %s AND post_date < %s LIMIT 20",
'post', 'publish', $date
));
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
Такое решение позволит постепенно очищать базу без нагрузки.
Выводы и рекомендации
Удаление старых записей через WP-Cron — эффективный способ поддерживать сайт чистым и быстрым. Важно продумать условия удаления и тестировать решения. Используйте WP_Query или прямые запросы для гибкости. Если не хочется кодить, обратите внимание на Clearfy Pro и другие инструменты из экосистемы WPShop.