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', 'delete_attachments_with_post' ); function delete_attachments_with_post( $postid ){ $post = get_post( $postid ); // проверим тип записи для которых нужно удалять вложение if( in_array($post->post_type, ['article','question']) ){ $attachments = get_children( array( 'post_type'=>'attachment', 'post_parent'=>$postid ) ); if( $attachments ){ foreach( $attachments as $attachment ) wp_delete_attachment( $attachment->ID ); } } }
Вешаем на хук 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 | Введена. |