В процессе работы с WordPress иногда возникает ситуация, когда записи (посты) удаляются автоматически — например, по истечении срока публикации, при работе с плагинами очистки или из-за ошибок в коде. В этой статье мы разберём, как запретить автоматическое удаление постов, чтобы избежать потери важного контента, а также рассмотрим примеры кода и полезные плагины для контроля этого процесса.
Почему в WordPress могут удаляться посты автоматически
Автоматическое удаление постов может происходить по нескольким причинам:
- Использование плагинов для автоматической очистки базы данных и удаления старого или неактивного контента.
- Настройки публикации с ограничением срока жизни записи (expiration date).
- Ошибки в кастомных скриптах или хуках, которые вызывают удаление записей.
- Использование Cron-задач, которые выполняют удаление по расписанию.
В первую очередь необходимо понять источник удаления и только потом внедрять запрет.
Использование хуков для предотвращения удаления постов
WordPress предоставляет несколько хуков, которые позволяют перехватить процесс удаления записи и отменить его. Основной — это before_delete_post и wp_trash_post. Можно использовать фильтр wp_trash_post, чтобы запретить перемещение поста в корзину, и хук before_delete_post для блокировки окончательного удаления.
Пример функции запрета удаления поста
function wpclass_prevent_post_deletion($post_id) {
// Можно добавить условие по типу записи или ID
$protected_post_ids = array(1, 2, 3); // ID защищённых постов
if (in_array($post_id, $protected_post_ids)) {
wp_die('Удаление этого поста запрещено.');
}
}
add_action('before_delete_post', 'wpclass_prevent_post_deletion');
Этот код остановит удаление постов с ID 1, 2 и 3, выдав сообщение об ошибке.
Запрет перемещения записи в корзину
function wpclass_prevent_trash_post($post_id) {
$protected_post_types = array('post', 'page');
$post = get_post($post_id);
if (in_array($post->post_type, $protected_post_types)) {
return false; // Запретить отправку в корзину
}
return true;
}
add_filter('wp_trash_post', 'wpclass_prevent_trash_post');
Такой фильтр заблокирует перемещение в корзину для постов и страниц.
Пример: блокируем удаление постов с кастомным полем «protect»
Если вы используете кастомное поле, например, protect, для пометки важных постов, можно блокировать удаление по его наличию:
function wpclass_prevent_deletion_by_meta($post_id) {
$protect = get_post_meta($post_id, 'protect', true);
if ($protect === '1') {
wp_die('Этот пост защищён от удаления.');
}
}
add_action('before_delete_post', 'wpclass_prevent_deletion_by_meta');
Это позволит гибко управлять защитой постов без жёсткой привязки к ID.
Плагины для контроля автоматического удаления контента
Для удобства управления и мониторинга удаления постов можно использовать плагины:
- Clearfy Pro — плагин для оптимизации WordPress, позволяющий отключить автоматические процессы, которые могут повлиять на удаление контента.
- WPRemark — плагин для управления комментариями и контентом, с настройками по сохранению важных данных.
Эти продукты помогут снизить риск потери данных из-за сторонних автоматизаций.
Отслеживание и логирование удаления постов
Чтобы понимать, когда и почему происходит удаление, полезно вести логирование. Ниже пример простого кода для записи информации в лог при попытке удаления.
function wpclass_log_post_deletion_attempt($post_id) {
$post = get_post($post_id);
$log_message = sprintf('Попытка удаления поста ID %d, заголовок: %s, тип: %s', $post_id, $post->post_title, $post->post_type);
error_log($log_message);
}
add_action('before_delete_post', 'wpclass_log_post_deletion_attempt');
Логи будут сохраняться в файле error_log сервера, что поможет выявить неожиданное удаление.
Практические рекомендации
- Всегда делайте бэкапы перед внесением изменений в логику удаления.
- Используйте кастомные поля и фильтры для гибкого управления защитой записей.
- Проверяйте сторонние плагины, которые могут выполнять автоматическую очистку — отключайте или настраивайте их корректно.
- Используйте логирование для мониторинга удалений, чтобы быстро реагировать на проблемы.
- При необходимости создайте отдельный плагин с кодом защиты для удобного управления и обновления.