投稿ページにカスタムフィールドを追加する

20090501_02

記事の投稿ページに独自のカスタムフィールドを追加する方法です。

公式ドキュメントにサンプルコードがあるのでそちらを参考に手順を追ってみます。ただ、サンプルコードは古いバージョンのWordPressにも対応するようなコードになっているようです。個人的に使うだけの予定なので、古いバージョンは無視してWP2.7のみに対応する簡単なコードに書き換えます。

アクションフック

add_action('admin_menu', 'myplugin_add_custom_box');
add_action('save_post', 'myplugin_save_postdata');

add_action()でアクションフックの設定をします。admin_menuフックに実行したい関数名(例ではmyplugin_add_custom_box)を指定しています。admin_menuフックは「管理画面メニューの基本構造が配置されたあとに実行する」フックになります。

もうひとつは記事を保存したときに実行されるようにフックを設定します。ここで登録している関数myplugin_save_postdataは入力された値をデータベースに保存するための関数です。

次ではここで登録した関数の中身をチェックしていきます。

カスタムフィールドを登録

myplugin_add_custom_box()はカスタムフィールドを登録?するための独自関数です。この関数のなかではadd_meta_box()を使っています。この関数の中身はサンプルを書き換えています。

function myplugin_add_custom_box () {
  add_meta_box( 'myplugin_sectionid', 'My Post Section Title', 'myplugin_inner_custom_box', 'post', 'advanced' );
}

書式

add_meta_box('id', 'title', 'callback', 'page', 'context', 'priority')

パラメータ

id
生成されるフィールドはいくつかのdiv要素で囲まれることになりますが、この一番外側のdiv要素につけるid名のようです。複数のフィールドを追加するときは重複しない名前にしたほうがいいでしょう。
title
フィールドの名前。
callback
ページが出力されたら呼び出される関数。
page
どの編集ページに表示するかを指定します。”post”、”page”、”link”から選びます。記事投稿ページなので”post”。
context
編集ページのどの部分に表示するかの選択(?)。選べる値は”normal”、”advanced”、”side”。”normal”と”advanced”の差がわかりませんが、wysiwygエディタと同じブロックに表示するなら”advanced”、サイドバーは”side”を選択するといいようです。
priority
優先順位。フィールドが呼び出される順番かな?。

コールバック関数に指定したmyplugin_inner_custom_box()で実際に出力する内容を決めます。ようやくですね。

function myplugin_inner_custom_box() {
  global $post;
  echo '<input type="hidden" name="myplugin_noncename" id="myplugin_noncename" value="' .wp_create_nonce( plugin_basename(__FILE__) ) . '" />';
  echo '<label for="myplugin_new_field">フィールド名</label> ';
  echo '<input type="text" name="myplugin_new_field" value="'.get_post_meta($post->ID,'myplugin_new_field',true).'" size="25" />';
}

わかりやすいよう少し書き換え。隠しフィールドの行はよくわかりませんが、ファイル名を元にwp_create_nonce()でランダムな文字を作成し、フォームから正しく投稿された値かどうかを認証してるということでしょうか?この部分はつけていたほうが良さそうですね。

次にラベルとテキストフィールドを出力します。テキストフィールドのname属性がデータベースのフィールド名になるようです。初期値としてget_post_meta()でデータベースから値を取ってくるようになってます。

入力データの保存

function myplugin_save_postdata( $post_id ) {
  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;
  }

  $mydata = $_POST['myplugin_new_field'];

  if (get_post_meta($post_id, $mydata) == "") 
    add_post_meta($post_id, 'myplugin_new_field', $mydata, true);
  elseif($mydata !=get_post_meta($post_id, 'myplugin_new_field', true)) 
    update_post_meta($post_id, 'myplugin_new_field',$mydata);
  elseif($mydata=="") 
    delete_post_meta($post_id, 'myplugin_new_field',get_post_meta($post_id,'myplugin_new_field',true));

}

ここでもよくわからない関数がいくつか出てきますが、これはまたわかったときに記事にしたいと思います。この関数は汎用的に使えそうなので”myplugin_new_field”の部分を変更すればほかでも使えそうですね。

これで一通り、カスタムフィールドを追加&保存する方法がわかりました。

そうのひとりごと

© 2017 PAOLOG