Иногда возникает необходимость массово удалить все посты из WordPress — например, при переносе сайта, очистке тестового контента или обновлении структуры. В админке нет штатной функции удаления всех записей сразу, а массовое выделение и удаление может быть неудобным и ресурсоёмким. В этой статье мы подробно разберём, как безопасно и эффективно удалить все посты из WordPress программно с помощью PHP-кода, а также рассмотрим альтернативные методы и рекомендации.
Почему стоит использовать код для удаления всех постов в WordPress
Удаление постов через админку WordPress ограничено количеством записей на странице и может привести к ошибкам таймаута на больших сайтах. Использование кода позволяет:
- Удалить все посты за один запуск скрипта.
- Автоматизировать процесс, интегрировать в задачи cron или плагины.
- Контролировать процесс удаления и обрабатывать ошибки.
- Удалять не только публикации, но и любые типы записей (custom post types).
Таким образом, программное удаление — это мощный инструмент для разработчиков и системных администраторов.
Подготовка к удалению: резервное копирование и создание тестовой среды
Перед массовым удалением контента крайне важно сделать полное резервное копирование базы данных. Это позволит в случае ошибки восстановить потерянные данные. Для этого можно использовать плагины, например, UpdraftPlus или сделать бэкап вручную через phpMyAdmin.
Рекомендую сначала проверить скрипт удаления на локальной копии сайта или тестовом сервере, чтобы убедиться, что он работает корректно и не удаляет лишнего.
Также полезно отключить кэширование и плагины, которые могут влиять на работу с базой данных, чтобы избежать конфликтов.
Основной способ: удаление всех постов через WP-CLI
Если у вас есть доступ к командной строке сервера, самый простой и безопасный способ — использовать WP-CLI. Команда для удаления всех постов выглядит так:
wp post delete $(wp post list --post_type=post --format=ids) --forceЗдесь wp post list получает список ID всех записей типа post, а wp post delete удаляет их принудительно (без перемещения в корзину).
Преимущества WP-CLI:
- Очень быстро и эффективно.
- Безопасно, с возможностью тестового запуска.
- Поддерживает любые типы записей, например,
pageили кастомные.
Пример удаления всех страниц:
wp post delete $(wp post list --post_type=page --format=ids) --forceУдаление всех постов через PHP-код в теме или плагине
Если доступа к консоли нет, можно использовать PHP-скрипт, который выполнит удаление через функции WordPress. Ниже пример функции wplicense_delete_all_posts(), удаляющей все записи типа post:
function wplicense_delete_all_posts() {
// Получаем ID всех постов
$all_posts = get_posts(array(
'post_type' => 'post',
'numberposts' => -1,
'post_status' => 'any',
'fields' => 'ids',
));
if (empty($all_posts)) {
return 'Посты не найдены для удаления.';
}
foreach ($all_posts as $post_id) {
wp_delete_post($post_id, true); // true — удаляет без корзины
}
return count($all_posts) . ' постов удалено.';
}Для запуска функции можно добавить временный обработчик, например, через AJAX или хук. Пример вызова при активации темы (не рекомендую на живом сайте):
add_action('after_switch_theme', function() {
echo wplicense_delete_all_posts();
});Важно: данный код удаляет все посты безвозвратно. Перед использованием обязательно сделайте бэкап.
Удаление постов с учетом пользовательских типов записей
Если на сайте используются кастомные типы (custom post types), их тоже можно удалить, расширив функцию:
function wplicense_delete_all_custom_posts($post_type = 'post') {
$all_posts = get_posts(array(
'post_type' => $post_type,
'numberposts' => -1,
'post_status' => 'any',
'fields' => 'ids',
));
if (empty($all_posts)) {
return 'Посты типа ' . $post_type . ' не найдены для удаления.';
}
foreach ($all_posts as $post_id) {
wp_delete_post($post_id, true);
}
return count($all_posts) . ' постов типа ' . $post_type . ' удалено.';
}Вызывайте функцию с нужным типом, например:
echo wplicense_delete_all_custom_posts('product');Удаление постов напрямую через SQL-запросы: быстрый, но рискованный метод
Для очень больших сайтов можно удалить записи напрямую через SQL. Но это опасно, так как можно нарушить целостность базы, не удалив связанные данные (мета, термины и пр.).
Пример запроса для удаления всех постов типа post:
DELETE p, pm FROM wp_posts p
LEFT JOIN wp_postmeta pm ON pm.post_id = p.ID
WHERE p.post_type = 'post';Этот запрос удалит посты и их метаданные, но не таксономии и другие связи. Если решите использовать SQL, обязательно сделайте полный бэкап и проверьте результаты.
Рекомендации по безопасности и производительности
При массовом удалении:
- Проверяйте, что скрипт запускается только один раз и по авторизованному запросу.
- Для больших сайтов разбивайте удаление на партии по 100-500 постов, чтобы избежать превышения лимита памяти и таймаутов.
- Отключайте кэш и плагины, которые могут конфликтовать.
- Используйте логи для отслеживания ошибок.
- Всегда имейте возможность отката через бэкап.
Выводы
Удаление всех постов в WordPress — задача, которую лучше решать программно. Самый простой и безопасный способ — WP-CLI. Если консоли нет, используйте проверенный PHP-код с функциями WordPress. Избегайте прямого удаления через SQL, если не уверены в последствиях.
Пользуйтесь примерами из этой статьи и адаптируйте их под свои задачи. Важно всегда соблюдать осторожность и делать резервные копии.