WordPress как на ладони
Мощный и не дорогой хостинг от Fornex.com Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

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 5.0

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

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

	clean_post_cache( $post );

	return $post;
}

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

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

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

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

    Ответить4.5 года назад #
    • Kama7099

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

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

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

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

          А если в htaccess

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

          поможет?

          Ответить1.2 год назад #
Здравствуйте, !     Войти . Зарегистрироваться