web-dev-qa-db-fra.com

Comment puis-je me connecter à WordPress pour enregistrer une photo téléchargée sous un format alternatif à une photo existante?

Le redimensionnement des images est désactivé dans les paramètres de support en définissant les dimensions des vignettes, moyennes et grandes dimensions sur 0.

Pour chaque photo sur mon blog, je upload la même photo en trois tailles:

  1. image filigranée grande/de taille normale pour utilisation dans FancyBox , avec toutes les métadonnées intactes
    • nom du fichier _large . jpg (1200x800)
  2. image miniature, sans filigrane, toutes les métadonnées sont supprimées à l’aide de ImageOptim
    • nom du fichier. jpg (180x120)
  3. rétine-miniature, sans filigrane, toutes les métadonnées sont supprimées à l’aide de ImageOptim
    • nom du fichier _x2 . jpg (360x240)
  4. peut-être plus de tailles plus tard ...

Actuellement, chacun d’entre eux prend des entrées distinctes dans la table wp_posts et wp_postmeta . Je me suis connecté à l’éditeur de média pour ajouter un bouton "Vignettes de titre" qui prend le titre de la grande photo et l’ajoute aux deux vignettes avec "- Vignette" ajoutée.

Ce que j'aimerais, c'est avoir une seule entrée dans la base de données pour toutes ces images - c'est la même photo après tout, mais dans des tailles différentes.

Dans l'état actuel des choses, je suis déjà connecté à l'action add_attachment pour déplacer la légende IPTC dans le champ approprié, comme suit:

// fix our uploads by moving the caption to the proper field
add_action('add_attachment', function ($post_ID) {
    // this is triggered after an attachment is uploaded and before the attachment form gets displayed
    $post = get_post($post_ID);
    $post->post_excerpt = $post->post_content;
    $post->post_content = NULL;

    wp_update_post($post);
});

Ma question est la suivante: comment puis-je me connecter à WordPress pour que, lorsque je télécharge une photo (par exemple, foo.jpg ou foo_x2.jpg), il vérifie si foo_large.jpg existe déjà et, le cas échéant, ajoute simplement une nouvelle taille à La clé '_wp_attachment_metadata' de cette photo dans la table wp_postmeta au lieu de créer une nouvelle entrée dans la bibliothèque/la base de données?

Pour ce que cela vaut, je vois dans la table wp_posts de la base de données que le fichier _large.jpg est toujours téléchargé en premier, suivi des vignettes. (Gardez à l'esprit, la grande photo est celle avec toutes les métadonnées (légende, titre, info exif, IPTC, etc.). Je ne m'inquiète pas non plus de rendre cette action rétroactive, mais une solution qui s'appliquera à tous les téléchargements ultérieurs. .

Merci!

6
DM.

Cela peut être fait en utilisant:

wp_get_attachment_metadata ();

wp_update_attachment_metadata ();

Vous obtiendriez les métadonnées pour cela et le changeriez puis enregistrez-le. Le tableau $ data que vous obtenez contient un autre tableau nommé size, ce tableau contient toutes les images de tailles différentes connectées à la pièce jointe.

Vous souhaitez que cette mise à jour se fasse automatiquement lorsque vous téléchargez des images facilement nommées. Je ne vois pas très bien pourquoi ça en vaudrait la peine mais jetons un coup d'oeil.

Cela prend un peu de travail et ce n'est probablement pas la façon optimale de le faire, mais cela fonctionne et vous donnera une idée de la façon dont cela peut être fait.

// hooking in to the add_attachment action just like you did
add_action('add_attachment', function ( $post_ID ) {
    // we need to work with the database
    global $wpdb;

    // get the attachment
    $post = get_post( $post_ID );

    // remove the _x2 suffix to help find the original
    $attachment_name = str_replace( '_x2', '', $post->post_title );

    // did this file have an _x2 suffix?
    $is_x2 = ( $attachment_name == $post->post_title ) ? FALSE : TRUE;

    // get the attachments extension
    $extension = pathinfo( $post->guid, PATHINFO_EXTENSION );

    // if there is a large file, it would be called:
    $large_file = $attachment_name . '_large.' . $extension;

    // time to see if we have a large file saved
    // wordpress stores the relative path from the uploads directory
    // we use a like query to find the file in any year/month subdir
    $result = $wpdb->get_row($wpdb->prepare(
        "SELECT * FROM $wpdb->postmeta
            WHERE meta_value LIKE %s",
        '%' . $wpdb->esc_like($large_file)
    ));

    // did we find a file?
    if( !empty( $result ) ) {
        // yep we found a file, get its meta
        $attachment_meta = wp_get_attachment_metadata( $result->post_id );

        // get meta data on the new file
        $meta = get_post_meta( $post->ID, '_wp_attached_file', TRUE );

        // manually read the size of the new image
        $upl = wp_upload_dir();
        $new_file = $upl['basedir'] . '/' . $meta;
        $sizes = getimagesize( $new_file );

        // what should the thumbnail be called?
        // remember we checked if the file had the _x2 suffix before?
        $thumb_name = ( $is_x2 ) ? 'x2' : 'thumb';

        // time to add the new size to the meta data of the large file
        $attachment_meta['sizes'][$thumb_name] = array(
            'file' => basename($post->guid),
            'width' => $sizes[0],
            'height' => $sizes[1],
            'mime-type' => $sizes['mime']
        );

        // save the new meta data to the large file
        wp_update_attachment_metadata( $result->post_id, $attachment_meta );

        // now we delete all references to the new file that was uploaded
        // by manually deleting it from the database the file will be kept on disk
        // this step is optional, Wordpress will behave a bit funny when uploading if used
        $wpdb->query($wpdb->prepare(
            "DELETE FROM $wpdb->posts
                WHERE $wpdb->posts.ID = %d", 
            $post->ID
        ));

        $wpdb->query($wpdb->prepare(
            "DELETE FROM $wpdb->postmeta 
                WHERE $wpdb->postmeta.post_id = %d", 
            $post->ID
        ));        
    }
});

Les 2 dernières requêtes de suppression sont facultatives, vous avez dit que vous ne vouliez pas de nouvelles entrées dans la base de données pour la nouvelle image et que ces dernières supprimeraient les nouvelles entrées. Wordpress n'aimera pas que les références soient supprimées, il sera un peu drôle lors du téléchargement, mais cela ne casse rien.

Maintenant, vous pouvez facilement récupérer vos vignettes comme vous le feriez avec n'importe quel autre. En supposant que vous ayez joint le fichier volumineux en tant qu’image sélectionnée à un message:

global $post;

// the filename_large.jpg file
echo get_the_post_thumbnail($post->ID);

// the filename.jpg file
echo get_the_post_thumbnail($post->ID, 'thumb');

// the filename_x2.jpg file
echo get_the_post_thumbnail($post->ID, 'x2');

Vous pouvez modifier le nom des vignettes avec la variable $ thumb_name dans laquelle nous avons enregistré les nouvelles métadonnées de la pièce jointe.

Cela fonctionnera que vous utilisiez les requêtes de suppression facultatives ou non, si vous ne vouliez le faire que pour des raisons de commodité, je vous prie de ne pas utiliser les requêtes. Si vous ne voulez vraiment pas que les vignettes apparaissent sous forme d'images individuelles, utilisez-les.

3
tobbr