wp_delete_attachment

时间:2015-05-12 作者:Luis

Im正在尝试使用before\\u delete\\u post挂钩删除帖子删除时自定义帖子类型的所有附件。

它工作正常,但如果我添加另一个函数来覆盖上传目录,它不会删除文件。

以下是正在使用的代码:

function set_upload_dir( $args ) {
    $id = ( isset( $_REQUEST[\'post_id\'] ) ? $_REQUEST[\'post_id\'] : \'\' );
    if( $id ) {
       $newdir = \'/\' . get_post_type( $id );
       $args[\'path\']    = str_replace( $args[\'subdir\'], \'\', $args[\'path\'] );
       $args[\'url\']     = str_replace( $args[\'subdir\'], \'\', $args[\'url\'] );
       $args[\'subdir\']  = $newdir;
       $args[\'path\']   .= $newdir;
       $args[\'url\']    .= $newdir;
       return $args;
   }
}
add_filter( \'upload_dir\', \'set_upload_dir\' );


function delete_post_media($post_id) {
    //if (\'galleries\' != get_post_type($id)) return;
    $attachments = get_attached_media( \'\', $post->ID );
    foreach ( $attachments as $attachment ) {
        if ( false === wp_delete_attachment( $attachment->ID, true ) ) {
        }
    }
}
add_action(\'before_delete_post\', \' delete_post_media\');
add_action(\'wp_trash_post\', \'delete_post_media\');
你有什么想法吗?

提前谢谢。

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

请尝试以下操作:

将当前上载筛选器替换为以下筛选器创建新的自定义帖子并上载一些文件检查文件是否已移动到正确的上载文件夹删除自定义帖子,然后检查文件是否已删除新建上载筛选器功能:

function set_upload_dir( $args ) {
    if ( ! empty( $_REQUEST[\'post_id\'] ) && $post_id = absint( $_REQUEST[\'post_id\'] ) ) {
        if ( $post = get_post( $post_id ) ) {               
            if ( $post->post_type !== \'attachment\' ) {
                $args[\'subdir\'] = "/$post->post_type"; // Must be preceded with slash
                $args[\'path\']   = $args[\'basedir\'] . $args[\'subdir\'];
                $args[\'url\']    = $args[\'baseurl\'] . $args[\'subdir\'];
            }
        }
    }

    return $args;
}
这与您的主要区别在于:

我们积极检查帖子的上下文(post_id) 是有效的,并且它本身不是附件。请记住,此过滤器在任何地方都会被调用,而不仅仅是在上载图像时basedir 和baseurl 参数而不是字符串替换。否则,路径可能会以双斜杠结束(甚至丢失)上传图像后subdir 存储在数据库中,WordPress只会使用basedir 尝试检索文件路径时。

换句话说,如果wp_upload_dir 为上下文外的自定义post类型附件调用,并返回subdir 不是文件实际所在的位置。

结束