Время от времени на сайтах WordPress накапливается большое количество устаревших записей, которые уже не актуальны или не нужны. Это может замедлять работу сайта, усложнять администрирование и влиять на SEO. В этой статье разберем, как автоматизировать удаление старых записей WordPress с помощью Cron и кастомного кода, а также рассмотрим удобные плагины для решения этой задачи.
Что такое Cron в WordPress и зачем он нужен для удаления записей
WordPress использует собственный механизм планировщика задач — WP-Cron. Это позволяет запускать определённые функции по расписанию, например, проверять обновления, отправлять почту или выполнять очистку базы данных.
Для удаления старых записей логично настроить задачу, которая будет периодически запускать скрипт очистки. Это избавит от необходимости делать это вручную и позволит поддерживать базу сайта в порядке.
Важный момент: стандартный WP-Cron срабатывает только при посещении сайта, поэтому для более надёжной работы можно настроить системный cron на сервере, который будет вызывать wp-cron.php с нужной периодичностью.
Как написать функцию для удаления старых записей в WordPress
Для начала создадим простую функцию, которая будет удалять записи старше заданного количества дней. Например, удалим все записи типа post, созданные более 180 дней назад.
function wpbloger_delete_old_posts() {
$days = 180; // количество дней
$date_query = array(
'before' => date('Y-m-d', strtotime("-{$days} days")),
'inclusive' => true,
);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array($date_query),
'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 - удаление без перемещения в корзину
}
}
}
Эта функция безопасно удалит все опубликованные записи старше 180 дней без возможности восстановления из корзины.
Как зарегистрировать и запланировать Cron-задачу для автоматического удаления
Теперь добавим задачу в WP-Cron, чтобы наша функция запускалась, например, раз в сутки.
add_action('wpbloger_daily_delete_old_posts', 'wpbloger_delete_old_posts');
function wpbloger_schedule_cron() {
if (!wp_next_scheduled('wpbloger_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpbloger_daily_delete_old_posts');
}
}
add_action('wp', 'wpbloger_schedule_cron');
Этот код проверяет, есть ли уже запланированное событие, и если нет, то создаёт его с ежедневным интервалом.
Как принудительно запустить задачу при разработке
Можно запустить функцию вручную для тестирования:
wpbloger_delete_old_posts();
Как настроить системный cron для надежного запуска WP-Cron
Чтобы WP-Cron работал даже без посещений сайта, можно отключить встроенный запуск и настроить системный cron на сервере:
- Отключить WP-Cron в
wp-config.phpдобавив:define('DISABLE_WP_CRON', true); - Добавить в планировщик задач Linux команду:
*/15 * * * * wget -q -O - https://ваш-сайт.ru/wp-cron.php?doing_wp_cron >/dev/null 2>&1
Это будет запускать WP-Cron каждые 15 минут.
Примеры полезных плагинов для автоматизации удаления и оптимизации
Если не хотите писать код, обратите внимание на следующие плагины:
- Auto Delete Posts — позволяет удалять записи по датам или статусам, гибко настраивается.
- Clearfy Pro — мультифункциональный плагин оптимизации, включает инструменты очистки базы и удаления старого контента.
- WP-Optimize — популярный плагин для очистки базы данных и оптимизации, умеет удалять ревизии, спам, старые черновики.
Рекомендации по безопасному удалению и тестированию
Удаление записей — операция необратимая, поэтому:
- Сначала тестируйте код на локальной копии сайта или в среде разработки.
- Рекомендуется делать резервные копии базы перед включением автоматического удаления.
- Для мягкого удаления можно использовать
wp_delete_post($post_id, false), чтобы записи попадали в корзину. - Добавьте логирование удалённых записей, чтобы отслеживать процесс (например, через error_log или собственную таблицу).
Расширение функционала: удаление записей по кастомным условиям
Вы можете модифицировать функцию для удаления постов по категориям, тегам, таксономиям или пользовательским полям.
function wpbloger_delete_old_posts_by_category($category_slug) {
$days = 180;
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => date('Y-m-d', strtotime("-{$days} days")),
'inclusive' => true,
)
),
'category_name' => $category_slug,
'fields' => 'ids',
'posts_per_page' => -1,
);
$posts = get_posts($args);
if (!empty($posts)) {
foreach ($posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
Такой подход позволит удалять старые записи, например, только из категории «Новости» или «Обзоры».