Проблема: Как автоматически удалять устаревший контент в WordPress
Со временем на сайте накапливаются статьи, страницы или пользовательский контент, которые теряют актуальность. Старый контент может замусоривать базу данных и негативно влиять на SEO и производительность сайта. В WordPress нет встроенного инструмента для автоматического удаления записей по дате публикации, поэтому приходится реализовывать это самостоятельно.
Диагностика проблемы и подготовка
Перед автоматизацией удаления контента нужно ответить на вопросы:
- Какие типы записей нужно удалять? Только записи (post), или страницы (page), или кастомные типы?
- Через какой период после публикации контент считается устаревшим? Например, старше 2 лет.
- Нужно ли удалять записи полностью или переводить их в статус «черновик» или «в корзину»?
- Необходима ли резервная копия перед удалением?
Для проверки текущего состояния выполните SQL-запрос через phpMyAdmin или WP-CLI:
SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' ORDER BY post_date ASC LIMIT 10;Это покажет самые старые опубликованные записи.
Пошаговое решение: Автоматическое удаление записей по дате с помощью WP-Cron
1. Создайте функцию для удаления записей старше заданного периода.
function wpacademy_delete_old_posts() {
$days = 730; // количество дней, например, 2 года
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'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 - удаление без корзины
}
}
}2. Зарегистрируйте задачу WP-Cron для регулярного вызова функции, например, раз в сутки.
function wpacademy_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpacademy_daily_old_posts_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpacademy_daily_old_posts_cleanup');
}
}
add_action('wp', 'wpacademy_schedule_old_posts_deletion');
add_action('wpacademy_daily_old_posts_cleanup', 'wpacademy_delete_old_posts');3. Добавьте код в файл functions.php вашей темы или в собственный плагин.
Как проверить, что удаление работает
- Создайте тестовую запись с датой публикации старше порогового значения.
- Запустите функцию вручную, например, добавив вызов
wpacademy_delete_old_posts();на время проверки. - Проверьте, удалена ли запись в админке WordPress и в базе данных.
- Для проверки планировщика WP-Cron используйте плагин WP Crontrol или WP-CLI команду
wp cron event list.
Частые ошибки и как их исправить
- Не срабатывает WP-Cron: на некоторых хостингах WP-Cron не запускается автоматически. Проверьте, что посещения сайта вызывают cron, или настройте системный cron на вызов
wp-cron.php. - Удаление не происходит: проверьте, что функция
wp_delete_postвызывается с параметром$force_delete = true, иначе записи попадут в корзину и не удалятся полностью. - Удаляются не те записи: проверьте параметры
post_typeиdate_query. Возможно, дата записи в базе не соответствует ожиданиям. - Производительность: при большом количестве записей удаление может занимать много времени. Разбейте удаление на порции, например, по 100 записей за раз.
Практические советы по безопасности и производительности
- Перед внедрением обязательно сделайте резервную копию базы данных, чтобы избежать потери данных.
- Реализуйте проверку ролей пользователя, если функция запускается вручную из админки.
- Для больших сайтов используйте пакетное удаление с пагинацией:
function wpacademy_delete_old_posts_batch() {
$days = 730;
$date_threshold = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array('before' => $date_threshold, 'inclusive' => true),
),
'fields' => 'ids',
'posts_per_page' => 100,
);
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
return true; // Есть еще записи, вызывайте повторно
}
return false; // Удаление завершено
}- Можно запускать пакетное удаление с интервалом, чтобы избежать таймаута PHP.
- Если нужно сохранять часть контента, рассмотрите изменение статуса на “черновик” вместо полного удаления.
Сравнение методов удаления старого контента в WordPress
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| WP-Cron + код в functions.php | Автоматическое удаление по расписанию через WP-Cron и собственную функцию | Полный контроль, нет зависимостей от плагинов | Зависит от работы WP-Cron, требует навыков программирования |
| Плагины удаления контента | Готовые решения с интерфейсом, например, WP Bulk Delete | Простота установки, дополнительные опции фильтрации | Дополнительная нагрузка, возможные конфликты, платные функции |
| Ручное удаление | Удаление через админку или SQL-запросы | Простота и точность при малом объеме | Не автоматизировано, требует постоянного контроля |