web-dev-qa-db-fra.com

media_handle_upload chose étrange

J'utilise un script frontal pour télécharger des images, tout fonctionne bien, mais j'ai récemment remarqué que les images téléchargées ne sont pas enregistrées dans le bon répertoire. Mes paramètres sont les suivants: Organiser mes téléchargements dans des dossiers mensuels et annuels. mes dossiers sont 2011-> 03,04,05 (mars, avril, mai). Le problème est que si je télécharge un fichier aujourd'hui, il l'enregistre dans le dossier 03 (mars). Si j'utilise wp_handle_upload, l'image est enregistrée dans le dossier approprié 05 (mai), mais l'image n'est pas affichée dans la bibliothèque multimédia et les différentes tailles ne sont pas créées.

Le code que j'utilise est

$image = media_handle_upload('async-upload', '');
2
Harjeet Singh

Regardez dans les premières lignes de cette fonction:

function media_handle_upload(
    $file_id, 
    $post_id, 
    $post_data = array(), 
    $overrides = array( 'test_form' => false )
) 
{

    $time = current_time('mysql');
    if ( $post = get_post($post_id) ) {
        if ( substr( $post->post_date, 0, 4 ) > 0 )
            $time = $post->post_date;
    }

    $name = $_FILES[$file_id]['name'];
    $file = wp_handle_upload($_FILES[$file_id], $overrides, $time);

Le temps est pris à partir de la date de publication. Vous pouvez contourner media_handle_upload() et utiliser wp_handle_upload() directement.

Mettre à jour

Je n’ai pas le temps d’écrire un exemple autonome pleinement fonctionnel, mais voici un extrait de ma classe d’options de thème. Il gère les téléchargements, génère différentes tailles d'images et un identifiant de pièce jointe. Il est appelé par la fonction de sauvegarde générale et gère plusieurs fichiers téléchargés en une seule fois.

/**
 * Saves uploaded files in media library and the corresponding id in option field.
 *
 * @return void
 */
protected function handle_uploads()
{
    if ( ! isset ( $_FILES ) or empty ( $_FILES ) )
    {
        return;
    }

    foreach ( $_FILES as $file_key => $file_arr )
    {
        // Some bogus upload.
        if ( ! isset ( $this->fields[$file_key] )
            or empty ( $file_arr['type'] )
        )
        {
            continue;
        }

        if ( ! $this->is_allowed_mime( $file_key, $file_arr ) )
        {
            set_theme_mod( $file_key . '_error', 'wrong mime type' );
            continue;
        }

        // The file is allowed, no error until now and the type is correct.
        $uploaded_file = wp_handle_upload(
            $file_arr
        ,   array( 'test_form' => FALSE )
        );

        // error
        if ( isset ( $uploaded_file['error'] ) )
        {
            set_theme_mod( $file_key . '_error', $uploaded_file['error'] );
            continue;
        }

        // add the file to the media library

        // Set up options array to add this file as an attachment
        $attachment = array(
            'post_mime_type' => $uploaded_file['type']
        ,   'post_title'     => $this->get_media_name(
                                    $file_key, $uploaded_file['file']
                                )
        );

        // Adds the file to the media library and generates the thumbnails.
        $attach_id = wp_insert_attachment(
            $attachment
        ,   $uploaded_file['file']
        );

        $this->create_upload_meta( $attach_id, $uploaded_file['file'] );

        // Update the theme mod.
        set_theme_mod( $file_key, $attach_id );
        remove_theme_mod( $file_key . '_error' );
    }
}

/**
 * Adds meta data to the uploaded file
 *
 * @param  int $attach_id
 * @param  string $file
 * @return void
 */
protected function create_upload_meta( $attach_id, $file )
{
    // Create meta data from EXIF fields.
    require_once ABSPATH . 'wp-admin/includes/image.php';
    $attach_data = wp_generate_attachment_metadata(
        $attach_id
    ,   $file
    );
    wp_update_attachment_metadata($attach_id,  $attach_data);
}

Quelques notes:

  • is_allowed_mime() recherche les types MIME définis dans $fields qui sont définis dans mon contrôleur. Le type MIME pour un favicon, par exemple, est image/x-icon ou image/vnd.Microsoft.icon.
  • get_media_name() peut utiliser un nom prédéfini pour la pièce jointe (exemple: logo ).
  • Dans votre fonction, vous voudrez probablement renvoyer $attach_id et l'utiliser dans un champ de méta-publication ou quelque chose de similaire.
1
fuxia