В WordPress часто возникает задача автоматического удаления устаревшего контента — например, записей старше определённого времени. Это помогает поддерживать сайт в актуальном состоянии и уменьшать нагрузку на базу данных. В этой статье рассматривается, как создать собственный шорткод для удаления старых записей по дате публикации. Такой подход удобен, когда нужно запускать удаление вручную с любой страницы сайта без доступа к админке.
Почему важно автоматизировать удаление старых записей
Удаление старого контента вручную — трудоёмкий и неудобный процесс, особенно если на сайте много записей. Автоматизация позволяет:
- Поддерживать базу данных в чистоте и уменьшать её размер.
- Сохранять актуальность контента, удаляя устаревшие записи.
- Уменьшать нагрузку на сервер и ускорять работу сайта.
При этом важно реализовать безопасный механизм удаления, чтобы случайно не стереть нужные данные.
Создание шорткода для удаления старых записей по дате
Рассмотрим пример создания шорткода [wpreset_delete_old_posts days="30"], который удаляет все записи старше указанного количества дней. По умолчанию — 30 дней.
Регистрация шорткода
Добавим следующий код в файл functions.php вашей темы или в собственный плагин:
function wpreset_delete_old_posts_func($atts) {
$atts = shortcode_atts(array(
'days' => 30,
), $atts, 'wpreset_delete_old_posts');
$days = intval($atts['days']);
if ($days <= 0) {
return '<p>Ошибка: количество дней должно быть положительным числом.</p>';
}
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID записей старше указанного срока
$old_posts = get_posts(array(
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
'posts_per_page' => -1,
));
if (empty($old_posts)) {
return '<p>Нет записей для удаления за последние ' . $days . ' дней.</p>';
}
$deleted_count = 0;
foreach ($old_posts as $post_id) {
if (wp_delete_post($post_id, true)) { // true — без возможности восстановления
$deleted_count++;
}
}
return '<p>Удалено записей: ' . $deleted_count . '</p>';
}
add_shortcode('wpreset_delete_old_posts', 'wpreset_delete_old_posts_func');Как использовать шорткод
Для удаления записей старше 60 дней разместите на странице или в записи следующий шорткод:
[wpreset_delete_old_posts days="60"]
Это удалит все опубликованные записи старше 60 дней.
Советы по безопасности и доработки функции
Удаление данных — серьёзная операция, поэтому рекомендуем:
- Добавить проверку прав пользователя, чтобы запускать удаление могли только администраторы.
- Вводить подтверждение действия через дополнительный параметр шорткода или форму.
- Делать резервные копии базы данных перед удалением. Для этого отлично подходит плагин BackupWP.
Пример с проверкой прав и подтверждением
function wpreset_delete_old_posts_secure_func($atts) {
if (!current_user_can('manage_options')) {
return '<p>У вас нет прав для выполнения этой операции.</p>';
}
$atts = shortcode_atts(array(
'days' => 30,
'confirm' => 'no'
), $atts, 'wpreset_delete_old_posts_secure');
if ($atts['confirm'] !== 'yes') {
return '<p>Подтвердите удаление, добавив параметр confirm="yes" в шорткод.</p>';
}
$days = intval($atts['days']);
if ($days <= 0) {
return '<p>Ошибка: количество дней должно быть положительным числом.</p>';
}
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$old_posts = get_posts(array(
'date_query' => array(
array(
'before' => $date_threshold,
'inclusive' => true,
),
),
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
'posts_per_page' => -1,
));
if (empty($old_posts)) {
return '<p>Нет записей для удаления за последние ' . $days . ' дней.</p>';
}
$deleted_count = 0;
foreach ($old_posts as $post_id) {
if (wp_delete_post($post_id, true)) {
$deleted_count++;
}
}
return '<p>Удалено записей: ' . $deleted_count . '</p>';
}
add_shortcode('wpreset_delete_old_posts_secure', 'wpreset_delete_old_posts_secure_func');Используйте шорткод с подтверждением:
[wpreset_delete_old_posts_secure days="30" confirm="yes"]
Альтернативные решения: плагины для удаления старого контента
Если хочется готовое решение без кода, обратите внимание на плагины:
- Auto Delete Posts — позволяет настраивать удаление записей по времени через удобный интерфейс.
- WPReset — не только для удаления, но и для восстановления состояния сайта, полезен при тестировании изменений. Подробнее на странице плагина.
Выбор зависит от требований: если нужна простая автоматизация — достаточно шорткода, если комплексное управление — лучше плагин.
Выводы и рекомендации
Создание собственного шорткода для удаления старых записей позволяет гибко и удобно управлять устаревшим контентом. Главное — обеспечить безопасность, добавив проверки доступа и подтверждения. Для резервного копирования рекомендуем использовать специализированные плагины, например, BackupWP. Такой подход поможет поддерживать сайт в порядке и оптимизировать работу базы данных.