投稿追加・編集画面にカスタムフィールドを編集・保存できるメタボックスを表示させたい

Advanced Custom Fieldプラグインを使用することが多いのですが、検索とかを多用する場合、何かと不便になることが多いので自分でカスタムフィールドを追加できるようにするのも大事かと思います。

使用例

<?php

//使用例
$hogehoge = new HOGEHOGE();
class HOGEHOGE {
    public function __construct() { 

        //新規投稿画面、編集画面のときのみメタボックスを表示させる
        add_action( 'load-post.php', array( &$this, 'my_custom_metabox') );  
        add_action( 'load-post-new.php', array( &$this, 'my_custom_metabox') );  

    }
 
    public function my_custom_metabox() 
    { 
        //MyMetaBoxクラスをインスタンス化する。
        //もちろんこのクラスにに直接処理を書き込んでもいいけど、ファイルやクラスを分けたほうがメンテナンスしやすい。
        $meta_box = new MyMetaBox();
    } 

}

class MyMetaBox
{
    public function __construct()
    {
        /*
        MyMetaBoxクラスがインスタンス化されたときにすぐに呼び出す。
        add_meta_boxes:メタボックスを設定するときに使うアクション
        save_post:投稿が保存されるときに同時に作業を行うアクション
        ※ただし、save_postだと、予約投稿とか公開とかそういうのを判断できない。そこまで細かく判定したければ、transition_post_statusアクションを使用する。
        */
        add_action( 'add_meta_boxes', array( &$this, 'add_meta_box' ) );
        add_action( 'save_post', array( &$this, 'save_meta_box' ) );
    }

    public function add_meta_box( $post_type )
    {
        //投稿タイプを指定してメタボックスを表示させる
        //表示させたい投稿タイプをmy_custom_post_typeとする
        if( in_array( $post_type, 'my_custom_post_type' ) ){
            add_meta_box(
                'my_meta_box_id',    //メタボックスであるdivタグのid属性値
                '私のメタボックス',    //メタボックスのタイトルを指定。
                array( &$this, 'render_my_meta_box' ),    //メタボックスの内容を表示する関数名(コールバック関数)を指定。
                $post_type,    //メタボックスのを表示させる投稿タイプ名を指定。引数に$post_typeが使えるのでこれを利用
                'normal',    //メタボックスの種別'normal'、'advanced'、'side'の何れかを指定(省略時は'advanced')
                             //normalとadvanceはともにeditorの下だけど表示位置が違う。
                             //右側の(カテゴリーとか)の部分に表示させたければsideを指定。
                //ダッシュボードに表示させるならnormalかsideを指定
                'high'    //メタボックスの優先度'high'、'core'、'default'、'low'の何れかを指定(省略時は'default')。
                array( 'hoge' => 1 ),    //メタボックスの内容を表示する関数のパラメーターを指定(省略時はnull)
                                         //今回は使わなくても問題ないのだけど、練習のために設定。
            );
        }
    }

    public function save_meta_box( $post_id )
    {
        //まずはnonceチェック。WordPressでPOSTデータを送信・受信するときにはnonceを使うことを強く推奨
        //もちろんwp_verify_nonceでだめならpost_idを返すだけ
        $my_nonce = filter_input( INPUT_POST, 'my_metabox_nonce', FILTER_SANITIZE_STRING );
        if( !wp_verify_nonce( $my_nonce, 'my_metabox_nonce_actionname' ) )
            return $post_id;

        //オートセーブ機能がついている時、自動セーブさせるかどうか迷うところ。今回はオートセーブでは保存させない。
        if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
            return $post_id;

        //権限をチェック
        if( !current_user_can( 'edit_post', $post_id ) )
            return $post_id;

        //上記問題なければサニタイズして保存する
        $mydata = filter_input( INPUT_POST, 'myplugin_new_field', FILTER_SANITIZE_STRING );
		    update_post_meta(
		        $post_id,    //紐付けする投稿ID
		        '_my_meta_value_key',    //紐付けするカスタムフィールドのkey
		        $mydata    //保存するデータ
        );  
    }

    public function render_my_meta_box( $post, $hoge_array )
    {
        //noceフィールドを出力
        wp_nonce_field( 'my_metabox_nonce_actionname', 'my_metabox_nonce' ); 

        //フォームを出力
        echo '<label for="myplugin_new_field">カスタムフィールドフォーム項目名</label> ';
        echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field" value="' . esc_attr( $value ) . '" size="25" />';
    }
}

Posted by webmaster