Удаление записей WordPress по массиву ID с помощью WPLab

В процессе работы с WordPress часто возникает задача массового удаления записей по их ID. Например, когда необходимо очистить базу от устаревших или тестовых записей. В этой статье мы рассмотрим, как эффективно и безопасно удалить записи WordPress по массиву ID, используя собственные функции с префиксом WPLab.

Почему важно удалять записи по массиву ID

Удаление записей по одному ID — обычная задача, но когда речь идет о десятках или сотнях записей, ручной подход становится неэффективным и рискованным. Автоматизация процесса позволяет быстро очистить базу, избежать ошибок и снизить нагрузку на сайт.

При этом важно учитывать, что удаление записей должно сопровождаться правильным вызовом функций WordPress для корректного удаления связанного контента, метаданных и таксономий.

Безопасность здесь ключевой момент — нельзя просто удалять строки из базы, нужно использовать API WordPress.

Создаем функцию удаления записей по массиву ID с префиксом WPLab

Для начала создадим функцию, которая будет принимать массив ID записей и удалять их по очереди с помощью стандартной функции wp_delete_post(). Эта функция корректно удаляет запись, учитывая все связи и вызывая все необходимые хуки.

function wplab_delete_posts_by_ids(array $post_ids, $force_delete = false) {
    $deleted = [];
    $failed = [];

    foreach ($post_ids as $post_id) {
        // Проверяем, что ID это целое число
        $post_id = intval($post_id);
        if ($post_id <= 0) {
            $failed[] = $post_id;
            continue;
        }

        // Проверяем существует ли запись
        $post = get_post($post_id);
        if (!$post) {
            $failed[] = $post_id;
            continue;
        }

        // Удаляем запись
        $result = wp_delete_post($post_id, $force_delete);
        if ($result) {
            $deleted[] = $post_id;
        } else {
            $failed[] = $post_id;
        }
    }
    return ['deleted' => $deleted, 'failed' => $failed];
}

Обратите внимание, что параметр $force_delete отвечает за физическое удаление записи без помещения в корзину. По умолчанию он false, то есть запись перемещается в корзину, что безопаснее.

Пример использования функции удаления записей

Допустим, у вас есть массив ID записей, которые нужно удалить:

$ids_to_delete = [12, 25, 48, 103];

$result = wplab_delete_posts_by_ids($ids_to_delete, true);

if (!empty($result['deleted'])) {
    echo 'Удалены записи с ID: ' . implode(', ', $result['deleted']);
}
if (!empty($result['failed'])) {
    echo 'Не удалось удалить записи с ID: ' . implode(', ', $result['failed']);
}

Такой подход позволит быстро получить отчет об успешных и неудачных попытках удаления.

Особенности и рекомендации по безопасности

При массовом удалении записей важно соблюдать несколько правил:

  • Проверяйте права пользователя: перед вызовом функции убедитесь, что текущий пользователь имеет права на удаление записей (current_user_can('delete_posts') или более специфичные права).
  • Используйте nonce и валидацию данных: если удаление вызывается через AJAX или форму, обязательно проверяйте nonce для защиты от CSRF.
  • Резервное копирование: перед массовым удалением сделайте резервную копию базы данных на случай ошибок.
  • Избегайте удаления важных записей: можно добавить фильтрацию по типу записи или другим параметрам, чтобы случайно не удалить критичные данные.

Автоматизация удаления через WP-CLI

Если вы работаете с сайтом через командную строку, можно создать кастомную команду WP-CLI для массового удаления записей по ID.

Пример регистрации команды:

if (class_exists('WP_CLI')) {
    class WPLab_Delete_Posts_Command {
        public function delete($args, $assoc_args) {
            $ids = array_map('intval', explode(',', $assoc_args['ids'] ?? ''));
            if (empty($ids)) {
                WP_CLI::error('Параметр --ids обязателен и должен содержать список ID через запятую.');
            }

            $force = filter_var($assoc_args['force'] ?? false, FILTER_VALIDATE_BOOLEAN);

            $result = wplab_delete_posts_by_ids($ids, $force);

            if (!empty($result['deleted'])) {
                WP_CLI::success('Удалены записи с ID: ' . implode(', ', $result['deleted']));
            }
            if (!empty($result['failed'])) {
                WP_CLI::warning('Не удалось удалить записи с ID: ' . implode(', ', $result['failed']));
            }
        }
    }
    WP_CLI::add_command('wplab delete-posts', 'WPLab_Delete_Posts_Command');
}

Теперь вы можете удалять записи командой вида:

wp wplab delete-posts --ids=12,25,48 --force=true
<

Удаление записей по дополнительным условиям

Иногда нужно удалять записи не по ID, а по определенным условиям, например, по определенному метаполю или дате.

Для этого можно сначала получить ID нужных записей с помощью WP_Query, а затем вызвать функцию удаления по массиву ID.

Пример:

$query = new WP_Query([
    'post_type' => 'post',
    'meta_key' => 'wplab_flag',
    'meta_value' => 'delete',
    'fields' => 'ids',
    'posts_per_page' => -1
]);

if ($query->have_posts()) {
    $ids_to_delete = $query->posts;
    wplab_delete_posts_by_ids($ids_to_delete, true);
}

Такой подход универсален и позволяет интегрировать удаление в любые бизнес-процессы.

Оптимизация скорости WordPress: прокси и кэширование для быстрого сайта
20.05.2025
Установка и настройка WPRemark для автоматического контроля качества контента в WordPress
20.03.2026
Как автоматически удалять отменённые заказы WooCommerce для оптимизации базы данных
07.05.2026
Автоматический откат обновлений WordPress при ошибках: как настроить и реализовать
23.03.2026
Оптимальное использование хуков в WordPress: практические советы и примеры
16.01.2026