В процессе работы с 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);
}Такой подход универсален и позволяет интегрировать удаление в любые бизнес-процессы.