<?php /////////////////////////////////////////////////////////////// //カスタムフィールドの入力欄の中のデータをデータベースへ保存する function hook_func_for_save_customfield( $post_id ) { $areaname = "field_1"; $key = "_key_for_field_1"; ///// 正しい手段で送信されたデータであることを確認 //// //① nonceがセットされていなければ不正 if ( ! isset( $_POST[ 'nonce_for_field_1' ] ) ) return $post_id; //② nonceがセットされていても、自分で作成した値でないなら不正 if ( ! wp_verify_nonce( $_POST['nonce_for_field_1'] , 'send_field1' )) return $post_id; if ( ! current_user_can( 'edit_post', $post_id ) ) // ③ 書き込み権限がなければ不正 return $post_id; ///// カスタムフィールドの値を更新 /// $data = $_POST[$areaname]; if(get_post_meta($post_id, $key) == ""){ //新しいデータならデータを作成 add_post_meta($post_id, $key, $data, true); } elseif($data != get_post_meta($post_id, $key, true)){ //既存にあるデータで内容が異なるなら更新 update_post_meta($post_id, $key, $data); }elseif($data == ""){ //入力内容が空ならデータの削除 delete_post_meta($post_id, $key, get_post_meta($post_id, $key, true)); } return $post_id; } add_action( 'save_post', 'hook_func_for_save_customfield' ); ?>
save_postアクションフック
save_post は投稿や固定ページが作成または更新されたとき実行されるアクションです。インポート、投稿や固定ページの編集画面、XMLRPC、メールによる投稿などがきっかけになります。投稿データは投稿の編集方法に応じて $_POST, $_GET またはグローバルの $post_data に保存されます。例えばクイック編集は $_POST を使います。
これはWordpressではなくPHPの世界の話です。
<input type="hidden" id="nonce_for_field_1" name="nonce_for_field_1" value="81b29b57b2" />
というフィールドをPOSTした場合、PHP側では
として受け取ります。issetは'nonce_for_field_1'という変数が送信されてきたかを確認します。nonceが正しいかを調べる前に、そもそも送られてきているかを調べるわけです。
変数がセットされており、それが
NULL
でないことを調べます。
wp_nonce_fieldあるいはwp_create_nonceで生成したnonceと、送られてきたnonceが等しいかを検証する関数です。
nonce が正しいもので有効期限が切れていないことを、指定されたアクションとの関係も含めて確かめます。
似た関数にcheck_admin_refereがありますが、現在は非推奨です。
バージョン 2.0.1 以降、リファラーがチェックされるのは $action 引数を省略(またはデフォルトの -1 をセット)したときだけですが、これは nonce を使わない後方互換性のためです。
つまりリファラーをチェックするときはnonceがチェックされず、nonceがチェックされるときはリファラーがチェックされない・・・ということでしょうか。
まとめると、wp_verify_noceとwp_nonce_fieldは、以下のように対応しています。
<?php //送信時 wp_nonce_field( 'send_field1' , 'nonce_for_field_1' ); ?>
<?php //受信時 wp_verify_nonce( $_POST['nonce_for_field_1'] , 'send_field1' ) ?>
ユーザーが権限を所有しているかどうかを調べます。
ページの編集の権利を持っているかどうかを調べるときは、'edit_pages'を指定します。
権限の一覧はこちらが詳しいです:
WordPress私的マニュアル current_user_can
get_post_meta関数で該当する価を取得します。get_post_meta関数の第三引数がfalseまたは省略した場合、カスタムフィールドの配列が返ります。trueを指定した場合は、配列の内容が全て一つの文字列となって返ります。
その結果に応じて、次の各関数を呼び出し追加・削除・更新を行います。
add_post_meta ($post_id, $key, $data, true);
add_post_meta() は、指定した投稿や固定ページへカスタムフィールド(「メタデータ」とも呼ばれます)を追加します。どんな投稿タイプの投稿でも構いません。ひとつのカスタムフィールドは、実際にはキーと値の組です。
update_post_meta($post_id, $key, $data);
update_post_meta() は、指定した投稿に存在するカスタムフィールドの値を更新します。add_post_meta() の代わりとしても使うことができます。この関数はまず、$post_id で ID を指定した投稿に $meta_key を持つカスタムフィールドが存在することを確認します。もし存在しなければ代わりに
add_post_meta( $post_id, $meta_key, $meta_value )
を実行し、その結果を返します。
delete_post_meta($post_id, $key, get_post_meta($post_id, $key, true));
この関数は、投稿から指定したキー(もしくはキーと値)を持つカスタムフィールドをすべて削除します。update_post_meta()、get_post_meta()、add_post_meta() も見てください。