Ведение сайта на WordPress часто сопровождается накоплением большого количества устаревших записей — это могут быть новости, акции, объявления или другие типы постов, которые уже не актуальны. Ручное удаление таких записей занимает много времени, особенно если их сотни или тысячи. В этой статье мы подробно рассмотрим, как автоматизировать удаление старых записей в WordPress с помощью кода, без использования тяжеловесных плагинов, а также приведём примеры готовых функций с подробным объяснением.
Почему важно удалять старые записи автоматически
Автоматическое удаление устаревших записей помогает поддерживать базу данных в чистоте и оптимальном состоянии, что положительно сказывается на производительности сайта. Кроме того, это снижает нагрузку на бэкапы и упрощает администрирование.
Если на вашем сайте используются кастомные типы записей (Custom Post Types), которые быстро устаревают (например, события, объявления), автоматизация удаления особенно актуальна.
Рассмотрим основные причины для автоматизации удаления:
- Сокращение размера базы данных.
- Уменьшение времени резервного копирования.
- Избежание показа пользователям неактуальной информации.
- Оптимизация индексации сайта поисковыми системами.
Как определить, какие записи считать старыми
Ключевой момент — критерии удаления. Обычно используются такие параметры:
- Дата публикации. Например, удалять все записи старше 180 дней.
- Статус записи — опубликованные, черновики, запланированные.
- Тип записи — стандартные посты, страницы или кастомные типы.
- Наличие определённого метаполя или таксономии, чтобы удалить только записи с нужным тегом.
В нашем примере мы будем удалять опубликованные посты старше 180 дней.
Пример функции для автоматического удаления старых записей
Создадим функцию wpeasy_delete_old_posts(), которую можно запускать вручную или по расписанию через WP-Cron.
function wpeasy_delete_old_posts() {
global $wpdb;
// Количество дней для удаления записей
$days = 180;
// Формируем дату удаления
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID постов, которые старше $days и опубликованы
$posts_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s AND post_date < %s",
'post', 'publish', $date_threshold
));
if (!empty($posts_to_delete)) {
foreach ($posts_to_delete as $post_id) {
// Безопасное удаление записи (с перемещением в корзину)
wp_trash_post($post_id);
}
}
}
Данная функция безопасно перемещает старые записи в корзину, что позволяет при необходимости их восстановить. Если нужна полная очистка, можно использовать wp_delete_post($post_id, true) для удаления без возможности восстановления.
Автоматизация удаления через WP-Cron
Чтобы не запускать функцию вручную, подключим её к планировщику WordPress — WP-Cron. Это позволит, например, удалять старые записи раз в сутки.
// Регистрируем событие при активации темы или плагина
function wpeasy_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpeasy_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wpeasy_daily_delete_old_posts');
}
}
add_action('wp', 'wpeasy_schedule_old_posts_deletion');
// Хук для выполнения функции
add_action('wpeasy_daily_delete_old_posts', 'wpeasy_delete_old_posts');
// Очистка при деактивации
function wpeasy_clear_schedule() {
$timestamp = wp_next_scheduled('wpeasy_daily_delete_old_posts');
wp_unschedule_event($timestamp, 'wpeasy_daily_delete_old_posts');
}
register_deactivation_hook(__FILE__, 'wpeasy_clear_schedule');
Теперь функция wpeasy_delete_old_posts() будет вызываться автоматически каждый день, удаляя все устаревшие записи.
Удаление старых записей кастомных типов
Если на сайте используются кастомные типы записей, например, event или announcement, то можно расширить функцию, чтобы удалять записи и из них.
function wpeasy_delete_old_custom_posts() {
global $wpdb;
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Массив типов записей для удаления
$post_types = ['post', 'event', 'announcement'];
foreach ($post_types as $post_type) {
$posts_to_delete = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_status = %s AND post_date < %s",
$post_type, 'publish', $date_threshold
));
if (!empty($posts_to_delete)) {
foreach ($posts_to_delete as $post_id) {
wp_trash_post($post_id);
}
}
}
}
Такую функцию также можно подключить к WP-Cron по примеру выше.
Советы по безопасному использованию и расширению
При работе с удалением записей важно соблюдать осторожность:
- Перед внедрением кода сделайте резервную копию базы данных.
- Тестируйте функцию на тестовом сайте, чтобы исключить случайное удаление важных данных.
- При необходимости добавьте фильтры по метаполям или таксономиям, чтобы удалять только записи с определёнными условиями.
- Для удобства можно добавить в админку кнопку для запуска удаления вручную — это удобно для администраторов сайта.
Пример фильтрации по метаполю
Если нужно удалять записи старше 180 дней, но только с метаполем expired равным true, можно использовать WP_Query:
function wpeasy_delete_old_posts_by_meta() {
$days = 180;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$query = new WP_Query([
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'meta_query' => [
[
'key' => 'expired',
'value' => 'true',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
]);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_trash_post($post_id);
}
}
}
Полезные плагины для автоматизации удаления
Если не хочется писать код, можно использовать плагины, которые помогут частично или полностью автоматизировать процесс:
- Clearfy — плагин для оптимизации и очистки сайта, включая удаление старых ревизий, авточерновиков и мусора.
- WPRemark — плагин для автоматизации задач, позволяет создавать свои правила и триггеры, включая удаление записей.
Однако при больших объёмах данных и специфичных требованиях лучше использовать собственные решения на коде.