投稿追加・編集画面にカスタムフィールドを編集・保存できるメタボックスを表示させたい
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
関連記事
はじめに
PHPを少し勉強し、WordPressも少しずつカスタマイズできるようになり、さ ...
プラグインの基本構成・基本構造
プラグインファイルの基本構成 さて、いきなりプラグインファイルの基本構成です。 ...
WordPressにおけるカスタマイズの基礎(アクションとフィルター)
いきなりプラグインのカスタマイズに入る前に、「プラグインでのWordPressの ...
プラグインを使ったカスタマイズの基本形
さて、実際に自作のプラグイン(今はまだなんの機能もないですが)をアップロード・有 ...
決済用プラグインの制作~(1)制作前の確認
決済用プラグインの制作前の確認 さて以上で、WordPressの基本的なカスタマ ...