web-dev-qa-db-fra.com

Enregistrement du nom de fichier pré-désinfecté d'une pièce jointe en tant que titre ou légende

J'ai essayé pas mal de recherches, mais rien n'a encore été obtenu. J'ai un client qui doit télécharger beaucoup d'images dans des galeries et pour gagner du temps, il enregistre les légendes sous le nom de fichier lorsqu'il est dans Photoshop. Personnellement, je préférerais le faire dans WP, mais c’est le flux de travail qu’il a et qui ne bouge pas!

Existe-t-il un moyen de récupérer le nom de fichier pré-assaini et de l'enregistrer en tant que métadonnées?

J'ai regardé wp_handle_upload_prefilter mais cela ne correspond pas au bon point d'après ce que je peux voir.

4
Tom G

Malheureusement, wp_handle_upload_prefilter hook ne reconnaît pas encore d'ID de pièce jointe. Il est trop tôt et exécute le nom de fichier pré-assaini (avant de déplacer la pièce jointe et de la stocker sous forme de publication)

La logique

Ce que vous pouvez faire, c'est utiliser ce hook wp_handle_upload_prefilter mais stocker à la place un transitoire de courte durée contenant le nom de fichier pré-assaini.

Une fois la pièce jointe ajoutée, nous pouvons vérifier cela avec add_attachment() hook. Vous pouvez mettre à jour le titre, la légende ou toute autre métadonnée de la pièce jointe en utilisant la valeur transitoire stockée.

Enfin, vous supprimerez le transitoire.

J'ai effectivement testé cette méthode et semble fonctionner avec des téléchargements de pièces jointes multiples et uniques sur mon installation localhost.

Ok c'est comment vous pouvez le faire avec du code.

Accrochez-vous dans wp_handle_upload_prefilter et stockez le nom de fichier pré-assaini (sans extension) en tant que transitoire WordPress à l'aide de set_transient

add_action( 'wp_handle_upload_prefilter', '_remember_presanitized_filename' );
function _remember_presanitized_filename( $file ) {
    $file_parts = pathinfo( $file['name'] );
    set_transient( '_set_attachment_title', $file_parts['filename'], 30 );
    return $file;
}

Capturez l'option transitoire pour mettre à jour la pièce jointe ajoutée

add_action( 'add_attachment', '_set_attachment_title' );
function _set_attachment_title( $attachment_id ) {
    $title = get_transient( '_set_attachment_title' );
    if ( $title ) {

        // to update attachment title and caption
        wp_update_post( array( 'ID' => $attachment_id, 'post_title' => $title, 'post_excerpt' => $title ) );

        // to update other metadata
        update_post_meta( $attachment_id, '_wp_attachment_image_alt', $title );

        // delete the transient for this upload
        delete_transient( '_set_attachment_title' );
    }
}
3
Ahmed Fouad