В WordPress часто создают собственные типы записей (Custom Post Types) для различных целей — например, для хранения решений задач, ответов, комментариев к урокам и т.п. Иногда возникает необходимость массово удалить все такие записи — например, при переработке проекта или очистке тестовых данных. В этой статье подробно разберем, как удалить все записи типа «решения» (custom post type 'resheniya') безопасно и эффективно как через базу данных напрямую, так и через код на PHP.
Удаление всех записей решения через SQL-запросы
Самый быстрый способ удалить все записи кастомного типа — это выполнить SQL-запрос в базе данных. Предположим, что тип записей называется resheniya. Тогда можно удалить все посты и связанные с ними метаданные и термины таксономий.
Почему важно удалить не только записи, но и метаданные и термины? В WordPress вся информация хранится в нескольких таблицах: wp_posts — записи, wp_postmeta — метаданные, wp_term_relationships — связи с таксономиями. Если удалить только записи из wp_posts, базы метаданных и терминов останутся, что будет создавать «мусор» в базе и может замедлять сайт.
Шаг 1. Сделайте резервную копию базы данных
Перед любыми операциями с базой данных обязательно сделайте резервную копию. Это можно сделать через панель хостинга или плагин, например, Clearfy Pro.
Шаг 2. Удаляем записи из wp_posts
DELETE FROM wp_posts WHERE post_type = 'resheniya';Этим запросом удаляем все записи с пост тайпом «resheniya».
Шаг 3. Удаляем связанные метаданные
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts p ON pm.post_id = p.ID WHERE p.ID IS NULL;Этот запрос удалит все метаданные для постов, которых уже нет в таблице wp_posts, то есть очистит «висячие» метаданные.
Шаг 4. Удаляем связи с таксономиями
DELETE tr FROM wp_term_relationships tr LEFT JOIN wp_posts p ON tr.object_id = p.ID WHERE p.ID IS NULL;Удалит связи с терминами для удалённых записей.
Удаление всех решений через PHP-код в WordPress
Если вы предпочитаете делать это программно, можно написать функцию, которая по частям удалит все посты типа «resheniya». Такой способ безопаснее, так как запускается через API WordPress и задействует все его механизмы.
Вот пример функции для удаления всех записей типа «resheniya»:
function wpteam_delete_all_resheniya() {
// Получаем все ID записей типа 'resheniya'
$args = [
'post_type' => 'resheniya',
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => 'any'
];
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $post_id) {
// Удаляем запись без перемещения в корзину
wp_delete_post($post_id, true);
}
}
}Эта функция получает все записи типа «resheniya» и удаляет их навсегда. Вызвать её можно вручную, например, через подключаемый плагин или файл functions.php.
Особенности и рекомендации
- Если записей очень много, лучше делать удаление пакетами, чтобы не перегружать память и не превышать время выполнения скрипта.
- Удаление через
wp_delete_postзапускает все хуки WordPress, удаляет метаданные и связи с таксономиями автоматически — это безопаснее, чем прямое удаление из базы. - Перед запуском кода убедитесь, что у вас есть резервная копия сайта.
Пример пакетного удаления записей с помощью AJAX и WP REST API
Если на вашем сайте много записей, можно сделать удобный интерфейс в админке для поэтапного удаления. Например, через REST API и AJAX.
Вот пример регистрация REST API эндпоинта в functions.php:
add_action('rest_api_init', function () {
register_rest_route('wpteam/v1', '/delete-resheniya', [
'methods' => 'POST',
'callback' => 'wpteam_rest_delete_resheniya',
'permission_callback' => function () {
return current_user_can('delete_posts');
}
]);
});
function wpteam_rest_delete_resheniya(WP_REST_Request $request) {
$offset = $request->get_param('offset') ?: 0;
$batch_size = 50;
$args = [
'post_type' => 'resheniya',
'posts_per_page' => $batch_size,
'offset' => $offset,
'fields' => 'ids',
'post_status' => 'any'
];
$query = new WP_Query($args);
if (empty($query->posts)) {
return ['message' => 'Все записи удалены', 'done' => true];
}
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
return ['message' => 'Удалено ' . count($query->posts) . ' записей', 'done' => false, 'next_offset' => $offset + $batch_size];
}На фронте можно вызывать этот эндпоинт через AJAX, отправляя параметр offset и повторяя запросы пока не будет done = true. Такой подход позволяет избежать таймаутов и перегрузки сервера.
Заключение
Удаление всех записей определённого типа в WordPress — задача частая, но требующая аккуратности. Прямое удаление через SQL быстро, но рискованно. Программное удаление через API WordPress безопаснее и аккуратнее, но медленнее. Для больших объёмов лучше применять пакетную обработку.
Если хотите расширить возможности сайта по управлению данными, обратите внимание на плагины Clearfy Pro и WPRemark для комплексной работы с контентом и комментариями.