WordPressの貧弱なカスタムフィールド機能を飛躍的に便利にするプラグインCustom Field GUI Utility。最近までWordPress3.3に対応しておらず、一部修正して使っていたりしたのですが、WordPress3.3対応版がリリースされたようなので試してみました。
バリデーション機能などの便利な機能が増えていますが、普通に上書きアップロードしてもそのまま使えました。ただ、imagefieldを使っている場合、editor(記事入力欄)が無いと、なぜかメディアアップローダーのボタンがでてこない不具合が。
ググッてみると、フォーラムに同じ症状の方が質問を投げているようですが、解決策は出ていない様子。そこで、Custom Field GUI Utilityのコードを解析してみました。
メディアアップローダーの表示の仕組み
cfg-utility.js
// アップロードボタンをクローン [start] $('#content-add_media').clone(true).addClass('cfg_add_media_clone').removeAttr('id').appendTo('p.cfg_add_media_pointer'); // アップロードボタンをクローン [end]
コードを見ると、JavaScriptでeditorのメディアアップローダーボタンをコピーして持ってきているみたいです。だからeditorが無いと表示されない、というわけですね。
そこで、editorが無くても表示できるように、まずcfg-utility.phpを修正します。
cfg-utility.php
元々のcfg-utility.php。
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"><span style="display:none;">画像を追加:<img alt="画像を追加" src="images/media-button-other.gif" class="cfg_add_media" style="cursor:pointer;" /></span></P> EOF;
次のように修正。メディアアップローダーを直接呼び出すようにします。
EOF; $out = make_element ($name, $type, $class, $inside, $sample, $fieldname, $must); } elseif ($type == 'imagefield') { add_thickbox(); wp_enqueue_script('media-upload'); ob_start(); do_action('media_buttons'); $media_buttons = ob_get_contents(); ob_end_clean(); $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} <span style="display:none;">画像を追加:<img alt="画像を追加" src="images/media-button-other.gif" class="cfg_add_media" style="cursor:pointer;" /></span></P> EOF;
cfg-utility.js
cfg-utility.phpの修正で直接ボタンが表示されるようになったので、cfg-utility.jsもそれに合わせて次のように修正。
// アップロードボタンをクローン [start] $('p.cfg_add_media_pointer a.add_media').addClass('cfg_add_media_clone').removeAttr('id').appendTo('p.cfg_add_media_pointer'); // アップロードボタンをクローン [end]
ついでにtextfieldでdefault=0が効かないのも修正
以前のバージョンではtextfieldでdefault=0としたら初期値0としてきちんと認識されていたのですが、今バージョンになって、default=0の場合、初期値が設定されなくなっていました。確認してみると0 = falseな感じで判定されていたので修正。
cfg-utility.php
$attr_value = ($value || $value==='0') ? " value='$value'": '';
} elseif (!empty($default) || $default === '0') {