В этой статье разберем, как с помощью шорткода в WordPress реализовать автоматическое удаление записей старше определенного количества дней. Это решение пригодится для сайтов с большим количеством устаревшего контента, который желательно регулярно убирать без прямого доступа к базе данных или панели администратора.
Почему важно автоматизировать удаление старых записей
С течением времени на сайте накапливаются записи, которые уже не актуальны или не нужны пользователям. Ручная очистка — трудоемкий процесс, который легко забыть. Автоматизация позволяет:
- Поддерживать базу данных в оптимальном состоянии.
- Уменьшить нагрузку на сервер.
- Повысить качество контента для посетителей.
- Избежать накопления мусорных записей и спама.
Решение в виде шорткода удобно тем, что его можно вставлять на любую страницу или админ-панель сайта, контролируя момент запуска удаления и параметры.
Создание шорткода для удаления записей старше N дней
Для начала создадим функцию, которая будет принимать параметр — количество дней, старше которых записи нужно удалять. Далее реализуем сам шорткод с безопасной проверкой прав пользователя.
Код функции и шорткода
function wpstart_delete_old_posts_shortcode($atts) {
// Проверка прав: только администраторы могут запускать удаление
if (!current_user_can('manage_options')) {
return '<p>У вас нет прав для выполнения этой операции.</p>';
}
// Получаем параметры шорткода
$atts = shortcode_atts(array(
'days' => 30,
'post_type' => 'post'
), $atts, 'wpstart_delete_old_posts');
$days = intval($atts['days']);
$post_type = sanitize_text_field($atts['post_type']);
if ($days <= 0) {
return '<p>Параметр days должен быть положительным числом.</p>';
}
global $wpdb;
// Вычисляем дату, старше которой записи удаляем
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID записей для удаления
$posts_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_date < %s AND post_status IN ('publish', 'draft', 'pending')",
$post_type, $date_threshold
));
if (empty($posts_to_delete)) {
return "<p>Нет записей старше {$days} дней для удаления.</p>";
}
$deleted_count = 0;
foreach ($posts_to_delete as $post_id) {
// Безопасное удаление с обходом мусорной корзины
if (wp_delete_post($post_id, true)) {
$deleted_count++;
}
}
return "<p>Удалено записей: {$deleted_count}.</p>";
}
add_shortcode('wpstart_delete_old_posts', 'wpstart_delete_old_posts_shortcode');Этот код создает шорткод [wpstart_delete_old_posts days="60" post_type="post"], который удалит все записи указанного типа старше 60 дней при запуске. По умолчанию удаляются записи типа post старше 30 дней.
Безопасность и ограничения использования шорткода
Поскольку удаление контента — критичная операция, важно ограничить доступ к шорткоду:
- Проверяем, что пользователь имеет права администратора.
- Не используем этот шорткод в публичных постах или страницах, доступных всем.
- Рекомендуется запускать шорткод на страницах в админ-панели или защищенных паролем.
Если нужно автоматизировать удаление без ручного запуска, лучше использовать WP Cron с аналогичной логикой внутри функции.
Примеры расширения функционала
Добавление логирования удаления
Чтобы отслеживать, какие записи удаляются, можно добавить запись в лог файл или в отдельную таблицу базы данных. Например, простой лог в файл:
function wpstart_log_deleted_post($post_id) {
$log_file = WP_CONTENT_DIR . '/wpstart_deleted_posts.log';
$post_title = get_the_title($post_id);
$date = date('Y-m-d H:i:s');
$entry = "{$date} - Удалена запись #{$post_id} - {$post_title}\n";
file_put_contents($log_file, $entry, FILE_APPEND);
}
// В цикле удаления добавляем вызов:
if (wp_delete_post($post_id, true)) {
wpstart_log_deleted_post($post_id);
$deleted_count++;
}Удаление по кастомному полю
Если на сайте используется кастомное поле для отметки устаревших записей, можно расширить выборку:
// В SQL добавить условие:
// AND meta_key = 'wpstart_expired' AND meta_value = '1'
// Для этого используем WP_Query с meta_query:Или можно модифицировать запрос, но для простоты лучше делать отдельную функцию с WP_Query и циклом удаления.
Полезные плагины для автоматизации и очистки базы данных
Для управления устаревшим контентом и оптимизации базы данных можно использовать плагины:
- Clearfy Pro — оптимизация и очистка базы данных, удаление мусора.
- WPRemark — управление мета-данными и чистка базы.
- ABC Pagination — удобная пагинация при работе с большим объемом записей.
Использование плагинов может существенно упростить задачи, связанные с очисткой и оптимизацией, но для уникальных сценариев лучше писать собственные решения.
Итоговые рекомендации по использованию шорткода
Перед применением шорткода на рабочем сайте обязательно:
- Создайте резервную копию базы данных.
- Тестируйте шорткод на локальной копии или тестовом сервере.
- Проверяйте права доступа и безопасность.
- Следите за логами и результатами удаления.
Так вы сохраните контроль над процессом и избежите потери важных данных.