web-dev-qa-db-ja.com

ファイルのアップロード、ファイル名のみをアップロードします

私はWordpressで簡単なフロントエンド画像のアップロードに取り組んでいます。このコード片で私はwordpressメディアセクションにアップロードすることができます、しかし、私はただファイルの名前とURLをアップロードします、画像なし。

画像をアップロードするために必要な作業は誰でも知っていますか?

私のフォーム:

<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-->

私のPHPフォーム処理:

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

WordPressコーデックス は、「ファイルはuploadsディレクトリになければならない」と述べています。アップロードしたファイルをuploadsディレクトリに移動する行を追加し、guidパスを変更しました。

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はあなたの友達です!

使用法:

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

そのため、コードのサイズは劇的に縮小されます。

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

タイトルなどを付けて投稿データの配列を渡すこともできます。

ファイルを自動的に正しい場所に移動し、添付ファイルを作成してメタデータを生成し、それを関連する投稿に添付して、代わりに添付ファイルIDを提供します。

失敗をチェックするためにis_wp_error()を必ず使用してください。

0
Tom J Nowell

代わりにmedia_handle_upload()を使ってください。メタデータの生成やその他すべてを含めて、これはすべてあなたのために行います。

この方法で自分自身をロールバックしたい場合は、実際にファイルを正しい場所に移動するためにwp_handle_upload()を呼び出すことを忘れていました。

0
Otto