<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>PAOLOG &#187; カスタムフィールド</title>
	<atom:link href="http://scianto.net/archives/tag/%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%83%95%e3%82%a3%e3%83%bc%e3%83%ab%e3%83%89/feed" rel="self" type="application/rss+xml" />
	<link>http://scianto.net</link>
	<description>趣味のウェブデザインと管理人PAONの日記</description>
	<lastBuildDate>Wed, 25 Aug 2010 12:57:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://scianto.net/archives/tag/%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%a0%e3%83%95%e3%82%a3%e3%83%bc%e3%83%ab%e3%83%89/feed" />
		<item>
		<title>投稿ページにカスタムフィールドを追加する</title>
		<link>http://scianto.net/archives/2009/05/04134232.php</link>
		<comments>http://scianto.net/archives/2009/05/04134232.php#comments</comments>
		<pubDate>Mon, 04 May 2009 04:42:32 +0000</pubDate>
		<dc:creator>paon</dc:creator>
				<category><![CDATA[web design]]></category>
		<category><![CDATA[WordPress2.7]]></category>
		<category><![CDATA[カスタムフィールド]]></category>
		<category><![CDATA[管理画面]]></category>

		<guid isPermaLink="false">http://scianto.net/?p=584</guid>
		<description><![CDATA[
            記事の投稿ページに独自のカスタムフィールドを追加する方法です。
            
              
            
            公式ドキュメン [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-608" title="20090501_02" src="http://scianto.net/paolog-wp/wp-content/uploads/2009/04/20090501_02.png" alt="20090501_02" width="500" height="250" /></p>
            <p>記事の投稿ページに独自のカスタムフィールドを追加する方法です。</p>
            <p>
              <span id="more-584"></span>
            </p>
            <p>公式ドキュメントにサンプルコードがあるのでそちらを参考に手順を追ってみます。ただ、サンプルコードは古いバージョンのWordPressにも対応するようなコードになっているようです。個人的に使うだけの予定なので、古いバージョンは無視してWP2.7のみに対応する簡単なコードに書き換えます。</p>
            <h2>アクションフック</h2>
            <pre class="brush:php">add_action('admin_menu', 'myplugin_add_custom_box');
add_action('save_post', 'myplugin_save_postdata');</pre>
            <p>add_action()でアクションフックの設定をします。admin_menuフックに実行したい関数名（例ではmyplugin_add_custom_box）を指定しています。admin_menuフックは「管理画面メニューの基本構造が配置されたあとに実行する」フックになります。</p>
            <p>もうひとつは記事を保存したときに実行されるようにフックを設定します。ここで登録している関数myplugin_save_postdataは入力された値をデータベースに保存するための関数です。</p>
            <p> 次ではここで登録した関数の中身をチェックしていきます。</p>
            <h2>カスタムフィールドを登録</h2>
            <p>myplugin_add_custom_box()はカスタムフィールドを登録？するための独自関数です。この関数のなかではadd_meta_box()を使っています。この関数の中身はサンプルを書き換えています。</p>
            <pre class="brush:php">
function myplugin_add_custom_box () {
  add_meta_box( 'myplugin_sectionid', 'My Post Section Title', 'myplugin_inner_custom_box', 'post', 'advanced' );
}</pre>
            <h3>書式</h3>
            <pre>add_meta_box('id', 'title', 'callback', 'page', 'context', 'priority')</pre>
            <h3>パラメータ</h3>
            <dl>
              <dt>id</dt>
              <dd>生成されるフィールドはいくつかのdiv要素で囲まれることになりますが、この一番外側のdiv要素につけるid名のようです。複数のフィールドを追加するときは重複しない名前にしたほうがいいでしょう。</dd>
              <dt>title</dt>
              <dd>フィールドの名前。</dd>
              <dt>callback</dt>
              <dd>ページが出力されたら呼び出される関数。</dd>
              <dt>page</dt>
              <dd>どの編集ページに表示するかを指定します。&quot;post&quot;、&quot;page&quot;、&quot;link&quot;から選びます。記事投稿ページなので&quot;post&quot;。</dd>
              <dt>context</dt>
              <dd>編集ページのどの部分に表示するかの選択（？）。選べる値は&quot;normal&quot;、&quot;advanced&quot;、&quot;side&quot;。&quot;normal&quot;と&quot;advanced&quot;の差がわかりませんが、wysiwygエディタと同じブロックに表示するなら&quot;advanced&quot;、サイドバーは&quot;side&quot;を選択するといいようです。</dd>
              <dt>priority</dt>
              <dd>優先順位。フィールドが呼び出される順番かな？。</dd>
            </dl>
            <p>コールバック関数に指定したmyplugin_inner_custom_box()で実際に出力する内容を決めます。ようやくですね。</p>
            <pre class="brush:php">function myplugin_inner_custom_box() {
  global $post;
  echo '&lt;input type=&quot;hidden&quot; name=&quot;myplugin_noncename&quot; id=&quot;myplugin_noncename&quot; value=&quot;' .wp_create_nonce( plugin_basename(__FILE__) ) . '&quot; /&gt;';
  echo '&lt;label for=&quot;myplugin_new_field&quot;&gt;フィールド名&lt;/label&gt; ';
  echo '&lt;input type=&quot;text&quot; name=&quot;myplugin_new_field&quot; value=&quot;'.get_post_meta($post-&gt;ID,'myplugin_new_field',true).'&quot; size=&quot;25&quot; /&gt;';
} </pre>
            <p>わかりやすいよう少し書き換え。隠しフィールドの行はよくわかりませんが、ファイル名を元にwp_create_nonce()でランダムな文字を作成し、フォームから正しく投稿された値かどうかを認証してるということでしょうか？この部分はつけていたほうが良さそうですね。</p>
            <p>次にラベルとテキストフィールドを出力します。テキストフィールドのname属性がデータベースのフィールド名になるようです。初期値としてget_post_meta()でデータベースから値を取ってくるようになってます。</p>
            <h2>入力データの保存</h2>
            <pre class="brush:php">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) == &quot;&quot;) 
    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==&quot;&quot;) 
    delete_post_meta($post_id, 'myplugin_new_field',get_post_meta($post_id,'myplugin_new_field',true));
 
}</pre>
            <p>ここでもよくわからない関数がいくつか出てきますが、これはまたわかったときに記事にしたいと思います。この関数は汎用的に使えそうなので&quot;myplugin_new_field&quot;の部分を変更すればほかでも使えそうですね。</p>
            <p>これで一通り、カスタムフィールドを追加&amp;保存する方法がわかりました。</p>

]]></content:encoded>
			<wfw:commentRss>http://scianto.net/archives/2009/05/04134232.php/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://scianto.net/archives/2009/05/04134232.php" />
	</item>
	</channel>
</rss>
