ようこそのお運びで、厚く御礼申し上げます。
29日目です。まだまだ前回に引き続きカスタムフィールドです。
テキスト、セレクトボックス、ラジオボタン、チェックボックスをしました。
で、今回は画像・写真を追加してみます。
※基本的なことは25日目の記事とおなじですので読み飛ばしてもかまいません。
※2014/4/13に修正版を追加しました。
新しく修正版を作成したので、こちらの記事もご確認ください。
はじめに。今回はメディアアップローダーを使う。
どうせなので、メディアアップローダーを使えるようにしたいと思います。
今回、自力ではやっぱりわからなかったので、以下のサイト・サンプルを参考にさせて頂きました。
Firegoby - WordPress Plugins & Tips:WordPress 3.5の新メディアアップローダーを自作プラグインやテーマに組み込む。
新しくカスタムフィールド枠を追加設定してみる(画像・写真)。
画像・写真ファイルを複数登録できるカスタムフィールド枠を、標準のものとは別に追加してみます。
今回も記事ページ本文の頭に追加するようにしています。
標準のカスタムフィールドはこんな感じなので、
これを、メディアアップローダで選択することで、以下のような項目にしてみたいと思います。
ちなみに、メディアアップローダーはこんな感じで。
表示はとりあえずこんな感じで行きます。
まずは、function.phpに書いてみます(でも今回はjsファイルも別に作成)。
ではまず、function.phpに以下のコードを書きました。
function.php
//表示用(今回は本文の先頭に表示するようにしています) add_filter('the_content','paka3_custom'); //投稿ページへ表示するカスタムボックスを定義する add_action('admin_menu', 'add_custom_inputbox'); //入力したデータの更新処理 add_action('save_post', 'save_custom_postdata'); //################################# //表示用 //################################# function paka3_custom($contentData){ if(is_single()){ //IDを取得 $id = get_the_ID(); //カスタムフィールドの値取得 $custom = get_post_meta($id, "paka3image", true); //スタイルシート+html $html=<<<EOS <style type="text/css"> #paka3images { float:left;overflow:hidden; height: 150px; } #paka3images img { max-width: 140px; max-height: 140px; border: 1px solid #cccccc; } .paka3ImageEnd{ clear:left } </style> <h4>今日のナイスショット!</h4> <div id="paka3images"> EOS; //出力処理 foreach($custom as $img){ $html.="<img src={$img} />"; } $html.="</div><br class=paka3ImageEnd>"; return $html.$contentData; } } //################################# //投稿ページ用 //################################# //投稿ページに表示される"入力欄その1"の設定 function add_custom_inputbox() { add_meta_box( 'paka3id', '入力欄その1', 'paka3_custom_field', 'post', 'normal' ); add_action('admin_print_scripts', 'admin_scripts'); } //投稿ページに表示されるカスタムフィールド function paka3_custom_field(){ $id = get_the_ID(); //カスタムフィールドの値を取得 $paka3image = get_post_meta($id,'paka3image',true); $imgHtml=""; foreach($paka3image as $akey => $img){ $imgHtml.=<<<EOS <div id="img_{$akey}"> <a href="#" class="paka3image_remove">削除する</a> <br /><img src='{$img}'/> <input type='hidden' name='paka3image[]' value='{$img}' /> </div> EOS; } echo <<<EOS <style type="text/css"> #paka3images div{ float:left; margin: 10px; height: 120px; overflow:hidden; } #paka3images img{ max-width: 100px; max-height: 100px; border: 1px solid #cccccc; } .paka3ImageEnd{ clear:left } </style> <div class="wrap"> <button id="paka3media" type="button">画像を選択</button> <div id="paka3images">{$imgHtml}</div> <div class="paka3ImageEnd"></div> </div> EOS; } function admin_scripts(){ wp_enqueue_media(); // メディアアップローダー用のスクリプトをロードする // カスタムメディアアップローダー用のJavaScript wp_enqueue_script( 'my-media-uploader', //**javasctiptの指定 //*プラグインにしたとき //plugins_url("paka3-uploader.js", __FILE__), //*function.phpに記入した場合 get_bloginfo( 'stylesheet_directory' ) . '/paka3-uploader.js', array('jquery'), filemtime(dirname(__FILE__).'/paka3-uploader.js'), false ); } //################################# //更新処理 //################################# /*投稿ボタンを押した際のデータ更新と保存*/ function save_custom_postdata($post_id){ //入力した値(postされた値) $paka3image=isset($_POST['paka3image']) ? $_POST['paka3image']: null; //DBに登録してあるデータ $paka3image_ex = get_post_meta($post_id, 'paka3image', true); if($paka3image){ update_post_meta($post_id, 'paka3image',$paka3image); }else{ delete_post_meta($post_id, 'paka3image',$paka3image_ex); } }
Javasctiptファイル(paka3-uploader.js)を作成します。
jQuery(document).ready(function($){ var custom_uploader; /*##############################*/ /* 画像選択ボタンがクリックされた場合の処理。*/ /*##############################*/ $('#paka3media').click(function(e) { e.preventDefault(); if (custom_uploader) { custom_uploader.open(); return; } custom_uploader = wp.media({ title: 'Choose Image', // 以下のコメントアウトを解除すると画像のみに限定される。 library: { type: 'image' }, button: { text: 'Choose Image' }, multiple: true // falseにすると画像を1つしか選択できなくなる }); custom_uploader.on('select', function() { var images = custom_uploader.state().get('selection'); var date = new Date().getTime(); images.each(function(file){ img_id = file.toJSON().id+"_"+date; $('#paka3images').append('<div id=img_'+ img_id +'></div>') .find('div:last').append('<a href="#" class="paka3image_remove">削除する</a><br />' +'<input type="hidden" name="paka3image[]" value="'+file.toJSON().url+'" />' +'<img src="'+file.toJSON().url+'" />'); }); }); custom_uploader.open(); }); /*##############################*/ /* 削除がクリックされた場合の処理。*/ /*##############################*/ $( ".paka3image_remove" ).live( 'click', function( e ) { e.preventDefault(); e.stopPropagation(); img_obj = $(this).parent(); if(img_obj.length >0){ img_obj.remove(); } }); });
ポイントはどこ?
大きく分けて3つの処理「カスタムフィールドの値を表示」と「カスタムフィールド枠の追加」「更新処理」にわけています。
※「カスタムフィールドの値を表示」はテンプレートでも処理が可能です。
で、今回はメディアアップローダを使っていますので、「メディアアップローダの呼び出し処理」が追加されます。
また、今回は二つのファイルを用意する必要があります。
まず、function.phpの処理
- カスタムフィールドの値を表示します。
the_contentをフィルターフックしています。//表示用(今回も本文の先頭に表示するようにしています) add_filter('the_content','paka3_custom');
変数名:paka3imageの値を取得して、表示の処理を行います。
//################################# //表示用 //################################# function paka3_custom($contentData){ if(is_single()){ //IDを取得 $id = get_the_ID(); //カスタムフィールドの値取得 $custom = get_post_meta($id, "paka3image", true); //スタイルシート+html $html=<<<EOS <style type="text/css"> /*表示するCSSの設定。説明は省略*/ </style> <h4>今日のナイスショット!</h4> <div id="paka3images"> EOS; //出力処理 foreach($custom as $img){ $html.="<img src={$img} />"; } $html.="</div><br class=paka3ImageEnd>"; return $html.$contentData; } }
- 管理画面の投稿ページにカスタムフィールドの枠を追加します。
//投稿ページへ表示するカスタムボックスを定義する //WordPressに「新しいページを作ったよー」ってお知らせする命令。 add_action('admin_menu', 'add_custom_inputbox');
- 投稿ページにadd_meta_boxを使ってカスタムセクションを追加します。
(add_meta_box:WordPress Codex参照)
管理画面にメディアアップローダのjavascriptを呼び出すために、admin_print_scriptsを使って、ファイルを指定します。
(admin_print_scripts:WordPress Codex参照)//################################# //投稿ページ用 //################################# //投稿ページに表示される"入力欄その1"の設定 function add_custom_inputbox() { add_meta_box( 'paka3id', '入力欄その1', 'paka3_custom_field', 'post', 'normal' ); add_action('admin_print_scripts', 'admin_scripts'); }
- 表示される内容(カスタムフィールド)を設定する。
保存されている値はget_post_metaで取得をします。
(get_post_meta:WordPress Codex 参照)
画像選択ボタンと、画像を表示するボックス、削除ボタンを設定します。 -
- 画像選択ボタン:id=paka3media
- 画像を表示するボックス:id=paka3images
- 削除するボタン(リンク):class=paka3image_remove
//投稿ページに表示されるカスタムフィールド function paka3_custom_field(){ $id = get_the_ID(); //カスタムフィールドの値を取得 $paka3image = get_post_meta($id,'paka3image',true); $imgHtml=""; foreach($paka3image as $akey => $img){ $imgHtml.=<<<EOS <div id="img_{$akey}"> <a href="#" class="paka3image_remove">削除する</a> <br /><img src='{$img}'/> <input type='hidden' name='paka3image[]' value='{$img}' /> </div> EOS; } echo <<<EOS <style type="text/css"> /*CSSの設定:説明は省略*/ </style> <div class="wrap"> <button id="paka3media" type="button">画像を選択</button> //画像の表示ボックス <div id="paka3images">{$imgHtml}</div> <div class="paka3ImageEnd"></div> </div> EOS; }
メディアアップローダーのスクリプトの呼び出し、また、今回カスタムフィールドで画像の追加・削除等を操作するスクリプトを呼び出します。
function admin_scripts(){ wp_enqueue_media(); // メディアアップローダー用のスクリプトをロードする // カスタムメディアアップローダー用のJavaScript wp_enqueue_script( 'my-media-uploader', //**javasctiptの指定 //*プラグインにしたとき //plugins_url("paka3-uploader.js", __FILE__), //*function.phpに記入した場合 get_bloginfo( 'stylesheet_directory' ) . '/paka3-uploader.js', array('jquery'), filemtime(dirname(__FILE__).'/paka3-uploader.js'), false ); }
- データを更新した場合の処理を行います。
save_post(投稿・ページが作成・更新された際に実行)をアクションフック//入力したデータの更新処理 add_action('save_post', 'save_custom_postdata');
- ページが保存される際に「入力された値」と、「保存してある値」を取得します。
「入力された値」があれば、update_post_metaで更新処理を行います。
「入力された値」がなければ、delete_post_metaで削除処理を行います(※処理の仕方によってはいらないかも)。//################################# //更新処理 //################################# /*投稿ボタンを押した際のデータ更新と保存*/ function save_custom_postdata($post_id){ //入力した値(postされた値) $paka3image=isset($_POST['paka3image']) ? $_POST['paka3image']: null; //DBに登録してあるデータ $paka3image_ex = get_post_meta($post_id, 'paka3image', true); if($paka3image){ update_post_meta($post_id, 'paka3image',$paka3image); }else{ delete_post_meta($post_id, 'paka3image',$paka3image_ex); } }
次に、javascript側、paka3-uploader.jsの処理
- 処理を書いていきます。custom_uploader.on('select', function() {}の部分に処理を書いていきます。
custom_uploader.on('select', function() { //選択した画像の情報を取得 var images = custom_uploader.state().get('selection'); //ID用に時間を取得(設定しなくてもよい) var date = new Date().getTime(); //作成したカスタムフィールドの枠に画像と保存する値を入れていきます。 images.each(function(file){ img_id = file.toJSON().id+"_"+date; //ひとつひとつの画像と値は、divで囲んでいます。 //まず、divを作成 $('#paka3images').append('<div id=img_'+ img_id +'></div>') //そのdivの子要素に画像とhiddenの値、後削除ボタンを入れます。 //削除ボタンにはclass=paka3image_removeを設定します。 .find('div:last').append('<a href="#" class="paka3image_remove">削除する</a><br />' +'<input type="hidden" name="paka3image[]" value="'+file.toJSON().url+'" />' +'<img src="'+file.toJSON().url+'" />'); }); });
- 削除がクリックされた場合の処理を$( ".paka3image_remove" ).live( 'click', function( e ) {}の部分に書いていきます。削除ボタンにはクラス:paka3image_removeを設定しています。
/*##############################*/ /* 削除がクリックされた場合の処理。*/ /*##############################*/ $( ".paka3image_remove" ).live( 'click', function( e ) { e.preventDefault(); e.stopPropagation(); img_obj = $(this).parent(); if(img_obj.length >0){ img_obj.remove(); } });
コードをプラグイン用のファイルにします
それではfunction.phpに書いたコードを消して、
「paka3_new_custom_field_img.php」というファイルに書き込みます。
その際、javascriptの指定の部分を1箇所書き換えてください。
//**javasctiptの指定 //*プラグインにしたとき plugins_url("paka3-uploader.js", __FILE__), //*function.phpに記入した場合 //get_bloginfo( 'stylesheet_directory' ) . '/paka3-uploader.js',
また作成した「paka3-uploader.js」を同じディレクトリにいれます。このファイルを[wp-content]>「plugins」ディレクトリに入れ、管理画面で有効にして完了です。
今回のまとめ
今回はカスタムフィールド+メディアアップローダーという合わせ技ではありましたが、なんとかできました。といかスニペットどころか・・・ってことになってしまいましたね。エラー処理や、見た目はまだまだ何とかなりそうな気がしますが、今回はこんなところでどうでしょう。