Вопрос или проблема
Я хочу удалить все записи из специального типа записей “TV-Serie”. Общее количество записей этого типа составляет 150 000. Более того, когда я пытаюсь удалить их все вручную, выбирая более 500 записей за раз, это приводит к “ошибке превышения времени ожидания”.
Есть идеи, как удалить их все?
Несколько методов или подходов, которые вы можете использовать для удаления всех записей из специального типа записей.
1 Используйте WP-CLI (интерфейс командной строки WordPress)
Если у вас есть доступ к WP-CLI, вы можете использовать следующую команду для удаления всех записей из вашего специального типа записей.
wp post delete $(wp post list --post_type=your_custom_post_type --format=ids)
Замените your_custom_post_type
на слаг вашего специального типа записей. Эта команда перечислит все идентификаторы записей указанного типа, а затем удалит их по одному.
2 Удаление записей программно партиями
Для программного удаления записей в WP вы можете написать пользовательский скрипт для удаления записей партиями.
Добавьте код в файл functions.php
вашей темы или в пользовательский плагин
function delete_posts_in_batches() {
$post_type="your_custom_post_type";
$args = array(
'post_type' => $post_type,
'posts_per_page' => 500, // Настройте количество записей для удаления за партию
'fields' => 'ids', // Получите только идентификаторы записей для повышения производительности
);
$posts = get_posts($args);
if ($posts) {
foreach ($posts as $post_id) {
wp_delete_post($post_id, true); // Установите второй параметр в true для принудительного удаления
}
}
}
// Вызовите функцию, чтобы начать удаление записей
delete_posts_in_batches();
Вы можете поместить этот код в файл functions.php вашей темы или в пользовательский плагин. Настройте параметр ‘posts_per_page’ в зависимости от возможностей вашего сервера, чтобы избежать ошибок превышения времени ожидания.
3 Увеличение времени ожидания сервера
Вы можете попробовать увеличить максимальное время выполнения и лимит памяти, чтобы предотвратить ошибки превышения времени ожидания во время процесса удаления.
Ответ или решение
Удаление больших объемов постов из пользовательского типа записи в WordPress, особенно когда речь идет о таком количестве, как 150,000 записей, может стать настоящим испытанием. Приведем несколько методов, которые помогут эффективно решить эту задачу.
1. Использование WP-CLI
Если у вас есть доступ к WP-CLI (интерфейсу командной строки WordPress), это самый простой и эффективный способ удаления постов. WP-CLI обеспечивает выполнение команд, которым не требуется загрузка всей системы WordPress.
Для удаления всех постов из пользовательского типа "TV-Serie" выполните следующую команду в терминале:
wp post delete $(wp post list --post_type=tv-serie --format=ids)
Здесь tv-serie
– это слаг вашего пользовательского типа записи. Эта команда сначала получает все идентификаторы постов указанного типа, а затем удаляет их.
2. Программное удаление постов пакетами
Если у вас нет доступа к WP-CLI, можно удалить посты программно, используя PHP. Это требует написания небольшого кода, который будет обрабатывать удаление записей пакетами, чтобы избежать ошибок таймаута.
Вы можете добавить следующий код в файл functions.php
вашей темы или в специальный плагин:
function delete_posts_in_batches() {
$post_type = "tv-serie"; // Замените на ваш пользовательский тип записи
$args = array(
'post_type' => $post_type,
'posts_per_page' => 500, // Настроить число постов для удаления за раз
'fields' => 'ids', // Получать только ID постов для повышения производительности
);
$posts = get_posts($args);
if ($posts) {
foreach ($posts as $post_id) {
wp_delete_post($post_id, true); // Второй параметр true для принудительного удаления
}
// Повторный вызов функции, если еще есть посты для удаления
delete_posts_in_batches();
}
}
// Вызов функции для начала удаления постов
delete_posts_in_batches();
Этот способ позволяет вам контролировать количество удаляемых постов за раз, что снизит вероятность превышения времени выполнения скрипта.
3. Увеличение времени таймаута
Если вы все же сталкиваетесь с таймаутами, имеет смысл увеличить максимальное время выполнения скриптов и лимит памяти. Это можно сделать, добавив следующую строку в файл wp-config.php
:
set_time_limit(300); // Установите время выполнения на 5 минут (300 секунд)
ini_set('memory_limit', '512M'); // Увеличьте лимит памяти до 512MB или больше
Заключение
Используйте предложенные методы для удаления постов из пользовательского типа "TV-Serie". Важно также перед началом удаления сделать резервную копию базы данных, чтобы избежать потери данных. Правильный подход обеспечит успешное выполнение операции без лишних затрат времени и ресурсов.