根据CPT定制上传目录;删除后,文件不会被删除

时间:2015-10-29 作者:hrsetyono

我有这个密码functions.php 根据其自定义帖子类型(CPT)组织媒体上传。

因此,上载到“产品”CPT的所有图像都将在wp-content/uploads/product 目录

add_filter("upload_dir", function ($args) {
  $id = (isset($_REQUEST["post_id"]) ? $_REQUEST["post_id"] : "");

  if($id) {
    $newdir = "/" . get_post_type($id);

    // remove default dir
    $args["path"] = str_replace( $args["subdir"], "", $args["path"]);
    $args["url"] = str_replace( $args["subdir"], "", $args["url"]);

    // assign new dir
    $args["subdir"] = $newdir;
    $args["path"] .= $newdir; 
    $args["url"] .= $newdir;

    return $args;
  }
});
它工作得很好,除了我删除媒体时,文件仍然存在(数据库条目删除得很好)。

我想我需要filter the media deletion 也是,但似乎找不到正确的方法。是否有人成功设置了此项?

谢谢

EDIT

当帖子类型为时,我尝试添加条件以使用默认文件夹post.

if(get_post_type($id) === "post") {
  return $args;
} else {
  ...
}
删除帖子的媒体也不会删除文件。

2 个回复
最合适的回答,由SO网友:hrsetyono 整理而成

一个小错误return 应该在外面if

add_filter("upload_dir", function ($args) {
  $id = (isset($_REQUEST["post_id"]) ? $_REQUEST["post_id"] : "");

  if($id) {
    $newdir = "/" . get_post_type($id);
    ...
  }

  return $args;
});

SO网友:Claudio Rimann

我们最近在插件中做了一些非常类似的事情。以下是仅当我们的一篇帖子被删除时,我们如何处理媒体删除。

/**
 * Delete all attached media when a product is deleted
 */
function product_delete_attached_media( $post_id ) {

    // If it\'s not a product being deleted, we don\'t want to do anything
    if ( \'product\' != get_post_type( $post_id ) )
        return;

    // Setup the arguments for a custom Query
    $args = array(
        \'post_type\' => \'attachment\', // We want attachments...
        \'posts_per_page\' => -1, // ... all of them ...
        \'post_status\' => \'any\', // ... no matter if public, in trash etc. ...
        \'post_parent\' => $post_id // ... that are a child of the product being deleted here!
    );

    // Make acustom query with those arguments to get those attachments
    $attachments = new WP_Query( $args );

    // Loop through each one of them and delete them
    foreach ( $attachments->posts as $attachment ) {
        if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
            // In here you could output or log something if anything went wrong
        }
    }
}

// We add this function to the "before_delete_post" hook
// which runs before each deletion of a post
add_action( \'before_delete_post\', \'product_delete_attached_media\' );
这些评论应该很好地解释发生了什么。wp\\u delete\\u attachment()函数负责删除媒体文件,并应成功删除文件以及数据库中的条目。

除此之外,我们要做的唯一一件事是,如果我们的插件get被卸载,则删除整个自定义文件夹结构。

此外,我很确定WP\\u查询可以优化,因为如果你有大量的帖子和图片,它可能会变得很慢。

希望这有帮助。

相关推荐

Organizing media uploads

我的一个客户想把他的WordPress网站转移到我的服务器上。问题是他的网站没有在他的上传文件夹中使用子文件夹,而他上传文件夹的根目录中有超过1000000个文件。有没有一种方法可以将他的所有帖子上传到文件夹中,而不会丢失帖子中的附加链接和特色图片?