wp_delete_attachment

Удаляет вложение (прикрепленные файлы).

Хуки из функции:
deleted_post
delete_attachment
delete_post
wp_delete_file
Возвращает

false, если не удалось удалить и данные в случае успешного удаления. Проверку нужно проводить используя оператор сравнения === вместо обычного оператора сравнения ==, потому что функция может вернуть 0 или пустой массив в случае успешного удаления.

Использование

wp_delete_attachment( $attachmentid, $force_delete = false );
$attachmentid(число) (обязательный)
ID вложения, которое вы хотите удалить.
По умолчанию: нет
$force_delete(логический)
true – безвозвратное удаление мимо корзины, если включена корзина (с версии WordPress 2.9).
По умолчанию: 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 ){
	// если нужно проверить тип записи
	// if( get_post()->post_type != 'post_type' ) return;
	$attachments = get_posts( array( 'post_type' => 'attachment', 'posts_per_page' => -1, 'post_status' => '', 'post_parent' => $postid ) );
	if( !$attachments )
		return;

	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 "Медиа файл удален";
}

Заметки

Функция использует хук delete_attachment, в котором передает ID вложения ($postid).

Код из


wp-includes/post.php

WP 4.7.2

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

	if ( !$post = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->posts WHERE ID = %d", $post_id) ) )
		return $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 );

	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() )
		delete_transient( 'dirsize_cache' );

	/**
	 * Fires before an attachment is deleted, at the start of wp_delete_attachment().
	 *
	 * @since 2.0.0
	 *
	 * @param int $post_id Attachment ID.
	 */
	do_action( 'delete_attachment', $post_id );

	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", $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 );
	$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 );

	$uploadpath = wp_get_upload_dir();

	if ( ! empty($meta['thumb']) ) {
		// Don't delete the thumb if another attachment uses it.
		if (! $wpdb->get_row( $wpdb->prepare( "SELECT meta_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attachment_metadata' AND meta_value LIKE %s AND post_id <> %d", '%' . $wpdb->esc_like( $meta['thumb'] ) . '%', $post_id)) ) {
			$thumbfile = str_replace(basename($file), $meta['thumb'], $file);
			/** This filter is documented in wp-includes/functions.php */
			$thumbfile = apply_filters( 'wp_delete_file', $thumbfile );
			@ unlink( path_join($uploadpath['basedir'], $thumbfile) );
		}
	}

	// Remove intermediate and backup images if there are any.
	if ( isset( $meta['sizes'] ) && is_array( $meta['sizes'] ) ) {
		foreach ( $meta['sizes'] as $size => $sizeinfo ) {
			$intermediate_file = str_replace( basename( $file ), $sizeinfo['file'], $file );
			/** This filter is documented in wp-includes/functions.php */
			$intermediate_file = apply_filters( 'wp_delete_file', $intermediate_file );
			@ unlink( path_join( $uploadpath['basedir'], $intermediate_file ) );
		}
	}

	if ( is_array($backup_sizes) ) {
		foreach ( $backup_sizes as $size ) {
			$del_file = path_join( dirname($meta['file']), $size['file'] );
			/** This filter is documented in wp-includes/functions.php */
			$del_file = apply_filters( 'wp_delete_file', $del_file );
			@ unlink( path_join($uploadpath['basedir'], $del_file) );
		}
	}

	wp_delete_file( $file );

	clean_post_cache( $post );

	return $post;
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *