WordPressのカスタム設定画面に画像をアップロード機能を実装する方法。使い回せるように関数化しました。

先日、Wordpress開発をしているとき、カスタム設定画面にアップロード機能を実装する必要が出てきました。

なのでいろいろと調べてみたところ、アップロード機能を実装する方法として、いろいろな手段がありました。

その中の実装方法を色々検討してみた結果、最も手軽かつ使い勝手がよかったメディアアップローダー実装方法がこちら。

上記記事は、非常に分かりやすく書かれており、とても参考にさせていただきました。

動作イメージとしてはこんな感じです。

アップロード機能の動作イメージ

画像は、画像IDではなくURLを取得する仕様に変更しています。

記事に紹介されていた方法は、アップロード機能をカスタム設定画面に1つだけ設定するには、最善の手法だと思います。

ただ、アップロード機能を複数設定画面に設置しようと思っている場合は、機能が増えるたびに、JavaScriptをファイルを機能分だけ作成する必要があります(良い方法があるのかもしれないけど)。

なので、「カスタム設定画面に画像アップローダーを設置するコード」を関数化して、何回でも使い回せるような関数を書いてみました。

これで、アップロード機能を複数実装する場合でも、手軽に機能追加できるようになりました。

以下では、そのコードとともに実装方法も紹介したいと思います。

スポンサーリンク
レクタングル(大)広告

主な手順

画像アップローダー機能を実装する主な手順は、以下となります。

  1. WordPressのカスタム設定画面を作成する
  2. functions.phpにアップロードフォーム生成関数を書く
  3. カスタム設定画面でアップローダー生成関数を実行する
  4. メディアアップローダの javascript API を管理画面で読み込む

既に、カスタム設定画面が実装された開発環境があるのであれば、結構簡単に画像アップロード機能を実装できるかと思います。

WordPressのカスタム設定画面を作成する

今回紹介する画像アップローダーの実装方法は、Wordpressのカスタム設定画面に設置するのを前提とした方法です。

なので実装を行うには以下に書かれている方法を用いて、カスタム設定画面を作成しておく必要があります。

こっちの方が分かりやすいかも。

WordPress 一般ユーザ向けの「サイト設定」のカスタムメニューを作成する | hijiriworld Web

ただ、当記事の主目的は「カスタム設定画面に画像アップロード機能の実装」です。なので、今回は「カスタム設定画面の実装方法」については詳しく書かず、割愛させていただこうと思います(長くなりすぎるので)。

ですので、今回紹介するコードは、上記リンクにあるような「カスタム設定画面」がしっかりと実装されているのを前提として説明したいと思います。

紹介するコードだけ利用した場合は、設定値の保存などはされません。また、うまく動作しなかったとしても「カスタム設定画面の実装方法」や「動作しない」といった質問にお答えするのは非常に困難です。もし、コメントで質問があったとしてもお答えできないと思うのでご了承ください。

というわけで以下は、カスタム設定画面の実装を自前で行うことが出来る方向けの説明となります。

functions.phpにアップロードフォーム生成関数を書く

カスタム設定画面が実装できたら、以下のコードをfunctions.phpに貼り付けます。

//画像アップロード用のタグを出力する
function generate_upload_image_tag($name, $value){?>
  <input name="<?php echo $name; ?>" type="text" value="<?php echo $value; ?>" />
  <input type="button" name="<?php echo $name; ?>_slect" value="選択" />
  <input type="button" name="<?php echo $name; ?>_clear" value="クリア" />
  <div id="<?php echo $name; ?>_thumbnail" class="uploded-thumbnail">
    <?php if ($value): ?>
      <img src="<?php echo $value; ?>" alt="選択中の画像">
    <?php endif ?>
  </div>


  <script type="text/javascript">
  (function ($) {

      var custom_uploader;

      $("input:button[name=<?php echo $name; ?>_slect]").click(function(e) {

          e.preventDefault();

          if (custom_uploader) {

              custom_uploader.open();
              return;

          }

          custom_uploader = wp.media({

              title: "画像を選択してください",

              /* ライブラリの一覧は画像のみにする */
              library: {
                  type: "image"
              },

              button: {
                  text: "画像の選択"
              },

              /* 選択できる画像は 1 つだけにする */
              multiple: false

          });

          custom_uploader.on("select", function() {

              var images = custom_uploader.state().get("selection");

              /* file の中に選択された画像の各種情報が入っている */
              images.each(function(file){

                  /* テキストフォームと表示されたサムネイル画像があればクリア */
                  $("input:text[name=<?php echo $name; ?>]").val("");
                  $("#<?php echo $name; ?>_thumbnail").empty();

                  /* テキストフォームに画像の URL を表示 */
                  $("input:text[name=<?php echo $name; ?>]").val(file.attributes.sizes.full.url);

                  /* プレビュー用に選択されたサムネイル画像を表示 */
                  $("#<?php echo $name; ?>_thumbnail").append('<img src="'+file.attributes.sizes.full.url+'" />');

              });
          });

          custom_uploader.open();

      });

      /* クリアボタンを押した時の処理 */
      $("input:button[name=<?php echo $name; ?>_clear]").click(function() {

          $("input:text[name=<?php echo $name; ?>]").val("");
          $("#<?php echo $name; ?>_thumbnail").empty();

      });

  })(jQuery);
  </script>
  <?php
}

generate_upload_image_tag関数は、$nameと$valueの2つの引数を取ります。

$nameは、設定項目名を入力します。

$valueには値(今回は前回アップロードした画像のURL)を入れます。

この関数を用いて、アップロードされた画像は、「画像URL」としてWordpressデータベースに保存されるという仕様です。

名前と値を入力するだけで使えるので、結構簡単に実装できるようになるのではないでしょうか。

1つ機能を実装するたびに、JavaScriptコードがカスタム設定画面に埋め込まれるという仕様になります。

参考 WordPressの管理画面内でメディアアップローダーを呼び出す | work.log

カスタム設定画面でアップローダー生成関数を実行する

あとは、カスタム設定画面用のPHPファイルに対して、実行コードを書きます。

例えば、ホーム画面に設定する画像をアップロードするのであれば、以下のようにコードを書きます。

<?php
  generate_upload_image_tag('home_image_url', get_option('home_image_url'));
?>

この時点で、カスタム設定画面をブラウザ表示すると、以下のようなインターフェースが表示されます。

カスタム設定画面にアップロード機能を実装した例

この時点では、まだ完全に動作しません。

メディアアップローダの javascript API を管理画面で読み込む

最後に、functions.phpに対して以下のコードを書いて、Wordpress管理画面で「メディアアップローダーのJavaScript API」を読み込む処理を書きます。

function my_admin_scripts() {
  //メディアアップローダの javascript API
  wp_enqueue_media();
}
add_action( 'admin_print_scripts', 'my_admin_scripts' );

上記コードを書かないと、メディアアップローダーが起動しないのでご注意ください。

これで、画像アップローダーを設置するための作業は終了です。

動作確認

あとは、カスタム設定画面で、画像の選択を行えば、テキスト入力ボックスに画像URLが反映されます。

カスタム設定画面で画像アップローダーの動作イメージ

もちろん、メディアアップローダーに対して画像ファイルをドラッグ&ドロップすれば、ファイルをアップロードして選択することも可能です。

まとめ

こんな感じで、「メディアアップローダーJavaScript API」を利用することで、画像アップローダー機能を比較的手軽に実装することができます。

僕も、「画像アップローダーの実装」を行うに当たって、様々な方法を調べてみたのですが、この方法が最も手軽かつ、利用者的にも利便性の高いものだと感じました。

また今回、関数化したことにより、カスタム設定画面で何回でも手軽に使いまわしが出来るようになり、開発を簡略化することもできました。

というわけで、「手軽にカスタム設定画面に画像アップローダー機能を実装したい」なんて場合には、それなりに便利な方法かと思います。

今回の方法で画像アップローダー機能をカスタム設定画面に実装すると、メディアアップローダーを利用するためのJavaScriptは、直接HTML内に埋め込まれる仕様となっているのでご注意ください。

『WordPressのカスタム設定画面に画像をアップロード機能を実装する方法。使い回せるように関数化しました。』へのコメント

  1. 名前:yana 投稿日:2018/02/15(木) 01:02:12 ID:3e43d4c09

    だと思います。

    一瞬ビックリしました。

    実装できました!
    ありがとうございます。

  2. アバター画像 名前:わいひら 投稿日:2018/02/17(土) 15:07:19 ID:e1dabdba0

    すいません。
    もしかしたら、書き込みの際にタグが除去されてしまったのかもしれません。

    もしかしたら、どこかおかしかったのかもしれませんが、実装できたようでよかったです!

  3. 名前:Lognote 投稿日:2018/04/03(火) 17:08:29 ID:aa5cb0ef7

    自作テーマ作成にあたり、参考にさせていただきました。
    いつもありがとうございます。

    わたしもエラーになった箇所を指摘させていただきますと、生成している関数はgenelate_upload_image_tagですが、実行しているのはgenelate_upload_imageになってしまっています。

    どちらかに統一させないといけないですね。

  4. アバター画像 名前:わいひら 投稿日:2018/04/04(水) 10:52:12 ID:8b89f2964

    なるほど。最初の書き込みはそれの指摘だったんですね。
    教えていただき、ありがとうございます!早速修正しておきました。

    しかも、先程見て気づいたんですが、genelateもつづりが間違っていて、generateですね^^;
    こちらも併せて修正しておきました。

  5. 名前:圭吾 投稿日:2018/04/18(水) 14:13:08 ID:404bccb4c

    いつも参考にさせて頂いております。
    こちらのアップローダーを同一ページ内で複数利用しており、
    その内の1つを、add_image_sizeで指定したオリジナルサイズのものにしたいのですが、サイズを決めることはできないでしょうか?

  6. アバター画像 名前:わいひら 投稿日:2018/04/19(木) 12:33:52 ID:81a8abb69

    もちろん、Wordpress関数とPHPを駆使すれば出来ないことはないかと思います。
    ただ、それなりに労力(開発コスト)はかかる実装かと思います。

  7. 名前:ガタガタ 投稿日:2020/03/24(火) 15:14:27 ID:adb043c99

    いつも参考にさせていただいています。

    こちらの記事や、参考リンクの記事のとおりに自作テーマ用の設定ページを作ろうとしています。
    画像のアップロード、保存するところまではうまくいったのですが、
    画像をクリアして保存することができません。
    (テキストボックスは空になるが、保存をクリックして画面がリロードされたときには空にする前の状態に戻ってしまいます)
    もしも原因に心当たりがおありでしたら、教えていただければ幸いです。
    よろしくお願いいたします。

  8. アバター画像 名前:わいひら 投稿日:2020/03/26(木) 11:17:51 ID:7bc73a9c6

    本文内の注意書きにも以下のように書かれているように、この記事の方法は、あくまでアップロード機能のインターフェースのサンプルコードです。

    紹介するコードだけ利用した場合は、設定値の保存などはされません。また、うまく動作しなかったとしても「カスタム設定画面の実装方法」や「動作しない」といった質問にお答えするのは非常に困難です。もし、コメントで質問があったとしてもお答えできないと思うのでご了承ください。

    僕自身、どのようなあ保存機能を実装したのかは実物を見たわけではなく分からないので、なぜそのような動作になっているのかは分からないです。

  9. 名前:ガタガタ 投稿日:2020/03/28(土) 10:31:49 ID:7f712adee

    お忙しい中、ご返信ありがとうございます。
    本文中の注意書きを見落としていたようで、申し訳ありません。
    設定画面の実装方法を変えてみたところ、正常に保存されるようになり自己解決しました。お騒がせしましたm(__)m
    有用な情報ありがとうございました!