Je sais que certaines fonctions sont déjà disponibles pour cette tâche, mais aucune ne semble fonctionner aussi longtemps que nécessaire.
Le meilleur moyen me semble d’ajouter un filtre àwp_handle_upload_prefilterlike kaiser ne dans cet exemple . Malheureusement, le fichier n’obtient le titre-post-parent que si la publication est déjà enregistrée dans la base de données.
Une autre approche consiste à ajouter une fonction àadd_attachmentcomme Ijaas fait ici . Ensuite, le fichier reçoit le nom du post-titre parent, mais aucune vignette n'est créée. Et ma tentative en utilisant wp_generate_attachment_metadata (); pour créer les tailles d'image manquantes, terminées par une boucle infinie (probablement parce que je ne l'utilise pas correctement, mais maintenant, je suis un peu effrayé par cette fonction).
Ce serait bien s'il y avait un moyen de passer le titre àwp_handle_upload_prefiltermême si le message n'est pas encore enregistré.
Oh, au fait, c’est ma fonction sans fin, peut-être que quelqu'un pourra me dire ce qui ne va pas.N'UTILISEZ PAS CETTE FONCTION !!!
add_action('add_attachment', 'fkp_rename_attacment');
function fkp_rename_attacment($post_ID){
$post = get_post($post_ID);
$file = get_attached_file($post_ID);
$path = pathinfo($file);
$parent = get_post($post->post_parent);
$p_author = get_the_author_meta( 'display_name', $parent->post_author );
$p_author_san = sanitize_title($p_author);
$newfilename = $parent->post_name . '-' . $p_author_san . '-' . $post_ID;
$newfile = $path['dirname']."/".$newfilename.".".$path['extension'];
rename($file, $newfile);
$wp_filetype = wp_check_filetype(basename($newfile), null );
$wp_upload_dir = wp_upload_dir();
$attachment = array(
'guid' => $wp_upload_dir['url'] . '/' . basename( $newfile ),
'post_mime_type' => $wp_filetype['type'],
'post_title' => preg_replace('/\.[^.]+$/', '', basename($newfile)),
'post_content' => '',
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $newfile, $parent->ID );
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attach_data = wp_generate_attachment_metadata( $attach_id, $newfile );
wp_update_attachment_metadata( $attach_id, $attach_data );
}
N'UTILISEZ PAS CETTE FONCTION !!!
Après avoir essayé d’ajouter une fonction à publish_post
et créé beaucoup de fichiers inutiles, j’ai essayé d’endommager kaisers function pour répondre à mes besoins.
function modify_uploaded_file_names( $image ) {
// Use part of the post or user object to rename the image
get_currentuserinfo();
global $post, $current_user;
// only do this if we got the post id,
// otherwise they're probably in the media section
// rather than uploading an image from a post
if ( isset( $_REQUEST['post_id'] ) ) {
// get the ID
$post_id = absint( $_REQUEST['post_id'] );
// get the post OBJECT
$post_obj = get_post( $post_id );
// get the post slug
$post_slug = sanitize_title($post_obj->post_title);
// get the author
$author = sanitize_title( get_the_author_meta( 'display_name', $post_obj->post_author ) );
switch( $image['type'] ) {
case 'image/jpeg' :
$suffix = 'jpg';
break;
case 'image/png' :
$suffix = 'png';
break;
case 'image/gif' :
$suffix = 'gif';
break;
}
// if we found a slug
if ( $post_slug )
$image['name'] = "{$author}-{$post_slug}-{$random_number}.{$suffix}";
}
else {
$image_name = str_place( ' ', '-', strtolower( $current_user->data->user_nicename ) );
$image['name'] = $image_name . '-' . $file['name'];
}
return $image;
}
// Only one arg, so 4th attr not needed - Priority set to later 20
add_filter( 'wp_handle_upload_prefilter', 'my_modify_uploaded_file_names', 20 );
Il n'y a que quelques petits changements
$post_obj->post_name
remplacé par sanitize_title($post_obj->post_title)
puisque post_name uniquement était présent dans mes tests lorsque la publication était déjà enregistrée.wp_handle_upload
utilise wp_unique_filename () anyway.