Je souhaite stocker toutes les pièces jointes (supports) dans des dossiers nommés avec chaque titre de publication.
Exemple: /wp-content/uploads/my-post-about-stuff/
Le dossier doit contenir tous les médias attachés à ce message.
Est-ce possible?
post_id
Suivez les instructions dans les commentaires. Ce code peut être adapté pour organiser le dossier de téléchargement par post_name
(ou slug), post_author
, post_id
ou par type de support.
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;
}
Le plugin Custom Upload Dir a cette capacité:
[avec] Custom Upload Dir [...], vous pouvez créer des chemins à partir de variables telles que le titre, la catégorie, l'auteur, la date et bien d'autres.
:: Captures d'écran: :
Pour notre page Web interne, nous avons utilisé le code à partir d’ici et lui avons fait utiliser le parent de niveau supérieur si le téléchargement provient d’une page. Comme il est interne, le nom d'utilisateur est visible. Cela nous a permis de séparer les téléchargements en les rapprochant des départements.
function wpse_25894_custom_upload_dir( $path ) {
/*
* Determine if uploading from inside a page - if not, use the username
*/
if ( ( strpos( $_SERVER['HTTP_REFERER'], 'wp-admin/upload' ) !== false ) ||
( strpos( $_SERVER['HTTP_REFERER'], 'wp-admin/media-new' ) !== false ) )
{
$current_user = wp_get_current_user();
$customdir = '/' . $current_user->user_login;
} else {
$post = get_post( $_REQUEST['post_id'] );
/*
* If there is a parent page, then get the hierarchy array,
* reverse it and use the first one to get the top level parent
*/
if ( $post->post_parent ) {
$parent = array_reverse( get_post_ancestors( $post->ID ) );
$first_parent = get_page( $parent[0] );
$customdir = '/' . $first_parent->post_name;
}
/*
* Check if it is not a page (post or attachment page)
* If it is, then use the username
*/
elseif (strcmp ( 'page', $page->type ) == false ) {
$current_user = wp_get_current_user();
$customdir = '/' . $current_user->user_login;
}
/*
* Otherwise it is a top level parent page and just use the page name
*/
else {
$the_post = get_post( $_REQUEST['post_id'] );
$customdir = '/' . $the_post->post_name;
}
}
// Format the variables into a useable path
$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;
}