Как удалить все решения в WordPress через базу данных и код

В 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 для комплексной работы с контентом и комментариями.

Как создать и использовать собственные типы записей (Custom Post Types) в WordPress
05.02.2026
Диагностика и решение проблем выбора темы в WordPress
26.01.2026
Как добавить поле в регистрацию WordPress с применением хуков
19.01.2026
Как создать динамические виджеты в WordPress с использованием REST API
11.01.2026
Как создать производительный кэш в WordPress с применением Transients API
19.12.2025