WordPressのゲスト投稿(フロントエンド)から複数画像のアップロード ITかあさん

ITかあさん

WordPressのゲスト投稿(フロントエンド)から複数画像のアップロード

ゲスト投稿から画像アップロードするには

WordPressの管理画面ではなく、表画面(フロントエンド)から画像をアップロードする方法はこちらが参考になります。

で、今回はこちらを参考に複数画像のアップロードにチャレンジしてみようかと。

functions.php

functions.phpに以下の記述を書きます。3つのファイルの呼び出しをあらかじめしないとだめなようです。

function insert_attachment($file_handler,$post_id,$setthumb='false') 
{
    // check to make sure its a successful upload
    if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_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_upload( $file_handler, $post_id );
    if ($setthumb)
        update_post_meta($post_id,'_thumbnail_id',$attach_id);
    return $attach_id;
}

複数画像アップロードするためのループ。

global $post;
if ($_FILES) {
    $files = $_FILES['upload_attachment'];
    foreach ($files['name'] as $key => $value) {
        if ($files['name'][$key]) {
            $file = array(
            'name'     => $files['name'][$key],
            'type'     => $files['type'][$key],
            'tmp_name' => $files['tmp_name'][$key],
            'error'    => $files['error'][$key],
            'size'     => $files['size'][$key]
            );

            $_FILES = array("upload_attachment" => $file);

            foreach ($_FILES as $file => $array) {
                $newupload = insert_attachment($file,$post_id);
            }                                   
        }
    }
}

表側

表側はテーマファイルの好きなところにフォームタグを書いてあげればいいと思います。

<form action="" method="post" id="profile-edit-form" class="standard-form" enctype="multipart/form-data">
 <!--複数画像をアップロードするためのmultiple。nameは配列になるよう、[ ]を忘れない-->   <input type="file" name="upload_attachment[]" multiple="multiple" accept="image/*">
<div class="submit">
<input type="submit" name="profile-group-edit-submit" id="profile-group-edit-submit" value="保存 "/>
</div>
</form>

なお、上記はHTML5対応のmultipartなので、それ以外の場合はこのように複数書いてもOKです。

<input type="file" name="upload_attachment[]">
<input type="file" name="upload_attachment[]">
<input type="file" name="upload_attachment[]">

大変だ!アイキャッチが投稿した画像のうち、一番最後の画像だ!

すみません、こちらの記事を書いていて後で気がついたのですが
update_post_metaがループ中に実行されているため、4枚画像が登録されていたら最後の画像がアイキャッチになって当然ですね。

update_post_meta($post_id,'_thumbnail_id',$attach_id);

でも、ラジオボタンか何かでアイキャッチで選ばせるのも分かり難いですし、やはり1番最初の画像がアイキャッチになるのが分かりやすいと思います。
しかも、4個画像のフォームがあって うっかり2個目のフォームから画像を登録する暴挙に出るユーザーがいないとは限りません。
そこで、これはこれとして画像がPOSTされたら、画像の配列を逆順にソートかければよいのでは?と考えました。

そんな訳で修正版 フォームからの複数画像のアップロード

global $post;
if ($_FILES) {
$files = $_FILES['upload_attachment'];
/*画像が渡されたら逆順でソートを行う*/    
arsort($files['name'],SORT_NUMERIC);
arsort($files['type'],SORT_NUMERIC);
arsort($files['tmp_name'],SORT_NUMERIC);
arsort($files['error'],SORT_NUMERIC);
arsort($files['size'],SORT_NUMERIC);
    
    
    foreach ($files['name'] as $key => $value) {
        if ($files['name'][$key]) {
            $file = array(
            'name'     => $files['name'][$key],
            'type'     => $files['type'][$key],
            'tmp_name' => $files['tmp_name'][$key],
            'error'    => $files['error'][$key],
            'size'     => $files['size'][$key]
            );

            $_FILES = array("upload_attachment" => $file);

            foreach ($_FILES as $file => $array) {
                $newupload = insert_attachment($file,$post_id);
            }                                   
        }
    }
}

ふ~、危なかった!こんな感じでどうでしょうか?

初夏のJavaScript祭 in サーキュレーションビル ForPro