web-dev-qa-db-fra.com

Lorsque vous rognez une image d’en-tête, conservez les métadonnées (nom, description, etc.) de l’image originale.

J'utilise actuellement les en-têtes personnalisés intégrés à WordPress pour obtenir des images pour un diaporama sur la page d'accueil de mon site Web. Pour la plupart, cela a fonctionné comme prévu; cela me permet de télécharger un ensemble d’images et de permettre au client de visualiser ce qui se passe.

Cependant, j'ai trouvé quelque chose qui n'était pas idéal. Lorsque vous téléchargez une image d'en-tête, puis la rognez, les "métadonnées" (nom, description, etc.) que vous avez définies dans l'image d'origine ne sont pas transférées vers la nouvelle image rognée (enregistrée séparément de la photo d'origine). ). Cela donne l'impression que les "métadonnées" n'ont pas été enregistrées pour l'image d'en-tête lorsque vous les avez ajoutées. Le seul moyen de mettre à jour cette "métadonnée" est alors d'aller dans la médiathèque et de l'éditer à partir de là. Comme vous pouvez le constater, cette UX n’est pas très intuitive et peut créer la confusion.

La meilleure solution à laquelle je puisse penser serait en quelque sorte de participer à un événement WordPress et de transférer les "métadonnées" de l'image d'origine vers l'image recadrée. Pour autant que je sache, il n’existe aucun moyen de le faire. J'aimerais donc connaître votre opinion.

Je suis ouvert à toutes les idées et solutions.

Voici une représentation plus visuelle de ce que je décris:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

7
Josh Foskett

Voici une idée qui pourrait nécessiter des tests supplémentaires:

/**
 * Cropped header image with the same description/caption as the original image
 */
add_filter( 'wp_create_file_in_uploads', function( $cropped, $attachment_id )
{
    add_filter( 'wp_insert_attachment_data', function( $data ) use ( $attachment_id)
    {
        if( doing_action( 'wp_ajax_custom-header-crop' ) && is_array( $data ) )
        {
            // Copy the original description to the cropped image
            $data['post_content'] = get_post_field( 'post_content', $attachment_id, 'db' );
            // Copy the original caption to the cropped image
            $data['post_excerpt'] = get_post_field( 'post_excerpt', $attachment_id, 'db' );
        }
        return $data;
    } );
    return $cropped;
}, 10, 2 );

Ici, nous copions les description et caption de l'image d'origine via les filtres wp_create_file_in_uploads et wp_insert_attachment_data. Pour le restreindre dans le contexte duen-tête personnalisé ajax crop, nous le vérifions avec:

 doing_action('wp_ajax_custom-header-crop')` 

Ici, nous passons également le $attachment_id, de l'image d'origine, dans lefermetureà l'aide duusemot-clé.

Si nous devons également copier leimage meta, nous pourrions utiliser une approche similaire avec le filtre wp_header_image_attachment_metadata :

/**
 * Cropped header image with the same image meta as the original one
 */
add_filter( 'wp_create_file_in_uploads', function( $cropped, $attachment_id )
{
    add_filter( 'wp_header_image_attachment_metadata', function( $metadata ) use ( $attachment_id )
    {
        if( doing_action( 'wp_ajax_custom-header-crop' ) && isset( $metadata['image_meta'] ) )
        {
            // Fetch the image meta of the original image
            $original_metadata = wp_get_attachment_metadata( $attachment_id );
            // Copy the original image meta data for the cropped image
            if( is_array( $original_metadata['image_meta'] ) )
                $metadata['image_meta'] = $original_metadata['image_meta'];
        }       
        return $metadata;
    } );
    return $cropped;
}, 10, 2 );

J'espère que vous pourrez l'adapter à vos besoins.

4
birgire