В WordPress часто возникает задача очистки базы данных от устаревших записей — будь то посты, кастомные записи или любые другие типы записей. Если у вас есть регулярно обновляемый контент, но устаревшие записи уже не нужны, их можно автоматически удалять, чтобы не засорять базу и не снижать производительность.
Почему стоит использовать шорткод для удаления старых записей
Автоматизация процессов в WordPress — залог удобства и экономии времени. Обычно удаление старых записей происходит вручную через админ-панель, что неудобно при большом объеме контента. Использование шорткода позволяет запускать удаление по запросу, например, при посещении определенной страницы, или интегрировать процесс в другие участки сайта.
Кроме того, шорткод можно ограничить по правам пользователей, чтобы не допустить случайного удаления важных данных.
Основные преимущества решения через шорткод
- Гибкость — можно вызывать удаление в нужное время;
- Контроль — можно фильтровать записи по дате, типу и другим параметрам;
- Безопасность — можно ограничить запуск шорткода только администраторам;
- Простота интеграции — вставляете шорткод в любую страницу или запись.
Создаем шорткод для автоматического удаления записей старше N дней
Рассмотрим пример создания шорткода [wpdevelop_delete_old_posts days=30 post_type=post], который удаляет записи указанного типа, старше заданного количества дней. По умолчанию будет удалять записи типа post, старше 30 дней.
function wpdevelop_delete_old_posts_shortcode($atts) {
// Разрешаем запуск только администраторам
if (!current_user_can('manage_options')) {
return 'У вас нет прав для удаления записей.';
}
// Получаем атрибуты с дефолтами
$atts = shortcode_atts(
array(
'days' => 30,
'post_type' => 'post',
),
$atts,
'wpdevelop_delete_old_posts'
);
$days = intval($atts['days']);
$post_type = sanitize_text_field($atts['post_type']);
if ($days <= 0) {
return 'Параметр days должен быть больше 0.';
}
// Дата, старше которой нужно удалить записи
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем записи для удаления
$args = array(
'post_type' => $post_type,
'post_status' => 'any',
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'fields' => 'ids', // Получаем только ID для оптимизации
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
if (empty($old_posts)) {
return 'Старые записи для удаления не найдены.';
}
$deleted_count = 0;
foreach ($old_posts as $post_id) {
// Удаляем запись без помещения в корзину
if (wp_delete_post($post_id, true)) {
$deleted_count++;
}
}
return "Удалено записей: " . $deleted_count;
}
add_shortcode('wpdevelop_delete_old_posts', 'wpdevelop_delete_old_posts_shortcode');
Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин.
Как использовать шорткод
Вставьте в любую страницу или запись такой шорткод:
[wpdevelop_delete_old_posts days=60 post_type=custom_post]
Он удалит все записи типа custom_post, которые старше 60 дней.
Как сделать процесс безопаснее и удобнее
Ограничение доступа
В нашем примере запуск доступен только администраторам — это важно, чтобы избежать случайных удалений. Если у вас есть своя роль с правами управления записями, можно расширить проверку.
Логирование удалений
Для контроля полезно вести лог удаленных записей. Можно добавить запись в файл или в отдельный пользовательский тип записи.
Автоматизация по расписанию
Если нужно удалять записи регулярно, лучше использовать WP-Cron и запускать функцию удаления по расписанию. В этом случае шорткод можно использовать для разового ручного запуска или отладки.
Пример интеграции с плагином Clearfy Pro для оптимизации базы
Плагин Clearfy Pro позволяет оптимизировать базу WordPress, включая удаление ревизий, спам-комментариев и автосохранений. Наш шорткод дополняет эти возможности, давая точечный контроль над удалением старых записей по типу и дате.
Альтернатива: использование WP-CLI для удаления старых записей
Если у вас есть доступ к командной строке сервера, можно использовать WP-CLI для удаления записей. Команда:
wp post delete $(wp post list --post_type=post --date_query_column=post_date --before='30 days ago' --format=ids) --force
Удалит все записи типа post, старше 30 дней. Это быстрый и безопасный способ при наличии SSH-доступа.
Выводы и рекомендации
Удаление старых записей — важная часть поддержания производительности и чистоты базы данных WordPress. Использование шорткода с контролем доступа — удобный вариант для сайтов без доступа к серверу или командной строке. Для более сложных задач рекомендуется комбинировать ручной запуск с автоматизированным удалением через WP-Cron.