WordPress как на ладони
wordpress jino

wp_delete_attachment() WP 2.0

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

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

flase/WP_Post. 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 ){
	$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 "Медиа файл удален";
}

Код wp delete attachment: wp-includes/post.php VER 4.9.1

<?php
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 );
	}

	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;
}

Cвязанные функции

Из раздела: Вложения (media файлы)

wp_delete_attachment 4 комментария
  • Алексей cайт: wordpress-go.ru @

    Та же беда что и у Александра. Гугл бот постоянно берёт в индекс attachment страницы, как сделать чтоб их не было? Устал уже удалять такие "кривые" страницы из вебмастера гугла

    Ответить3.5 года назад #
    • Kama4697

      В robots.txt пробовали прописать?

      Ответить3.5 года назад #
      • Алексей cайт: wordpress-go.ru @

        Конечно, в разных вариациях. Но уже давно известно : гуглу боту всё равно на роботс, он всё берёт в индекс. А там уже отсеивает. Основной индекс,мусорный.. Несколько дней назад поставил два плагина : Noindex Attachment Pages и WP Relevant Pages, надеюсь что они хоть как то исправят ситуацию с мусорными ссылками.

        2
        Ответить3.5 года назад #
        • Михаил cайт: trapeznaya.ucoz.ru @

          А если в htaccess

          RewriteRule (.+)/attachment /$1 [R=301,L]
          RewriteCond %{QUERY_STRING} ^attachment_id= [NC]
          RewriteRule (.*) $1? [R=301,L]

          поможет?

          Ответить3 месяца назад #

Здравствуйте, !

Ваш комментарий