質問: slug(またはid、filetype、または作成者)でuploadsフォルダを整理する方法はありますか すべての添付ファイル(メディア)を各投稿のタイトルの付いたフォルダに保存します。例:/wp-content/uploads/my-post-about-stuff/フォルダには、その投稿に添付されているすべてのメディアが含まれているはずです。それは可能ですか?
回答: 免責事項 への道をたどる - 同じことをする post_idを使う すでに答えている 一つの質問 pdfを他の部分から切り離すことについて 見つかった 質問を分散させる について この件 これを公開する場としてこのqを採用することにしました。 コメント内の指示 に従ってください。このコードはpost_name(別名:slug)、post_author、post_id、またはメディアタイプによってアップロードフォルダを整理するように調整できます。add_filter('wp_handle_upload_prefilter', 'wpse_25894_handle_upload_prefilter'); add_filter('wp_handle_upload', 'wpse_25894_handle_upload'); function wpse_25894_handle_upload_prefilter( $file ) { add_filter('upload_dir', 'wpse_25894_custom_upload_dir'); return $file; } function wpse_25894_handle_upload( $fileinfo ) { remove_filter('upload_dir', 'wpse_25894_custom_upload_dir'); return $fileinfo; } function wpse_25894_custom_upload_dir($path) { /* * determines if uploading from inside a post/page/cpt - if not, default upload folder is used */ $use_default_dir = ( isset($_request['post_id'] ) && $_request['post_id'] == 0 ) ? true : false; if( !empty( $path['error'] ) || $use_default_dir ) return $path; //error or uploading not from a post/page/cpt /* * save uploads in id based folders * */ /* $customdir = '/' . $_request['post_id']; */ /* * save uploads in slug based folders * */ $the_post = get_post($_request['post_id']); $customdir = '/' . $the_post->post_name; /* * save uploads in author based folders * * attention, caution required: * this one may have security implications as you will be exposing the user names in the media paths * here, the *display_name* is being used, but normally it is the same as *user_login* * * the right thing to do would be making the first/last name mandatories * and use: * $customdir = '/' . $the_author->first_name . $the_author->last_name; * */ /* $the_post = get_post($_request['post_id']); $the_author = get_user_by('id', $the_post->post_author); $customdir = '/' . $the_author->data->display_name; */ /* * save uploads in filetype based folders * when using this method, you may want to change the check for $use_default_dir * */ /* $extension = substr( strrchr( $_post['name'], '.' ), 1 ); switch( $extension ) { case 'jpg': case 'png': case 'gif': $customdir = '/images'; break; case 'mp4': case 'm4v': $customdir = '/videos'; break; case 'txt': case 'doc': case 'pdf': $customdir = '/documents'; break; default: $customdir = '/others'; break; } */ $path['path'] = str_replace($path['subdir'], '', $path['path']); //remove default subdir (year/month) $path['url'] = str_replace($path['subdir'], '', $path['url']); $path['subdir'] = $customdir; $path['path'] .= $customdir; $path['url'] .= $customdir; return $path; }