J'ai un widget qui fonctionne avec mon thème et qui attend des images nommées d'une certaine manière, slide1.png, slide2.png, etc.
Toutefois, lorsque l'utilisateur télécharge ses propres images, nommées slide1.png, slide2.png, etc. dans la médiathèque, plutôt que de mettre à jour les images avec les nouvelles, WordPress change les noms des images de remplacement en slide11.png, slide22. png, etc
Puis-je définir un filtre dans les options de thème qui indique à WP de remplacer les images existantes sans modifier les noms de fichier?
Voici quelque chose que j'ai concocté et qui provient principalement du plugin Overwrite Uploads
mais sans le matériel supplémentaire
add_filter('wp_handle_upload_overrides','noneUniqueFilename');
function noneUniqueFilename($overrides){
$overrides['test_form'] = false;
$overrides['unique_filename_callback'] = 'nonUniqueFilenameCallback';
return $overrides;
}
function nonUniqueFilenameCallback($directory, $name, $extension){
$filename = $name . strtolower($extension);
//remove old attachment
removeOldAttach($filename);
return $filename;
}
function removeOldAttach($filename){
$arguments = array(
'numberposts' => -1,
'meta_key' => '_wp_attached_file',
'meta_value' => $filename,
'post_type' => 'attachment'
);
$Attachments_to_remove = get_posts($arguments);
foreach($Attachments_to_remove as $a)
wp_delete_attachment($a->ID, true);
}
J'ai réussi à faire en sorte que cela fonctionne avec un peu de Answer de @Bainternet sans pirater le coeur.
Cette autre Q & A a également été utile: query_posts: comment afficher tous les 'meta_value' contenant un mot spécifique?
La fonction wp_unique_filename
a le filtre sanitize_file_name
juste au début, afin que nous puissions y accrocher et faire la vérification et la suppression de la pièce jointe en double.
J'ai fait des tests de base chez localhost, testez-le soigneusement avant de postuler sur un site actif.
add_filter( 'sanitize_file_name', 'filename_filter_wpse_28439', 10, 1 );
function filename_filter_wpse_28439( $name )
{
$args = array(
'numberposts' => -1,
'post_type' => 'attachment',
'meta_query' => array(
array(
'key' => '_wp_attached_file',
'value' => $name,
'compare' => 'LIKE'
)
)
);
$attachments_to_remove = get_posts( $args );
foreach( $attachments_to_remove as $attach )
wp_delete_attachment( $attach->ID, true );
return $name;
}