В процессе администрирования WordPress-сайта иногда возникает необходимость быстро очистить блог — удалить все записи, чтобы начать с чистого листа. Особенно это актуально на этапах разработки и тестирования. В стандартной админке WordPress удалить все записи одним действием нельзя — придется удалять поштучно или через пакетные операции, что неудобно и занимает время.
Почему стандартные методы удаления записей неудобны
В админке WordPress есть возможность массового удаления записей через меню «Записи» -> «Все записи», выбрав несколько штук и применив действие «Удалить». Но если записей сотни или тысячи, этот метод не подходит — нужно будет делать несколько итераций.
Использование SQL-запросов к базе данных напрямую — вариант, но он требует доступа к базе и знаний SQL. Ошибка в запросе может привести к потере важных данных.
Поэтому удобнее создать в админке кнопку, которая удалит все записи программно и безопасно.
Создаем кнопку для удаления всех записей в админке WordPress
Для решения задачи создадим плагин или добавим код в functions.php темы, который добавит новую страницу в меню и кнопку для удаления всех записей. Для безопасности добавим nonce и проверим права пользователя.
Добавление страницы и кнопки
Для начала зарегистрируем новую страницу в меню «Инструменты» с кнопкой:
function wpreset_add_tools_page() {
add_management_page(
'Удалить все записи',
'Удалить все записи',
'manage_options',
'wpreset-delete-all-posts',
'wpreset_render_delete_posts_page'
);
}
add_action('admin_menu', 'wpreset_add_tools_page');
function wpreset_render_delete_posts_page() {
if (!current_user_can('manage_options')) {
wp_die('Доступ запрещен');
}
?>
<div class="wrap">
<h1>Удалить все записи WordPress</h1>
<form method="post">
<?php wp_nonce_field('wpreset_delete_all_posts_action', 'wpreset_delete_all_posts_nonce'); ?>
<p>Нажмите кнопку ниже, чтобы удалить <strong>все</strong> записи (публикации) на сайте.</p>
<input type="submit" name="wpreset_delete_all_posts" class="button button-danger" value="Удалить все записи" onclick="return confirm('Вы уверены? Это действие необратимо!');">
</form>
</div>
<?php
if (isset($_POST['wpreset_delete_all_posts'])) {
if (!isset($_POST['wpreset_delete_all_posts_nonce']) || !wp_verify_nonce($_POST['wpreset_delete_all_posts_nonce'], 'wpreset_delete_all_posts_action')) {
echo '<div class="notice notice-error"><p>Ошибка проверки безопасности. Попробуйте снова.</p></div>';
return;
}
wpreset_delete_all_posts_handler();
}
}
Функция удаления всех записей
Теперь реализуем функцию, которая выполнит удаление всех записей типа post. Мы будем использовать WP_Query с параметром posts_per_page => -1, чтобы получить все записи, и функцию wp_delete_post() для удаления.
function wpreset_delete_all_posts_handler() {
if (!current_user_can('manage_options')) {
echo '<div class="notice notice-error"><p>Нет прав на выполнение операции.</p></div>';
return;
}
// Загружаем все записи
$args = array(
'post_type' => 'post',
'post_status' => array('publish', 'draft', 'pending', 'future', 'private'),
'posts_per_page' => -1,
'fields' => 'ids'
);
$all_posts = get_posts($args);
if (empty($all_posts)) {
echo '<div class="notice notice-info"><p>Записей для удаления не найдено.</p></div>';
return;
}
$deleted_count = 0;
foreach ($all_posts as $post_id) {
// Удаляем без возможности восстановления (в корзину не кладем)
if (wp_delete_post($post_id, true)) {
$deleted_count++;
}
}
echo '<div class="notice notice-success"><p>Удалено записей: ' . $deleted_count . '</p></div>';
}
Обработка потенциальных проблем и безопасность
Удаление всех записей — критическая операция, поэтому мы добавили проверку прав пользователя manage_options и nonce для защиты от CSRF-атак.
При клике появляется стандартное JavaScript-подтверждение, чтобы снизить риск случайного удаления.
Рекомендуется выполнять бэкап базы данных перед использованием такой функции.
Оптимизация для сайтов с большим количеством записей
Если записей очень много, загрузка всех ID одним запросом может привести к превышению лимитов памяти или времени выполнения. В этом случае лучше удалять записи порциями.
function wpreset_delete_all_posts_handler() {
if (!current_user_can('manage_options')) {
echo '<div class="notice notice-error"><p>Нет прав на выполнение операции.</p></div>';
return;
}
$deleted_count = 0;
$paged = 1;
$posts_per_page = 100;
do {
$args = array(
'post_type' => 'post',
'post_status' => array('publish', 'draft', 'pending', 'future', 'private'),
'posts_per_page' => $posts_per_page,
'paged' => $paged,
'fields' => 'ids'
);
$posts_batch = get_posts($args);
if (empty($posts_batch)) {
break;
}
foreach ($posts_batch as $post_id) {
if (wp_delete_post($post_id, true)) {
$deleted_count++;
}
}
$paged++;
} while (count($posts_batch) === $posts_per_page);
echo '<div class="notice notice-success"><p>Удалено записей: ' . $deleted_count . '</p></div>';
}
Альтернативные варианты: плагины для массового удаления записей
Если не хочется писать код, можно использовать готовые плагины:
- Bulk Delete — позволяет фильтровать и массово удалять записи по различным условиям (по категориям, тегам, статусу и т.д.).
- WP Bulk Delete — похожий по функционалу плагин с удобным интерфейсом.
Плагины удобны для сложных выборок, но для простой задачи «удалить все записи» собственный код быстрее и надежнее.
Итог
Мы создали простой и безопасный инструмент для удаления всех записей WordPress одной кнопкой в админке. Это удобное решение для разработчиков и администраторов, позволяющее быстро очищать блог без риска и с контролем безопасности.
Используйте описанный код как основу и адаптируйте под свои нужды — например, добавьте удаление кастомных типов записей или комментариев.