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

17

J'ai enfin !! J'ai obtenu cette chose que j'ai essayé environ 12 fois de faire et 12 façons différentes, mais finalement je l'ai fait fonctionner, en quelque sorte.

J'ai créé une métabox personnalisée pour télécharger et attacher des images aux publications, et cela ne vous oblige pas à utiliser l'horrible uploader de médias épais intégré à WP. Je déteste cette chose. Non, ce que j'ai fait n'est qu'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 qu'il y a des pièces jointes ajoutées à un message, la métabox affichera 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 de titre et de 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 obtenu jusqu'à présent.

Je dois faire en sorte que lorsque vous enregistrez / publiez un article, transférez / créez les fichiers joints, il créera les trois tailles d'image comme le ferait le téléchargeur wp par défaut, miniature, moyen, grand et conservant également l'image pleine taille . Si c'est possible d'une manière ou d'une autre. Sinon, j'aimerais utiliser autrement add_image_size()pour créer / définir de nouvelles tailles personnalisées, et les générer de cette façon à la place, lors du téléchargement.

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

Je ne peux pas comprendre comment procéder, si j'ai besoin d'exécuter la wp_handle_upload()fonction pour chacun, ou peut-être quelque chose impliquant la wp_generate_attachment_metadata()fonction. C'est déroutant pour moi, car les 3 tailles d'image doivent être associées en tant que variantes de la même pièce jointe, et comment s'y prendre.

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

Dans wp-includes / media.php, la image_resize()fonction semble préférable car c'est exactement ce qu'elle devrait être. Je n'arrive pas à comprendre pour la vie de moi ce que je manque ou que j'ai essayé de faire mais j'ai mal fait les vignettes de l'image.

Voici ma fonction de travail qui fait les wp_handle_upload()choses et les choses, mais elle doit également créer le pouce 100px, et faire une version redimensionnée de l'image qui est de largeur maximale comme 500px, et enregistrée en tant que nouveaux fichiers de celle téléchargé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 à résoudre ce problème afin que cela fonctionne correctement serait appréciée. J'ai passé tellement d'heures ridicules, d'innombrables fois, à essayer de développer cette chose et la documentation est nul, et il n'y a pas vraiment de bons articles nulle part sur la façon de le faire.

Merci

jaredwilli
la source
Vérifiez les commentaires sur les différentes réponses ci-dessous et je pense que moi ou @ בניית אתרים ou les deux nous sommes confus sur ce dont vous avez besoin.
MikeSchinkel
Quelqu'un a-t-il résolu cela ?? Ayant un problème similaire, parcourent le Web depuis des siècles sur celui-ci.

Réponses:

6

Salut @jaredwilli:

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

Vous étiez si proche, mais vous aviez quelque part entre 5 et 10 petites hypothèses ou code qui semblent avoir démarré mais ne sont pas revenus car cela ne fonctionnait pas. J'ai retravaillé votre fonction autant que nécessaire pour la corriger. La solution suit, et je vais laisser la comparaison côte à côte à votre ou à quelqu'un de moins épuisé. :)

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'] );
    }
  }
}

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

PS Ceci est mon ancienne réponse. J'ai posté ceci avant de réaliser 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. De quoi avez-vous besoin?

MikeSchinkel
la source
Je ne suis pas sûr de cela, il demande la création des tailles de support par défaut.
Bainternet
Hmm. La fonction wp_generate_attachment_metadata()fait cela si add_image_size()est définie. Peut-être qu'il n'a tout simplement pas essayé d'utiliser add_image_size()pour définir les tailles d'image?
MikeSchinkel
oui mais, jaredwilli dit que les tailles intégrées WordPress par défaut (grandes, moyennes, vignettes) ne sont pas en cours de création, alors les tailles supplémentaires supplémentaires utilisant add_image_size () ne seront pas non plus créées.
Bainternet
ou peut-être que je ne reçois pas la question du tout :)
Bainternet
@ בניית אתרים - Je m'embrouille aussi maintenant. Je pense que nous devons attendre ici la clarification de @jaredwilli.
MikeSchinkel
0

si je comprends que vous vous posez des questions, vous devez d'abord obtenir la liste des tailles comme ceci:

$image_sizes = get_intermediate_image_sizes();

cela renvoie un tableau de toutes les tailles d'image enregistrées (par défaut: grand, moyen, miniature, toute taille personnalisée enregistrée à l'aide de "add_image_size ()" alors tout ce que vous avez à faire est de parcourir chaque taille et de créer une image pour cette taille comme cette:

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

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

Bainternet
la source
@ בניית אתרים - Si vous jetez un coup d' oeil au code wp_generate_attachment_metadata()en /wp-admin/includes/image.phpvous verrez qu'il fait exactement ce que vous avez publié ci - dessus, et il est déjà appelé cela. Donc, si ceux-ci ne sont pas créés, il a peut-être un plugin qui les filtre à l'aide du 'intermediate_image_sizes_advanced'crochet?
MikeSchinkel
En fait, je n'avais pas essayé d'utiliser get_intermediate_image_sizes (); Je ne savais pas qu'il avait toutes les tailles enregistrées. C'est bien de savoir maintenant. Je ne comprends toujours pas comment les tailles d'image générées sont associées à une pièce jointe particulière, comme si je regardais dans la bibliothèque multimédia, vous voyez les 3 options de taille, lorsque vous sélectionnez l'une d'entre elles, elle sait quelle image saisir . Idk, ce n'est pas aussi important. Sauf si c'est le cas. Après avoir fait cette boucle foreach, quelle variable utiliserais-je pour ajouter la pièce jointe? $ images ['thumb'] ou quelque chose (quelle que soit la taille que je veux)?
jaredwilli
@ בניית אתרים - Nous avons tous les deux raté le vrai problème au début. Le vrai problème concernait environ 7 ou 8 erreurs de code dans l'exemple d'origine. Voir ma réponse mise à jour.
MikeSchinkel
Oui, il était tard ici et j'étais mort de cervelle.
Bainternet
@ בניית אתרים - Idem. :)
MikeSchinkel