web-dev-qa-db-fra.com

Télécharger une image à partir de Front End et redimensionner

Je travaille sur l'ajout de la possibilité d'ajouter du type custom_post_type à partir du serveur frontal. Je peux associer des images à ces images, mais apparemment, elles ne sont pas redimensionnées. Et j’ai vraiment besoin des tailles spéciales que j’ai définies sur mon functions.php.

Voici ce que je fais:

if(!empty($_FILES['IMAGE'])){
        include_once ABSPATH . 'wp-admin/includes/media.php';
        include_once ABSPATH . 'wp-admin/includes/file.php';
        include_once ABSPATH . 'wp-admin/includes/image.php';
        $file = $_FILES['IMAGE'];

        $upload = wp_handle_upload( $file, array('test_form' => false));
          if(!isset($upload['error']) && isset($upload['file'])){
            $title = $file['name'];

            $filetype = wp_check_filetype( basename($upload['file'], null ));

            $ext = strrchr($title,'.');
            $title =($ext !== false) ? substr($title, 0, -strlen($ext)) : $title;

              //$url_img = wp_get_attachment_url( $attach_key );
              $attach_key = '_thumbnail_id';
              $attach_id = wp_insert_attachment($attachment,$upload['file']);
              $existing_download = (int) get_post_meta($new_eta_ID, $attach_key, true);
              if(is_numeric($existing_download)){
                wp_delete_attachment( $existing_download );
              }
              update_post_meta($new_eta_ID, $attach_key, $attach_id,true);
          }
      }

Donc, il télécharge les fichiers sélectionnés, mais ce n'est pas le redimensionnement. Comment puis je faire ça ?

Merci !

2
zEd.

Le code suivant provient de mon "redimensionnement d'image dynamique" -plugin .

Le plugin prend en compte un identifiant ainsi qu'une chaîne. Je n'ai pas supprimé ces lignes, car elles pourraient éventuellement être utilisées par des visiteurs ultérieurs - vérifiez quand même le lien.

Récupérer l'image par ID ou URl

    $hw_string    = image_hwstring( $width, $height );

    $needs_resize = true;

    $error        = false;
    // ID as src
    if ( ! is_string( $src ) )
    {
        $att_id = $src;
        // returns false on failure
        $src    = wp_get_attachment_url( $src );

        // If nothing was found:
        ! $src AND $error = true;
    }
    // Path as src
    else
    {
        $upload_dir = wp_upload_dir();
        $base_url   = $upload_dir['baseurl'];

        // Let's see if the image belongs to our uploads directory...
        $img_url = substr(
             $src
            ,0
            ,strlen( $base_url )
        );
        // ...And if not: just return the image HTML string
        if ( $img_url !== $base_url )
        {
            return $this->get_markup(
                 $img_url
                ,$hw_string
                ,$classes
            );
        }

        // Look up the file in the database.
        $file   = str_replace(
             trailingslashit( $base_url )
            ,''
            ,$src
        );
        $att_id = $this->get_attachment( $file );

        // If no attachment record was found:
        ! $att_id AND $error = true;
    }

Vérifier les erreurs

et abandonner si aucune pièce jointe n'a été trouvée. Cela signifierait que le téléchargement ne s'est pas terminé comme prévu.

    // Abort if the attachment wasn't found
    if ( $error )
    {
        # @TODO Error handling with proper message
        # @TODO Needs a test case
        # remove $file in favor of $error_msg
        /*
        $data = get_plugin_data( __FILE__ );
        $error_msg = "Plugin: {$data['Name']}: Version {$data['Version']}";
        */

        # @TODO In case, we got an ID, but found no image: if ( ! $src ) $file = $att_id;

        return new WP_Error(
             'no_attachment'
            ,__( 'Attachment not found.', 'dyn_textdomain' )
            ,$file
        );
    }

Vérifier les tailles d'images existantes

Dans le cas où il y avait déjà une image de la taille dont nous avons besoin. Cela peut être le cas si l'utilisateur tente de télécharger la même image plusieurs fois (ce que vous devez vérifier pour éviter les doublons).

    // Look through the attachment meta data for an image that fits our size.
    $meta = wp_get_attachment_metadata( $att_id );
    foreach( $meta['sizes'] as $key => $size )
    {
        if (
            $width === $size['width']
            AND $height === $size['height']
            )
        {
            $src = str_replace(
                 basename( $src )
                ,$size['file']
                ,$src
            );
            $needs_resize = false;
            break;
        }
    }

Traiter le redimensionnement

Maintenant, nous sommes sûrs que nous avons une pièce jointe et que nous devons redimensionner. Nous mettons également à jour les méta-données de type post et attachment post.

    // If an image of such size was not found, ...
    if ( $needs_resize )
    {
        $attached_file = get_attached_file( $att_id );
        // ...we can create one.
        $resized       = image_make_intermediate_size(
             $attached_file
            ,$width
            ,$height
            ,true
        );

        if ( ! is_wp_error( $resized ) )
        {
            // Let metadata know about our new size.
            $key = sprintf(
                 'resized-%dx%d'
                ,$width
                ,$height
            );
            $meta['sizes'][ $key ] = $resized;
            $src = str_replace(
                 basename( $src )
                ,$resized['file']
                ,$src
            );

            wp_update_attachment_metadata( $att_id, $meta );

            // Record in backup sizes, so everything's
            // cleaned up when attachment is deleted.
            $backup_sizes = get_post_meta(
                 $att_id
                ,'_wp_attachment_backup_sizes'
                ,true
            );

            ! is_array( $backup_sizes ) AND $backup_sizes = array();

            $backup_sizes[ $key ] = $resized;

            update_post_meta(
                 $att_id
                ,'_wp_attachment_backup_sizes'
                ,$backup_sizes
            );
        }

Maintenant, tout devrait bien se passer et être prêt à continuer.

Si vous n'avez pas besoin de tout, supprimez simplement ce dont vous n'avez pas besoin, mais assurez-vous de ne pas omettre les vérifications d'erreur nécessaires. Mieux vaut prévenir que guérir.

1
kaiser