В WordPress иногда возникает необходимость автоматически удалять устаревшие записи, чтобы поддерживать базу данных в порядке и не перегружать сайт. В этой статье мы рассмотрим, как реализовать такую функциональность через шорткод. Это решение особенно полезно, если вы хотите вручную запускать очистку через любой пост или страницу сайта с помощью простого вызова шорткода.
Почему стоит использовать автоматическое удаление старых записей?
Когда на сайте накапливается много устаревшего контента, это может негативно сказываться на производительности и SEO. Старые записи, которые уже не актуальны, лучше удалять или архивировать. В WordPress нет встроенного инструмента, который позволял бы делать это автоматически по времени, без плагинов. Но мы можем написать свой шорткод, который будет удалять записи старше заданного количества дней.
Преимущества такого подхода:
- Контроль запуска через шорткод — вы решаете, когда запускать удаление.
- Гибкость — можно настроить параметры времени, типы записей.
- Минимум сторонних плагинов и зависимостей.
Создание шорткода для удаления старых записей — подготовка и базовый код
Для начала создадим функцию с префиксом wpeasy_ (чтобы избежать конфликтов), которая будет искать все посты старше заданного количества дней и удалять их.
Добавьте следующий код в файл functions.php вашей темы или в свой плагин:
function wpeasy_delete_old_posts_shortcode($atts) {
// Параметры шорткода: days - сколько дней назад, post_type - тип записи
$atts = shortcode_atts( array(
'days' => 30,
'post_type' => 'post',
), $atts, 'delete_old_posts' );
$days = intval($atts['days']);
$post_type = sanitize_text_field($atts['post_type']);
if ($days <= 0) {
return '<p>Неверное значение параметра days.</p>';
}
$date_query = array(
array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
),
);
$args = array(
'post_type' => $post_type,
'post_status' => 'any',
'date_query' => $date_query,
'fields' => 'ids',
'nopaging' => true,
);
$query = new WP_Query($args);
$deleted = 0;
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
// Безопасное удаление записи
wp_delete_post($post_id, true);
$deleted++;
}
}
return "<p>Удалено записей: {$deleted}</p>";
}
add_shortcode('delete_old_posts', 'wpeasy_delete_old_posts_shortcode');
Этот код создаёт шорткод [delete_old_posts], который удалит все записи типа post, старше 30 дней. Параметры можно менять, например: [delete_old_posts days=60 post_type=page] удалит страницы старше 60 дней.
Дополнительные возможности и безопасность
Важно добавить проверки безопасности, чтобы шорткод не могли запускать все подряд пользователи. Для этого можно ограничить выполнение только администраторам или пользователям с определёнными правами.
Обновим функцию:
function wpeasy_delete_old_posts_shortcode($atts) {
if (!current_user_can('manage_options')) {
return '<p>У вас нет прав для выполнения этой операции.</p>';
}
$atts = shortcode_atts( array(
'days' => 30,
'post_type' => 'post',
), $atts, 'delete_old_posts' );
$days = intval($atts['days']);
$post_type = sanitize_text_field($atts['post_type']);
if ($days <= 0) {
return '<p>Неверное значение параметра days.</p>';
}
$date_query = array(
array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime('-' . $days . ' days')),
),
);
$args = array(
'post_type' => $post_type,
'post_status' => 'any',
'date_query' => $date_query,
'fields' => 'ids',
'nopaging' => true,
);
$query = new WP_Query($args);
$deleted = 0;
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
$deleted++;
}
}
return "<p>Удалено записей: {$deleted}</p>";
}
Теперь запускать очистку сможет только администратор сайта. Это важно для безопасности.
Как использовать шорткод на сайте
Для запуска удаления нужно просто вставить шорткод в любую страницу или запись, доступную для администратора. Например:
[delete_old_posts]— удалит записи старше 30 дней.[delete_old_posts days=90 post_type=custom_post]— удалит записи типаcustom_postстарше 90 дней.
После вставки и обновления страницы администратор увидит сообщение о количестве удалённых записей.
Альтернативные решения и плагины
Если вы хотите более сложный функционал с расписанием и фильтрами, обратите внимание на плагин Clearfy Pro. Он умеет оптимизировать базу, удалять ревизии, спам и устаревший контент по расписанию.
Также можно использовать WP Cron для автоматизации запуска функции удаления без участия пользователя. Но это уже другая тема.
Выводы и рекомендации
Создание собственного шорткода для удаления старых записей — простой и эффективный способ поддерживать базу данных в порядке без установки громоздких плагинов. Главное — не забывать про безопасность и права доступа.
Если вы хотите расширить функционал, добавьте в шорткод фильтрацию по таксономиям, мета-полям, или реализуйте предварительный просмотр записей, которые будут удалены.