web-dev-qa-db-ja.com

複数のアップロード画像があるフロントエンドの投稿?

アップロード画像付きのフロントエンド投稿を使用しています、

私のコード

if (!function_exists('wp_generate_attachment_metadata')){
            require_once(ABSPATH . "wp-admin" . '/includes/image.php');
            require_once(ABSPATH . "wp-admin" . '/includes/file.php');
            require_once(ABSPATH . "wp-admin" . '/includes/media.php');
        }
         if ($_FILES) {
            foreach ($_FILES as $file => $array) {
                if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
                    return "upload error : " . $_FILES[$file]['error'];
                }
                $attach_id = media_handle_upload( $file, $new_post );
            }   
        }
        if ($attach_id > 0){
            //and if you want to set that image as Post  then use:
            update_post_meta($new_post,'_thumbnail_id',$attach_id);
        }

これは、このような画像を1つアップロードするのに適しています

 <input type="file" id="image" name="image">

しかし、私のHTMLを

 <input type="file" id="image" name="image[]" multiple="multiple" >

アップロードを停止します

誰かが私を助けてくれる?

2
Ehab Fawzy

入力ファイルtagのmultiple="multiple"またはmultiple=""属性はかなり新しく、クロスブラウザでは広くサポートされていませんが、それがあなたが望むやり方であれば、

これを試して:

<form  ...
   <input type="file" id="image" name="image[]" onchange="updateList();" multiple="multiple" >
   <ul id="file_list"></ul>
</form>
<script>
function updateList(){
    //get the input and UL list
    var input = document.getElementById('image');
    var list = document.getElementById('file_list');

    //empty list for now...
    while (list.hasChildNodes()) {
      list.removeChild(ul.firstChild);
    }

    //for every file...
    for (var x = 0; x < input.files.length; x++) {
      //add to list
      var li = document.createElement('li');
      li.innerHTML = 'File ' + (x + 1) + ':  ' + input.files[x].name;
      list.append(li);
    }
}
</script>

ファイルがアップロードされたとき、その関数を使うために配列の修正を使う必要があるので、 Golden Apples からこれらの関数を使います。

function fix_file_array(&$files) {
    $names = array(
        'name' => 1,
        'type' => 1,
        'tmp_name' => 1,
        'error' => 1,
        'size' => 1
    );
    foreach ($files as $key => $part) {
        // only deal with valid keys and multiple files
        $key = (string) $key;
        if (isset($names[$key]) && is_array($part)) {
            foreach ($part as $position => $value) {
                $files[$position][$key] = $value;
            }
            // remove old key reference
            unset($files[$key]);
        }
    }
}


function insert_attachment($file_handler,$post_id,$setthumb='false') {
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    $attach_id = media_handle_sideload( $file_handler, $post_id );
    if ($setthumb) update_post_meta($post_id,'_thumbnail_id',$attach_id);
    return $attach_id;
}

そして一度あなたがこの機能を持っているなら、あなたはこれをすることができます:

if ($_FILES) {
    fix_file_array($_FILES[$name]);
    foreach ($_FILES[$name] as $file => $fileitem){
        $newupload = insert_attachment($fileitem,$real_post_id);
    }
}

どれがうまくいくか

3
Bainternet