使Wordpress wp_delete_attachment从预定义的自定义文件夹中删除文件

20

我们创建了一个自定义文章类型,允许客户将文件上传到标准WordPress上传文件夹(wp-content/upload-assets)之外的文件夹中。这些文件需要与标准的wp-content/uploads文件夹分开处理,这就是为什么我们不能使用

define( 'UPLOADS', 'mycustomfolder' );

在 wp-config.php 文件中。

相反,我们使用这个方法暂时将上传文件夹更改为 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文件夹中的文件?


首先请查看附件指南是否确实在自定义文件夹中。 - Stubbies
@Ervald - 是的。绝对在自定义文件夹中! - Richard Tinkler
你是否拥有与默认权限相同的文件夹访问权限? - Stubbies
@Ervald - 是的。我可以使用unlink手动删除,所以权限没问题。 - Richard Tinkler
你也遇到了同样的问题吗?你找到解决方案了吗? - Swen
2个回答

6

您好,如果想要删除文件,可以按照以下方式进行操作,但这不会删除与附件相关的所有文章元数据字段、分类法、评论等。

希望这能帮到您。

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

我还没有测试过这段代码,但我希望它能够正常工作。

3

在当前问题的领域中,您可以使用“get_attached_file”过滤器直接更改用于获取要删除的文件路径的文件路径字符串。具体来说,请将此函数添加到您的functions.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' );

目前没有时间进行测试,请谅解。希望这能有所帮助。:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接