WordPress3.5になってからメディアアップローダーが大幅に変更された。その影響で、メディアアップローダーを使うプラグイン「Custom Field GUI Utility3」にも不具合が発生した。
Custom Field GUI Utility3の画像アップロードフィールドは、旧型メディアアップローダーに対して「カスタムフィールドに挿入」ボタンを追加する仕組みになっているため、新型メディアアップローダーが表示されても「カスタムフィールドに挿入」ボタンが表示されず、入力ができないのだ。そのため、Custom Field GUI Utility3の画像アップロードフィールドから画像をアップロードするときには、旧型メディアアップローダーが表示されるように修正する必要がある。
修正内容
cfg-utility.php
画像アップロードフィールドのアップロードボタンの表示は、WordPressの標準のメディアアップローダーを呼び出し利用する仕組みになっている。WordPress3.5においては標準のメディアアップローダー=新型メディアアップローダーとなるので、標準ではなく、オリジナルのボタンを表示させるように修正する必要がある。
そこで、次に挙げる2つの関数(insert_head、make_textform)を修正する。ここでは「画像アップロード」という太字文字列を表示させ、それをボタンとして利用するようにしている(合わせてCSSも修正し、それっぽいボタンにしたほうが良いかも)。
元のコード
/* 管理画面のhead要素でCSSとJavaScriptファイルの読み込み */ function insert_head () { $plugin_url = get_bloginfo('wpurl') . '/wp-content/plugins/custom-field-gui-utility/'; $head = <<< EOD <link rel="stylesheet" href="{$plugin_url}facebox/facebox.css" type="text/css" media="all" /> <link rel="stylesheet" href="{$plugin_url}cfg-utility.css" type="text/css" media="all" /> <link rel="stylesheet" href="{$plugin_url}exValidation/css/exvalidation.css" type="text/css" /> <script type="text/javascript" src="{$plugin_url}facebox/facebox.js"></script> <script type="text/javascript" src="{$plugin_url}exValidation/js/exvalidation.js"></script> <script type="text/javascript" src="{$plugin_url}exValidation/js/exchecker-ja.js"></script> <script type="text/javascript" src="{$plugin_url}cfg-utility.js"></script> <script type="text/javascript"> jQuery(function($){ $("form#post").exValidation(); }); </script> EOD; echo $head; }
変更後のコード
/* 管理画面のhead要素でCSSとJavaScriptファイルの読み込み */ function insert_head () { $plugin_url = get_bloginfo('wpurl') . '/wp-content/plugins/custom-field-gui-utility/'; $admin_url = admin_url(); $head = <<< EOD <link rel="stylesheet" href="{$plugin_url}facebox/facebox.css" type="text/css" media="all" /> <link rel="stylesheet" href="{$plugin_url}cfg-utility.css" type="text/css" media="all" /> <link rel="stylesheet" href="{$plugin_url}exValidation/css/exvalidation.css" type="text/css" /> <script type="text/javascript" src="{$plugin_url}facebox/facebox.js"></script> <script type="text/javascript" src="{$plugin_url}exValidation/js/exvalidation.js"></script> <script type="text/javascript" src="{$plugin_url}exValidation/js/exchecker-ja.js"></script> <script type="text/javascript" src="{$plugin_url}cfg-utility.js"></script> <script type="text/javascript"> jQuery(function($){ $("form#post").exValidation(); if ( $( 'b.add_image' ).length ) { $('b.add_image').live('click', function(){ // show the thickbox tb_show( 'ファイルをアップロード', '{$admin_url}media-upload.php?post_id=&TB_iframe=1' ); return false; }); } }); </script> EOD; echo $head; }
元のコード
/* input[type=text]系のカスタムフィールドのボックスの中身を生成する */ function make_textform ($param) { $post_id = $param['post_id']; $meta_key = $param['meta_key']; $type = $param['type']; $class = $param['class']; $default = $param['default']; $size = $param['size']; $sample = $param['sample']; $fieldname = $param['fieldname']; $must = $param['must']; $placeholder = $param['placeholder']; $validation = $param['validation']; $name = 'cfg_' . sanitize_name($meta_key); $meta_value = get_post_meta($post_id, $meta_key, true); if (!empty($meta_value) or strval($meta_value) === '0') { $value = esc_attr($meta_value); } elseif (!empty($default) || $default == 0) { $value = esc_attr($default); } else { $value = ''; } $input = make_input ($name, $value, $size, $default, 'text', $placeholder, $validation); $media_buttons = ''; ob_start(); do_action('media_buttons'); $media_buttons = ob_get_contents(); ob_end_clean(); if ($type == 'textfield') { $inside = <<< EOF <p class='cfg_input'>$input</p> EOF; $out = make_element ($name, $type, $class, $inside, $sample, $fieldname, $must); } elseif ($type == 'imagefield') { $inside = <<< EOF <p class="cfg_input"> $input <img class="cancel" src="" width="16" height="16" style="display:none;" /> <span class="thumb" id="{$name}_thumb"> <a href="#" class="image" rel="facebox"></a> </span> </p> <p class="cfg_add_media_pointer">{$media_buttons}</P> EOF; $out = make_element ($name, $type, $class, $inside, $sample, $fieldname, $must); } elseif ($type == 'filefield') { $inside = <<< EOF <p class="cfg_input"> $input <img class="cancel" src="" width="16" height="16" style="display:none;" /> </p> <p class="cfg_add_media_pointer">{$media_buttons}</P> EOF; $out = make_element ($name, $type, $class, $inside, $sample, $fieldname, $must); } return $out; }
変更後のコード
/* input[type=text]系のカスタムフィールドのボックスの中身を生成する */ function make_textform ($param) { $post_id = $param['post_id']; $meta_key = $param['meta_key']; $type = $param['type']; $class = $param['class']; $default = $param['default']; $size = $param['size']; $sample = $param['sample']; $fieldname = $param['fieldname']; $must = $param['must']; $placeholder = $param['placeholder']; $validation = $param['validation']; $name = 'cfg_' . sanitize_name($meta_key); $meta_value = get_post_meta($post_id, $meta_key, true); if (!empty($meta_value) or strval($meta_value) === '0') { $value = esc_attr($meta_value); } elseif (!empty($default) || $default == 0) { $value = esc_attr($default); } else { $value = ''; } $input = make_input ($name, $value, $size, $default, 'text', $placeholder, $validation); $media_buttons = ''; $media_buttons = '<b class="add_image">画像アップロード</b>'; /* ob_start(); do_action('media_buttons'); $media_buttons = ob_get_contents(); ob_end_clean(); */ if ($type == 'textfield') { $inside = <<< EOF <p class='cfg_input'>$input</p> EOF; $out = make_element ($name, $type, $class, $inside, $sample, $fieldname, $must); } elseif ($type == 'imagefield') { $inside = <<< EOF <p class="cfg_input"> $input <img class="cancel" src="" width="16" height="16" style="display:none;" /> <span class="thumb" id="{$name}_thumb"> <a href="#" class="image" rel="facebox"></a> </span> </p> <p class="cfg_add_media_pointer">{$media_buttons}</P> EOF; $out = make_element ($name, $type, $class, $inside, $sample, $fieldname, $must); } elseif ($type == 'filefield') { $inside = <<< EOF <p class="cfg_input"> $input <img class="cancel" src="" width="16" height="16" style="display:none;" /> </p> <p class="cfg_add_media_pointer">{$media_buttons}</P> EOF; $out = make_element ($name, $type, $class, $inside, $sample, $fieldname, $must); } return $out; }
cfg-utility.js
PHPファイルを修正し、表示するボタンが変更されたので、JSファイルに書いてある「標準メディアアップローダーのボタンを押したとき」という部分を「オリジナルのメディアアップローダーのボタンを押したとき」に変更する。
元のコード
// アップロードボタンを調整 [start] $('p.cfg_add_media_pointer a.add_media').addClass('cfg_add_media_clone').removeAttr('id'); // アップロードボタンを調整 [end] // イメージフィールド・ファイルフィールド周りのliveイベントを設定 [start] $('a.cfg_add_media_clone').on('click', function(){
変更後のコード
// アップロードボタンを調整 [start] // $('p.cfg_add_media_pointer a.add_media').addClass('cfg_add_media_clone').removeAttr('id'); // アップロードボタンを調整 [end] // イメージフィールド・ファイルフィールド周りのliveイベントを設定 [start] // $('a.cfg_add_media_clone').on('click', function(){ $('b.add_image').on('click', function(){
以上でアップロードできるようになる。