Comment l'utilitaire d'envoi de média WP crée-t-il les 3 images de différentes tailles et comment puis-je le dupliquer?

15

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, elle a fonctionné,

J'ai créé une metabox personnalisée pour importer 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 obtenu jusqu’à présent.

Je dois faire en sorte que, lorsque vous enregistrez / publiez une publication, que vous téléchargiez / créiez les fichiers joints 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, gros image de taille aussi. Si c'est possible en quelque sorte. Sinon, j'aimerais utiliser add_image_size() pour créer / définir de nouvelles tailles personnalisées, 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 ne peux pas comprendre comment procéder, si j'ai besoin de lancer la fonction wp_handle_upload() pour chacun d'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 disponibles pour le téléchargement de contenu multimédia, et je ne trouve pas comment WP crée les 3 tailles d'image où que ce soit, 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 effectue les opérations de wp_handle_upload() , mais doit également créer le curseur de 100 pixels et créer une version de redimensionnement de l’image d’une largeur maximale de 500 pixels, et enregistrée dans de nouveaux fichiers du fichier. téléchargé un.

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 tout fonctionne correctement serait appréciée. J'ai passé tant d'heures ridicules et innombrables à 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

    
posée jaredwilli 30.01.2011 - 00:16

2 réponses

6

Bonjour @jaredwilli:

Mec! Vaillant effort et bon 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 manquantes ou un code qui semble avoir commencé mais qui n’a pas été repris car il 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 celle qui est 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'] );
    }
  }
}

Hé, pourquoi ne pas vous faire plaisir 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 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, c'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 vous aviez besoin?

    
réponse donnée MikeSchinkel 30.01.2011 - 00:51
0

si je comprends votre question, vous devez d'abord obtenir la liste des tailles comme ceci:

$image_sizes = get_intermediate_image_sizes();

Ceci renvoie un tableau de toutes les tailles d'image enregistrées (par défaut: grande, moyenne, miniature, toute taille personnalisée enregistrée à l'aide de "add_image_size ()". Ensuite, tout ce que vous avez à faire est de faire une boucle dans chacune des tailles et de créer une image de cette taille, comme ceci:

$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 rogner l'image sur les nouvelles dimensions ou false pour la redimensionner.

    
réponse donnée Bainternet 30.01.2011 - 01:45

Lire d'autres questions sur les étiquettes