WordPress как на ладони
rgbcode is looking for WordPress developers. eurobyte.ru - мощные сервера с Дата-центрами в Нидерландах и Москве. От 159 ₽/мес.

wp_delete_attachment()WP 2.0.0

Удаляет вложение WordPress (файл медиатеки, прикрепленный файл). Файл удаляется физически.

Эта функция делает то же самое, как если бы вы зашли в Медиатеку и удалили картинку (вложение).

Эта функция не проверяет используются ли удаляемые вложения на сайте (где-то в контенте). Так, если удалить вложение, а оно используется в контенте записи, то ссылка на эту картинку станет битой в контенте записи.

Удаляет:

  • Запись из таблицы wp_posts.
  • Связанные метаданные.
  • Связи с таксономиями (рубриками, метками, произвольными таксами) (если они есть).
  • Связанные комментарии (если они есть).
  • Файлы связанные с вложением (оригинал, миниатюры).
Работает на основе: wp_delete_attachment_files()

Возвращает

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

Примеры

0

#1 Удаление вложения

Безвозвратно удалим вложение с ID 54:

wp_delete_attachment( 54, true );
0

#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 не подойдут.

0

#3 Удаление медиафайла с проверкой

Удалим вложение и проверим действительно ли указанный медиафайл был удален:

if( false === wp_delete_attachment( 54, true ) ){
	 echo "Не удалось удалить медиа файл";
} else {
	 echo "Медиа файл удален";
}

Заметки

  • Global. wpdb. $wpdb WordPress database abstraction object.

Список изменений

С версии 2.0.0 Введена.

Код wp_delete_attachment() WP 6.6.2

function wp_delete_attachment( $post_id, $force_delete = false ) {
	global $wpdb;

	$post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d", $post_id ) );

	if ( ! $post ) {
		return $post;
	}

	$post = get_post( $post );

	if ( 'attachment' !== $post->post_type ) {
		return false;
	}

	if ( ! $force_delete && EMPTY_TRASH_DAYS && MEDIA_TRASH && 'trash' !== $post->post_status ) {
		return wp_trash_post( $post_id );
	}

	/**
	 * Filters whether an attachment deletion should take place.
	 *
	 * @since 5.5.0
	 *
	 * @param WP_Post|false|null $delete       Whether to go forward with deletion.
	 * @param WP_Post            $post         Post object.
	 * @param bool               $force_delete Whether to bypass the Trash.
	 */
	$check = apply_filters( 'pre_delete_attachment', null, $post, $force_delete );
	if ( null !== $check ) {
		return $check;
	}

	delete_post_meta( $post_id, '_wp_trash_meta_status' );
	delete_post_meta( $post_id, '_wp_trash_meta_time' );

	$meta         = wp_get_attachment_metadata( $post_id );
	$backup_sizes = get_post_meta( $post->ID, '_wp_attachment_backup_sizes', true );
	$file         = get_attached_file( $post_id );

	if ( is_multisite() && is_string( $file ) && ! empty( $file ) ) {
		clean_dirsize_cache( $file );
	}

	/**
	 * Fires before an attachment is deleted, at the start of wp_delete_attachment().
	 *
	 * @since 2.0.0
	 * @since 5.5.0 Added the `$post` parameter.
	 *
	 * @param int     $post_id Attachment ID.
	 * @param WP_Post $post    Post object.
	 */
	do_action( 'delete_attachment', $post_id, $post );

	wp_delete_object_term_relationships( $post_id, array( 'category', 'post_tag' ) );
	wp_delete_object_term_relationships( $post_id, get_object_taxonomies( $post->post_type ) );

	// Delete all for any posts.
	delete_metadata( 'post', null, '_thumbnail_id', $post_id, true );

	wp_defer_comment_counting( true );

	$comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d ORDER BY comment_ID DESC", $post_id ) );
	foreach ( $comment_ids as $comment_id ) {
		wp_delete_comment( $comment_id, true );
	}

	wp_defer_comment_counting( false );

	$post_meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE post_id = %d ", $post_id ) );
	foreach ( $post_meta_ids as $mid ) {
		delete_metadata_by_mid( 'post', $mid );
	}

	/** This action is documented in wp-includes/post.php */
	do_action( 'delete_post', $post_id, $post );
	$result = $wpdb->delete( $wpdb->posts, array( 'ID' => $post_id ) );
	if ( ! $result ) {
		return false;
	}
	/** This action is documented in wp-includes/post.php */
	do_action( 'deleted_post', $post_id, $post );

	wp_delete_attachment_files( $post_id, $meta, $backup_sizes, $file );

	clean_post_cache( $post );

	return $post;
}
4 комментария
    Войти