web-dev-qa-db-fra.com

Comment forcer Media Manager à écraser les fichiers du même nom?

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?

3
N2Mystic

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);
}
3
Bainternet

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;
}
0
brasofilo