wp_delete_attachment()
Удаляет вложение WordPress (файл медиатеки, прикрепленный файл). Файл удаляется физически.
Эта функция делает то же самое, как если бы вы зашли в Медиатеку и удалили картинку (вложение).
Эта функция не проверяет используются ли удаляемые вложения на сайте (где-то в контенте). Так, если удалить вложение, а оно используется в контенте записи, то ссылка на эту картинку станет битой в контенте записи.
Удаляет:
- Запись из таблицы wp_posts.
- Связанные метаданные.
- Связи с таксономиями (рубриками, метками, произвольными таксами) (если они есть).
- Связанные комментарии (если они есть).
- Файлы связанные с вложением (оригинал, миниатюры).
Хуки из функции
Возвращает
WP_Post|false|null
. false при неудачном удалении. Данные вложения при удалении.
Проверку нужно проводить используя оператор сравнения ===
, а не ==
, потому что функция может вернуть 0 или пустой массив в случае успешного удаления.
Использование
wp_delete_attachment( $attachment_id, $force_delete );
- $attachment_id(число) (обязательный)
- ID вложения, которое вы хотите удалить.
- $force_delete(логический)
true - безвозвратное удаление мимо корзины, если включена корзина.
При
$force_delete = false
- вложения перемещаются в корзину, хотя по умолчанию в медиатеке нет кнопки для доступа к корзине - это может сбить с толку. Также, файлы вложений (физические файлы вwp-content/uploads
) сохраняются как есть.При
$force_delete = true
- файлы вложений (физические файлы вwp-content/uploads
) будут удалены.По умолчанию: false
Примеры
#1 Удаление вложения
Безвозвратно удалим вложение с ID 54:
wp_delete_attachment( 54, true );
#2 Удалим все вложения поста (прикрепленные файлы), вместе с удалением записи
На некоторых блогах удобно сделать так, чтобы при удалении записи (поста), вместе с ней удалялись бы и все прикрепленные к ней медиафайлы. Сделать это можно так:
// Удаляет все вложения поста (прилагаемые медиафайлы) вместе с постом(ами) add_action( 'before_delete_post', 'wpkama_delete_attaches_with_post' ); function wpkama_delete_attaches_with_post( $post_id ) { $post = get_post( $post_id ); $post_types = [ 'article', 'question' ]; // удалять вложения только для этих типов постов if( ! $post || ! in_array( $post->post_type, $post_types ) ){ return; } $attaches = get_children( [ 'post_type' => 'attachment', 'post_parent' => $post_id, ] ); if( ! $attaches ){ return; } foreach( $attaches as $attach ){ wp_delete_attachment( $attach->ID, true ); } }
Вешаем на хук before_delete_post
, потому что при удалении поста, все вложения принимают статус не прикрепленные, т.е. значение post_parent удаляется, а по ним идет отбор вложений поста. Значит хуки delete_post
и after_delete_post
не подойдут.
#3 Удаление медиафайла с проверкой
Удалим вложение и проверим действительно ли указанный медиафайл был удален:
if( false === wp_delete_attachment( 54, true ) ){ echo "Не удалось удалить медиа файл"; } else { echo "Медиа файл удален"; }
Заметки
- Global. wpdb. $wpdb WordPress database abstraction object.
Список изменений
С версии 2.0.0 | Введена. |