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', '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не підійдуть.

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.0.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 attachment deletion should take place.
	 *
	 * @ Since 5.5.0
	 *
	 * @param WP_Post|false|null $delete Whether to go forward with deletion. @TODO description
	 * @param WP_Post $post Post об'єкт.
	 * @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 `$post` parameter.
	 *
	 * @param int $post_id Attachment ID.
	 * @param WP_Post $post Post об'єкт.
	 */
	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 );
	}

	/** Ця дія міститься в wp-includes/post.php */
	do_action( 'delete_post', $post_id, $post);
	$result = $wpdb->delete( $wpdb->posts, array( 'ID' => $post_id ) );
	if ( ! $result ) {
		return false;
	}
	/** Ця дія міститься в 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;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *