詳細仕様は決まっていないのですが、作りたいのは投稿画面に決まったフォーマットのデータを入力させるプラグイン。カスタムフィールドを使えば投稿画面に付加情報を入力することは可能ですが、毎回決まったフォーマットで入力させたい。
このような用途に使える良質なプラグインにCustom Field Templateがありますが、より厳格に入力フォーマットを限定し、さらに2次利用できればなぁと思っているので、自作してみることにします。
と、その前に便利なジェネレータを発見しましたのでご紹介します。
Fun With Plugins
ウィザード形式でプラグイン名など必要事項を入力していくだけで、WordPressのプラグインとしての骨格を作ってくれます。あとは関数などを追加していくだけ。
さて、上述のCustom Field Templateのソースを見ていくと、管理画面に任意の入力フォームを追加しているのはこの2行のようです。
require_once(ABSPATH . 'wp-admin/includes/template.php'); add_meta_box('cftdiv', __('Custom Field Template', 'custom-field-template'), array(&$this, 'insert_custom_field'), 'post', 'normal', 'core');
1行目は、2行目で使用しているadd_meta_box()関数を定義しているファイルなので読み込みは必須のようです。
2行目のadd_meta_box()が管理画面に任意の入力欄を追加しているみたい。Codexのadd_meta_boxのページをみるとそれぞれの引数の意味が分かります。
<?php add_meta_box('id', 'title', 'callback', 'page', 'context', 'priority'); ?>
idが管理画面に出現する入力欄のdivのid属性値。他とかぶらないようにすればよいでしょう。
titleが管理画面に出現する入力欄のタイトル。最初からあるものだと「抜粋」とか「カスタムフィールド」とか表示されている部分です。
callbackがコールバック関数名。ここで指定した関数が呼ばれると、なるほど。
pageはどの画面に追加するのかを指定。投稿ならpost、ページならpage、リンクならを入力。そのままですね。
contextとpriorityはCodexを読んでもよく分かりませんが、無くても通るようなので無視。
と、管理画面に何かを追加できそうなことは分かったので、現時点でいったんプラグインの形にしてみました。
<?php /* Plugin Name: up_test_plugin Plugin URI: [insert the plugin uri here] Description: test Author: u_p Version: 0.1 Author URI: https://www.umbrellaprocess.com/ Generated At: www.wp-fun.co.uk; */ if (!class_exists('up_plugin_test')) { class up_plugin_test { /** * PHP 4 Compatible Constructor */ function up_plugin_test(){$this->__construct();} /** * PHP 5 Constructor */ function __construct(){ require_once(ABSPATH . 'wp-admin/includes/template.php'); add_meta_box('up_test_div', '追加フィールド', array($this, 'add_custom_field'), 'post'); } function add_custom_field(){ echo '追加内容'; } } } //instantiate the class if (class_exists('up_plugin_test')) { $up_plugin_test = new up_plugin_test(); } ?>
結果はこのとおり。
管理画面に新しいパーツを追加できました!
とは言っても、まだ入力欄の形式になっていないのでinputタグなどを出力しないといけない。
セキュリティ上の必要性だと思いますが、Codexのadd_meta_boxのページではnonce値の指定方法が書かれています。これはそのまま使えば良さそうです。表示画面側では以下の隠しフィールドを入れておく(name・id属性値は適宜変更して良いでしょう)。
echo '<input type="hidden" name="myplugin_noncename" id="myplugin_noncename" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />';
入力した値は保存できないと意味がありません。保存するための関数でもnonce値が正しいかどうか判定する必要があるようですが、その部分もCodexから持ってくれば問題なさそうです。
if ( !wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) )) { return $post_id; } if ( 'page' == $_POST['post_type'] ) { if ( !current_user_can( 'edit_page', $post_id )) return $post_id; } else { if ( !current_user_can( 'edit_post', $post_id )) return $post_id; }
っつーことでとりあえず入力欄をひとつ追加してカスタムフィールドに保存するプラグインが出来ました!先は長い!
class up_plugin_test { /** * PHP 4 Compatible Constructor */ function up_plugin_test(){$this->__construct();} /** * PHP 5 Constructor */ function __construct(){ require_once(ABSPATH . 'wp-admin/includes/template.php'); add_meta_box('up_test_div', '追加フィールド', array($this, 'add_custom_field'), 'post'); add_action('save_post', array($this, 'save_custom_field')); } function add_custom_field(){ global $post; // Use nonce for verification echo '<input type="hidden" name="up_test_noncename" id="up_test_noncename" value="' . wp_create_nonce( plugin_basename(__FILE__) ) . '" />'; // The actual fields for data entry echo '<input type="text" name="up_test_field" value="' . get_post_meta($post->ID, 'up_test_field', true) . '" size="25" />'; } function save_custom_field($post_id){ // verify this came from the our screen and with proper authorization, // because save_post can be triggered at other times if ( !wp_verify_nonce( $_POST['up_test_noncename'], plugin_basename(__FILE__) )) { return $post_id; } if ( 'page' == $_POST['post_type'] ) { if ( !current_user_can( 'edit_page', $post_id )) return $post_id; } // OK, we're authenticated: we need to find and save the data $mydata = $_POST['up_test_field']; if (get_post_meta($post_id, 'up_test_field') == "") add_post_meta($post_id, 'up_test_field', $mydata, true); elseif($mydata !=get_post_meta($post_id, 'myplugin_new_field', true)) update_post_meta($post_id, 'up_test_field', $mydata); elseif($mydata=="") delete_post_meta($post_id, 'up_test_field', get_post_meta($post_id,'up_test_field',true)); } }
参考サイト
「[WordPress] プラグインを作ろう(2) 独自のカスタムフィールドを追加する」への1件のフィードバック