web-dev-qa-db-fra.com

Comment WP Media Uploader crée les 3 images de tailles différentes, et comment puis-je les dupliquer

J'ai enfin !! J'ai eu cette chose que j'ai essayé environ 12 fois de faire et 12 façons différentes, mais finalement, ça a fonctionné, ... en quelque sorte.

J'ai créé une metabox personnalisée pour télécharger et joindre des images à des publications. Elle ne vous oblige pas à utiliser l'horrible uploader de média thickbox intégré à WP. Je déteste cette chose. Non, ce que j'ai fait est juste un groupe d'entrées (titre, description, fichier), que vous pouvez également dupliquer, pour ajouter des pièces jointes supplémentaires si vous le souhaitez. Vous remplissez donc les champs, sélectionnez une image à télécharger et enregistrez le brouillon ou publiez le message. Une fois que des pièces jointes ont été ajoutées à une publication, la metabox affiche les champs de saisie, ainsi qu'une image d'aperçu de l'image jointe pour chaque pièce jointe que vous avez ajoutée. Les champs title et description sont utilisés pour générer les métadonnées du fichier. Rien n'est enregistré en tant que post_meta, à ma connaissance. C’est actuellement tout ce que j’ai eu jusqu’à présent.

Je dois faire en sorte que lorsque vous enregistrez/publiez une publication, que vous la téléchargiez/créiez les fichiers en pièce jointe, les trois tailles d'image soient créées de la même manière que le téléchargeur wp par défaut le ferait, miniature, moyen, grand et conservant également l'image pleine taille . Si c'est possible en quelque sorte. Si ce n'est pas le cas, j'aimerais sinon utiliser add_image_size() pour créer/définir de nouveaux formats personnalisés et les générer de cette façon, lors du téléchargement.

Je ne sais pas quelle fonction est la plus idéale à utiliser dans ce cas. Peut-être que la fonction image_make_intermediate_size() serait meilleure, ou wp_create_thumbnail() ou wp_crop_image()... qui sait !!

Je n'arrive pas à comprendre comment y parvenir, si j'ai besoin d'exécuter la fonction wp_handle_upload() pour chacun d'entre eux, ou peut-être quelque chose impliquant la fonction wp_generate_attachment_metadata(). C'est déroutant pour moi car les 3 tailles d'image doivent être associées en tant que variantes du même fichier joint, et comment s'y prendre.

J'ai parcouru le Web, lu la source de chaque fichier lié au contenu multimédia/téléchargement/image wp, et joué avec à peu près toutes les fonctions qui existent pour le téléchargement de contenu multimédia et ne trouve pas comment WP crée les 3 tailles d'image. n'importe où, ou comment le faire moi-même.

Dans wp-includes/media.php, la fonction image_resize() semble être la meilleure solution, car elle correspond exactement à ce qu'elle devrait être. Je n'arrive tout simplement pas à comprendre ce que je manque ou ai essayé de faire, mais je me suis trompé en rendant l'image miniature.

Voici ma fonction de travail qui s'occupe de la fonction wp_handle_upload(), mais elle doit également créer le pouce 100px, créer une version de redimensionnement de l'image d'une largeur maximale de 500px, et l'enregistrer en tant que nouveau fichier de l'image importée.

function update_attachment(){
  global $post;

  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );

  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $url = wp_handle_upload( $_FILES['a_image'], $override );

    // $medium = image_make_intermediate_size( $uploaded_file['url'], 500, 400, true );
    // $thumb = = image_make_intermediate_size( $uploaded_file['url'], 100, 100, true );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $array_type = wp_check_filetype
    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

    $name_parts = pathinfo( $name );
    $name = trim( substr( $name, 0, - ( 1 + strlen( $name_parts['extension'] )) ));

    $type = $file['type'];
    $file = $file['file'];
    $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
    $content = $_POST['a_desc']

    $post_id = $post->ID;
    $attachment = array(
      'post_title' => $title,
      'post_type' => 'attachment',
      'post_content' => $content,
      'post_parent' => $post_id,
      'post_mime_type' => $type,
      'guid' => $url['url']
    );


    // Save the data
    $id = wp_insert_attachment( $attachment, $_FILES['a_image'][ 'file' ]/*, $post_id - for post_thumbnails*/);

    if ( !is_wp_error( $id )) {
      $attach_meta = wp_generate_attachment_metadata( $id, $uploaded_file['url'] );
      wp_update_attachment_metadata( $attach_id, $attach_meta );
    }
    update_post_meta( $post->ID, 'a_image', $uploaded_file['url'] );
  }
}

Toute personne capable de m'aider enfin à résoudre ce problème afin que cela fonctionne correctement serait aimée. J'ai passé tellement d'heures ridicules d'innombrables heures à essayer de développer cette chose et la documentation est nulle, et il n'y a pas vraiment de bons messages sur la façon de le faire.

