我有这个密码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 {
...
}
删除帖子的媒体也不会删除文件。
最合适的回答,由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查询可以优化,因为如果你有大量的帖子和图片,它可能会变得很慢。
希望这有帮助。