Подтвердить что ты не робот

Сделать Wordpress wp_delete_attachment удалять файлы из предопределенной пользовательской папки

Мы создали пользовательский тип сообщения, который позволяет нашему клиенту загружать файлы в папку вне стандартной папки для загрузки Wordpress (wp-content/upload-assets). Эти файлы должны обрабатываться отдельно от стандартной папки wp-content/uploads, поэтому мы НЕ МОЖЕМ использовать

define( 'UPLOADS', 'mycustomfolder' );

в wp-config.php.

Вместо этого мы используем это, чтобы временно изменить папку uploads на wp-content/upload-assets:

add_filter('upload_dir', 'my_upload_dir');
$uploaded_file = wp_handle_upload($_FILES['xxxx_image'], $upload_overrides);
remove_filter('upload_dir', 'my_upload_dir');

Мы используем это, чтобы удалить все вложения из определенного сообщения:

add_filter('upload_dir', 'my_upload_dir');
$attachments = get_posts( array(
            'post_type'      => 'attachment',
            'posts_per_page' => -1,
            'post_status'    => 'any',
            'post_parent'    => $pid
) );

foreach ( $attachments as $attachment ) {
   if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
      echo 'Attachment could not be deleted.';
   }
}
remove_filter('upload_dir', 'my_upload_dir');

wp_delete_attachment также должен удалить все связанные файлы с диска, но он не работает, потому что наши файлы находятся в нашей настраиваемой папке (wp-content/upload-assets).

Вот код нашей функции my_upload_dir:

function my_upload_dir($upload) {
    $upload['subdir']   = '';
    $upload['basedir']  = WP_CONTENT_DIR;
    $upload['baseurl']  = WP_CONTENT_URL;
    $upload['path']     = $upload['basedir'] . '/upload-assets';
    $upload['url']      = $upload['baseurl'] . '/upload-assets';
    return $upload;
}

Как заставить wp_delete_attachment удалять файлы в нашей пользовательской папке wp-content/upload-assets?

4b9b3361

Ответ 1

Привет Вы можете сделать это, если хотите удалить файл, но он не удалит все почтовые метаполя, таксономия, комментарии и т.д., связанные с вложением.

Надеемся на эту помощь

foreach ( $attachments as $attachment ) {
  if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
    $file = get_attached_file( $attachment->ID );
    $file = str_replace( "uploads", "upload-assets", $file);
     wp_delete_file( $file );
   }
 }

Я не тестировал этот код, но надеюсь, что он должен работать

Ответ 2

Оставаясь в области текущего вопроса, вы можете использовать фильтр "get_attached_file", чтобы напрямую изменить строку пути к файлу, используемую для захвата пути файла, который нужно удалить. В частности, добавьте эту функцию в свои функции. Php

function sr_update_uploads_directory( $file )
{
    return str_replace( "uploads", "upload-assets", $file) // Change path to upload-assets from uploads
}
add_filter( 'get_attached_file', 'sr_update_uploads_directory' );

У нас нет времени для тестирования. Поэтому, пожалуйста, извините меня за это. Надеюсь, поможет.:)