COMMEnT médias WP Uploader créent les 3 images différentes tailles, et comment puis-je dupliquer

wordpress.stackexchange https://wordpress.stackexchange.com/questions/8081

  •  16-10-2019
  •  | 
  •  

Question

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

J'ai fait un METABOX personnalisé pour le téléchargement et joindre des images à des postes, et il ne vous oblige pas à utiliser les médias horribles Thickbox Uploader intégré dans WP. Je déteste cette chose. Non, ce que je l'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 voulez. Alors vous remplissez les champs, sélectionner une image à télécharger, et enregistrer le projet ou publier le poste. Une fois il y a ajouté des pièces jointes à un poste, le METABOX affiche les champs d'entrée, avec une image d'aperçu de l'image ci-jointe pour chaque pièce jointe que vous avez ajouté. Les champs de titre et la description sont utilisés pour générer les méta-données de fichiers, rien est enregistré comme post_meta, que je sache. C'est actuellement tout ce que j'ai eu à travailler à ce jour.

Je dois faire en sorte que lorsque vous enregistrez / publier un message, inturn télécharger / créer les fichiers joints, il va créer les trois tailles d'image que la valeur par défaut wp Uploader aurait, miniature, moyen, grand, et en gardant la pleine image taille trop. Si cela est possible en quelque sorte. Sinon, je voudrais 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, sur le téléchargement.

Je ne sais pas quelle fonction est le plus idéal pour une utilisation dans ce cas, peut-être la fonction image_make_intermediate_size() serait mieux, ou wp_create_thumbnail() ou wp_crop_image() ... qui sait !!

Je ne peux pas comprendre comment aller à faire cela, si je dois exécuter la fonction wp_handle_upload() pour chacun d'eux, ou peut-être quelque chose qui implique la fonction wp_generate_attachment_metadata(). Il est pour moi source de confusion puisque les 3 tailles d'image doivent être associés comme des variantes du même attachement, et comment s'y prendre pour le faire.

Je l'ai parcouru le web, lire la source de tous les médias wp / upload / fichier lié à l'image, et a joué avec à peu près toutes les fonctions il y a pour les choses de téléchargement de médias et ne peut pas trouver comment WP crée 3 tailles d'image partout, ou comment le faire moi-même.

Dans wp-includes / media.php les regards de la fonction image_resize() comme il serait préférable car il est exactement ce qu'elle devrait être. Je ne peux pas comprendre la vie de moi ce que l'enfer que je suis absent ou ont essayé de faire, mais avait tort de les vignettes d'images.

Voici ma fonction de travail qui fait les choses de wp_handle_upload() et les choses, mais il faut aussi créer le pouce 100px, et faire une version de redimensionnement de l'image qui est au maximum de largeur comme 500px, et enregistré en tant que nouveaux fichiers de celui Uploaded .

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 me aider enfin résoudre ce problème il fonctionne serait bon d'être aimé. J'ai passé tant de ridicules innombrables heures de nombreuses fois différentes en essayant de développer cette chose et la documentation suce, et il n'y a pas vraiment de bons messages partout sur la façon de le faire.

Merci

Était-ce utile?

La solution

Salut @jaredwilli:

Mec! Valiant effort, et beau travail. Tout-en-tout, ce pourrait être un excellent ajout à WordPress.

Vous étiez si proche, mais vous avez eu quelque part entre 5 et 10 petites hypothèses ont échoué ou code qui ressemble à toi qui as commencé, mais n'a pas y revenir parce qu'il ne fonctionnait pas. J'ai retravaillé votre fonction seulement autant que je devais corriger. La solution suit, et je vais laisser la comparaison côte à côte à votre ou quelqu'un de moins incendié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 faire des folies et vous obtenez une copie de PhpStorm ? Vous auriez pu facilement résoudre vous-même, vous étiez tellement proche, si vous auriez pu être retracé dans le code comme je peux maintenant. Si vous le faites, ne perdez pas votre temps sur le très bogué XDEBUG et au lieu téléchargement Zend Debugger

P.S. Ceci est ma première réponse. Je posté avant que je réalise exactement ce que Jared demandait. Il est exact, mais pas lié à 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 va créer ces tailles automatiquement. Qu'est-ce que ce que vous aviez besoin?

Autres conseils

Si je vous comprends question que vous devez obtenir la liste des formats d'abord comme ceci:

$image_sizes = get_intermediate_image_sizes();

retourne un tableau de toutes les tailles d'images enregistrées (par défaut: grande, moyenne, miniature, toute taille personnalisée enregistrée à l'aide « add_image_size () » tout ce que vous devez faire est de boucle creux chacune des tailles et créer une image pour cette taille comme ceci:

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

remplacer $ fichier avec le chemin du fichier uploadé et $ culture avec true ou false si vous voulez recadrer l'image aux dimensions nouvelles ou faux à redimensionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top