【wordpressカスタマイズ】media_handle_upload()を使って画像投稿する自作フォームの作り方

前回、自作のフォームから記事を投稿する機能を作りました。
【wordpressカスタマイズ】自作フォームから記事を投稿!wp_insert_post()の使い方

でも、これだけだと機能が寂しいので画像をアップロードしてアイキャッチ画像として設定できる機能を追加します。

今回もシングルページアプリケーションとしてテーマのサンプルを作りましたので、興味がある人はダウンロードしてください。

media_handle_upload()を使ったメディア投稿機能

wp_insert_post()では画像の投稿はできません。

wordpressは画像をの投稿タイプがattachmentとして完全に別れています。

メディアにファイルをアップロードするとすべてattachmentの投稿タイプに保存されるのです。

画像を投稿する関数もいくつかあります。

外部から投稿するための関数は、wp_insert_attachment()とmedia_handle_upload()が使えそうですが、formからpostして投稿する場合、media_handle_upload()が便利です。

ここまでのことができれば、wordpressの管理画面を使わずに、完全オリジナルの管理画面を作り込んでいくこともできそうですね。

public function set_attachment()
{
   if (!empty($_FILES['my_image_upload'])) {
       require_once(ABSPATH . 'wp-admin/includes/image.php');
       require_once(ABSPATH . 'wp-admin/includes/file.php');
       require_once(ABSPATH . 'wp-admin/includes/media.php');
       $this->attachment_id = media_handle_upload('my_image_upload', 0);
       if (is_wp_error($this->attachment_id)) {
           $this->attachment_id = false;
       }
   }
}

require_pnceで3つ持ってくる必要がありますが、media_handle_upload()にinputで設定したnameを記述するだけでOKです。

めんどくさいことは一切必要なく、めちゃくちゃ簡単にアップロードできるのです。

戻り値はattachmentのIDが返ってきますが、投稿に失敗するとWP_Errorでエラー内容が返ってきます。

wp_insert_post()をする前に画像投稿の関数実行

wp_insert_post()の使い方は前の記事と重複しますが省きますが、wp_insert_post()を実行する前に、先程の画像投稿関数を実行させます。

順番は後でも良いのですがね。

とりあえず両方とも、記事と画像両方の投稿に成功したら、set_post_thumbnail()という関数を利用してアイキャッチ画像の設定をします。

記事のIDと画像のIDを入れるだけでアイキャッチとして紐付けできます。

//インサート
public function set_insert_post()
{
    //postデータのチェック
    if (!empty($_POST['my-nonce-filed'])
    && !empty($_POST['title'])
    && !empty($_POST['contnet'])
    && !empty($_POST['cats'])
    && wp_verify_nonce($_POST['my-nonce-filed'], 'my-nonce')
    ) {
        $this->set_attachment();
        $my_post = array(
            'post_title' => $_POST['title'],
            'post_content' => $_POST['contnet'],
            'post_status' => 'publish',
            'post_author' => 1,
            'post_category' => $_POST['cats']
        );

        //投稿をデータベースへ追加
        $this->post_id = wp_insert_post($my_post);

        //アイキャッチ画像設定
        if ($this->attachment_id && $this->post_id) {
            set_post_thumbnail($this->post_id, $this->attachment_id);
        }

        //成功したらリダイレクト
        if ($this->post_id) {
            session_destroy();
            wp_redirect(home_url());
            exit;
        }
    } else {
        $_SESSION['insert_error'] = true;
    }
}

画像を使った外部フォームの投稿機能は以上となります。

参考までにテーマファイルもダウンロードできるようにしておきますので、興味がございましたらご自由に御覧ください。

wordpressはとても便利です。

できることが限られるから使いたくないと言う人もいるのですが、ちゃんと仕組みを理解していればできないことはないです。

そもそも、PHPでできてるし改変しやすいと思います。

僕はwordpressに関してはWeb業界に入ったときからずっと利用させてもらっているので、自信をもって得意だと言えます。

今回の内容小さなことでも質問、ございましたらお気軽にお声掛けください。

正社員という奴隷制度に中指を立てるWebエンジニアです。PHPが得意。繋がれた鎖を断ち切るために、自由を取り戻すために、プログラミングスキルを磨く日々です。プログラミングと個人でもできるビジネスについて、情報発信しています。

詳しくはこちら