Merci

16
jaredwilli

Bonjour @jaredwilli:

Mec! Vaillant effort et beau travail. Dans l'ensemble, cela pourrait être un excellent ajout à WordPress.

Vous étiez si proche, mais vous aviez entre 5 et 10 petites hypothèses ou codes qui semblaient avoir été lancés mais qui ne semblaient pas avoir commencé, mais qui n'y sont pas revenus parce que cela ne fonctionnait pas. Je n'ai retravaillé votre fonction que le nombre nécessaire pour la corriger. La solution suit, et je vais laisser la comparaison côte à côte avec votre personne ou une personne moins épuisée. :)

function update_attachment() {
  global $post;
  wp_update_attachment_metadata( $post->ID, $_POST['a_image'] );
  if( !empty( $_FILES['a_image']['name'] )) { //New upload
    require_once( ABSPATH . 'wp-admin/includes/file.php' );

    $override['action'] = 'editpost';
    $file = wp_handle_upload( $_FILES['a_image'], $override );

    if ( isset( $file['error'] )) {
      return new WP_Error( 'upload_error', $file['error'] );
    }

    $file_type = wp_check_filetype($_FILES['a_image']['name'], array(
      'jpg|jpeg' => 'image/jpeg',
      'gif' => 'image/gif',
      'png' => 'image/png',
    ));
    if ($file_type['type']) {
      $name_parts = pathinfo( $file['file'] );
      $name = $file['filename'];
      $type = $file['type'];
      $title = $_POST['a_title'] ? $_POST['a_title'] : $name;
      $content = $_POST['a_desc'];

      $post_id = $post->ID;
      $attachment = array(
        'post_title' => $title,
        'post_type' => 'attachment',
        'post_content' => $content,
        'post_parent' => $post_id,
        'post_mime_type' => $type,
        'guid' => $file['url'],
      );

      foreach( get_intermediate_image_sizes() as $s ) {
        $sizes[$s] = array( 'width' => '', 'height' => '', 'crop' => true );
        $sizes[$s]['width'] = get_option( "{$s}_size_w" ); // For default sizes set in options
        $sizes[$s]['height'] = get_option( "{$s}_size_h" ); // For default sizes set in options
        $sizes[$s]['crop'] = get_option( "{$s}_crop" ); // For default sizes set in options
      }

      $sizes = apply_filters( 'intermediate_image_sizes_advanced', $sizes );

      foreach( $sizes as $size => $size_data ) {
        $resized = image_make_intermediate_size( $file['file'], $size_data['width'], $size_data['height'], $size_data['crop'] );
        if ( $resized )
          $metadata['sizes'][$size] = $resized;
      }

      $attach_id = wp_insert_attachment( $attachment, $file['file'] /*, $post_id - for post_thumbnails*/);

      if ( !is_wp_error( $id )) {
        $attach_meta = wp_generate_attachment_metadata( $attach_id, $file['file'] );
        wp_update_attachment_metadata( $attach_id, $attach_meta );
      }
      update_post_meta( $post->ID, 'a_image', $file['url'] );
    }
  }
}

Hey, pourquoi ne pas faire des folies et obtenir une copie de PhpStorm ? Vous auriez pu facilement résoudre ce problème vous-même, vous étiez tellement proche, si vous pouviez simplement parcourir le code comme je le peux maintenant. Si vous le faites, ne perdez pas votre temps avec le très buggy XDEBUG et téléchargez plutôt Zend Debugger .

P.S. Ceci est ma réponse précédente. J'ai posté ceci avant que je réalise ce que Jared demandait exactement. C'est correct, mais sans rapport avec sa question. :)


Je pense que ce que vous recherchez est add_image_size():

add_image_size( $size_id, $width, $height, $crop );

Par exemple:

add_image_size('headshot', 130, 150);
add_image_size('large-headshot', 260, 300);

En définissant ce WordPress créera ces tailles automatiquement. Qu'est-ce que ce dont tu avais besoin?

6
MikeSchinkel

si j'ai bien compris votre question, vous devez d'abord obtenir la liste des tailles comme ceci:

$image_sizes = get_intermediate_image_sizes();

cela retourne un tableau de toutes les tailles d'images enregistrées (par défaut: grand, moyen, miniature, toute taille personnalisée enregistrée avec "add_image_size ()", il vous suffit alors de parcourir chacune des tailles et de créer une image de cette taille, comme ce:

$foreach ($image_sizes as $size){
    images[] = image_make_intermediate_size($file, $size['width'], $size['height'], $crop); 
}

remplacez $ fichier par le chemin du fichier téléchargé et $ crop par true ou false si vous souhaitez recadrer l'image selon les nouvelles dimensions ou false pour la redimensionner.

0
Bainternet