web-dev-qa-db-fra.com

Téléchargement de fichier, télécharge uniquement le nom du fichier

Je travaille sur un simple téléchargement d’images frontales dans Wordpress. Avec ce morceau de code, je peux télécharger dans la section des médias wordpress, mais je ne télécharge que le nom et l’url du fichier, puis aucune image.

Est-ce que quelqu'un sait ce que je dois faire pour télécharger l'image aussi?

Ma forme:

<form id="dash_action" method="post" enctype="multipart/form-data">

   <input type="file" name="file" /> 

   <input name="submit" type="submit" class="button" value="<?php _e( 'Save settings' ); ?>" />

</form><!--End dash_action-->

Mon PHP traitement des formulaires:

if( isset( $_POST['submit'] ) ) {

    $filename = $_FILES['file']['name'];
    $wp_filetype = wp_check_filetype( basename($filename), null );
    $wp_upload_dir = wp_upload_dir();
    $attachment = array(
        'guid' => $wp_upload_dir['subdir'] . '/' . basename( $filename ), 
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $filename, 37 );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    $attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
    wp_update_attachment_metadata( $attach_id, $attach_data );  

}
1
Robbert

Le codex WordPress indique que "Le fichier DOIT être dans le répertoire de téléchargement". J'ai ajouté une ligne pour déplacer le fichier téléchargé dans le répertoire uploads et j'ai modifié le chemin d'accès.

if( isset( $_POST['submit'] ) ) {

    $filename = $_FILES['file']['name'];
    $wp_filetype = wp_check_filetype( basename($filename), null );
    $wp_upload_dir = wp_upload_dir();

    // Move the uploaded file into the WordPress uploads directory
    move_uploaded_file( $_FILES['file']['tmp_name'], $wp_upload_dir['path']  . '/' . $filename );

    $attachment = array(
        'guid' => $wp_upload_dir['url'] . '/' . basename( $filename ), 
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
        'post_content' => '',
        'post_status' => 'inherit'
    );

    $filename = $wp_upload_dir['path']  . '/' . $filename;

    $attach_id = wp_insert_attachment( $attachment, $filename, 37 );
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    $attach_data = wp_generate_attachment_metadata( $attach_id, $filename );
    wp_update_attachment_metadata( $attach_id, $attach_data );  

}
1
James Austen

media_handle_sideload est votre ami!

usage:

media_handle_sideload( $file_array, $post_id, $desc, $post_data );

Ainsi, votre code est considérablement réduit en taille à:

if( isset( $_POST['submit'] ) ) {
    $attach_id = media_handle_sideload( $_FILES['file'], 0, 'description' );
}

Vous pouvez également transmettre un tableau de données post avec un titre, etc.

Il déplacera automatiquement votre fichier à l'emplacement correct, créera une pièce jointe et générera les métadonnées, le joindra à la publication appropriée et vous donnera un identifiant de pièce jointe en retour.

Assurez-vous d’utiliser is_wp_error() pour vérifier l’échec.

0
Tom J Nowell

Utilisez simplement media_handle_upload() à la place. Tout cela pour vous, y compris la génération de métadonnées et tout le reste.

Si vous voulez utiliser votre propre chemin de cette façon, vous avez oublié d'appeler wp_handle_upload() pour déplacer le fichier au bon endroit.

0
Otto