Вопрос или проблема
У меня есть пользовательский тип записи под названием “встречи”, и я хотел бы массово удалить все записи и все их прикрепленные изображения…
Можно ли это сделать с помощью wp-cli?
Спасибо!
Для этого вы можете использовать wp post list и передать вывод в wp post meta delete с помощью xargs
.
Вот пример команды для удаления избранных изображений в типе записи meetings
:
wp post list --post_type= meetings --fields=ID --format=csv | xargs -I % wp post meta delete % _thumbnail_id
Вы можете использовать wp post meta list для записи, чтобы получить названия полей, которые вы хотите удалить, и соответственно изменить команду выше.
Я знаю, что вы спрашивали, как сделать это через wpCLI, но вы можете просто запустить функцию для этого:
add_action( 'before_delete_post', 'delete_all_attached_media' );
function delete_all_attached_media( $post_id ) {
if( get_post_type($post_id) == "meetings" ) {
$attachments = get_attached_media( '', $post_id );
foreach ($attachments as $attachment) {
wp_delete_attachment( $attachment->ID, 'true' );
}
}
}
Добавьте эту функцию в ваш functions.php, а затем, когда вы в админке, выберите все свои типы записи “встречи” и удалите. Когда вы очистите корзину, эта функция сработает и удалит все прикрепленные файлы, связанные с удаляемыми записями.
Ответ или решение
Чтобы массово удалить пользовательский тип записей "meetings" и все его вложения с помощью WP-CLI, вам понадобятся несколько команд, которые вы можете выполнить непосредственно из командной строки. Давайте разберем этот процесс шаг за шагом.
Шаг 1: Подготовка к удалению
Перед тем как приступить к удалению, настоятельно рекомендуется сделать резервное копирование вашей базы данных. Это позволит вам восстановить данные в случае, если что-то пойдет не так.
Шаг 2: Удаление вложений (attachments)
Вам нужно сначала удалить все вложения, ассоциированные с постами пользовательского типа записей "meetings". Для этого вы можете использовать следующие команды:
-
Удаление постов
meetings
и их вложенийИспользуйте следующую команду для получения списка всех постов с типом
meetings
и удаления каждого вложения.wp post list --post_type=meetings --fields=ID --format=ids | xargs -I % sh -c 'wp post list --post_type=attachment --post_parent=% --fields=ID --format=ids | xargs wp delete --force; wp delete % --force'
Объяснение команды:
wp post list --post_type=meetings --fields=ID --format=ids
— Эта команда получает все идентификаторы постов типаmeetings
.xargs -I % sh -c '...'
— Здесь каждая запись из предыдущей команды подставляется вместо знака%
.- Внутри фигурных скобок мы сначала получаем все вложения для каждого поста (
wp post list --post_type=attachment --post_parent=% --fields=ID --format=ids
) и удаляем их с помощьюwp delete --force
, а затем сам пост тоже удаляем.
Шаг 3: Подтверждение удаления
После выполнения команд убедитесь, что все посты и вложения были успешно удалены. Вы можете использовать следующую команду для проверки:
wp post list --post_type=meetings --fields=ID
Если список пуст, значит, все посты были успешно удалены.
Дополнительные советы
-
Проверка наличия вложений: Перед удалением вложений, вы можете просмотреть их, используя команду:
wp post list --post_type=attachment --post_parent=<ID_поста>
-
Удаление постов с определенными атрибутами: Если вам нужно удалить посты на основе определенных метаданных, вы можете добавить дополнительные фильтры в команду
wp post list
. -
Автоматизация: Чтобы обеспечить автоматизацию при удалении вложений (например, при удалении постов через панель администратора), вы можете воспользоваться функцией, добавив код в
functions.php
вашей темы, как показано в примерах.
Заключение
Использование WP-CLI для массового удаления пользовательских записей и их вложений предоставляет удобный и мощный инструмент для управления содержимым сайта на WordPress. С помощью указанных выше команд вы сможете эффективно и безопасно провести необходимые операции.