スポンサーリンク

WordPressのカスタムフィールド追加(後編 データの保存)

6.コード

<?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' );
?>

7.動作

  1. save_postアクションフックにより、更新ボタンが押されたときにhook_func_for_save_customfield関数が実行されます。
  2. hook_func_for_save_customfield関数では、
    ①nonceがPOSTされ、
    ②かつその内容が発行した物と一致し、
    ③さらに書き込み権限があるときにのみ、次の処理を行います。
  3. 送信された値を元に、カスタムフィールドの値を、
    ・まだ値がなければ作成 ... add_post_meta関数で新規作成
    ・値はあるが内容が異なる ... update_post_metaで更新
    ・入力内容が空 ... delete_post_metaでデータから削除
    を行います。

save_postアクションフック

save_post は投稿や固定ページが作成または更新されたとき実行されるアクションです。インポート、投稿や固定ページの編集画面、XMLRPC、メールによる投稿などがきっかけになります。投稿データは投稿の編集方法に応じて $_POST, $_GET またはグローバルの $post_data に保存されます。例えばクイック編集は $_POST を使います。

--  プラグイン API/アクションフック一覧/save post

8.正しい点順で送信されたデータであることを確認

isset( $_POST[ 'nonce_for_field_1' ]

これはWordpressではなくPHPの世界の話です。

<input type="hidden" id="nonce_for_field_1" name="nonce_for_field_1" value="81b29b57b2" />

というフィールドをPOSTした場合、PHP側では

isset( $_POST[ 'nonce_for_field_1' ]

として受け取ります。issetは'nonce_for_field_1'という変数が送信されてきたかを確認します。nonceが正しいかを調べる前に、そもそも送られてきているかを調べるわけです。

変数がセットされており、それが NULL でないことを調べます。

PHP マニュアル

wp_verify_nonce関数

wp_nonce_fieldあるいはwp_create_nonceで生成したnonceと、送られてきたnonceが等しいかを検証する関数です。

nonce が正しいもので有効期限が切れていないことを、指定されたアクションとの関係も含めて確かめます。

wp_verify_nonce(
$nonce, //送られてきたnonce
$action //生成時に指定したアクション
);

似た関数にcheck_admin_refereがありますが、現在は非推奨です。

バージョン 2.0.1 以降、リファラーがチェックされるのは $action 引数を省略(またはデフォルトの -1 をセット)したときだけですが、これは nonce を使わない後方互換性のためです。

関数リファレンス/check admin referer

つまりリファラーをチェックするときは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' )
?>

current_user_can関数

ユーザーが権限を所有しているかどうかを調べます。

ページの編集の権利を持っているかどうかを調べるときは、'edit_pages'を指定します。

権限の一覧はこちらが詳しいです:

WordPress私的マニュアル current_user_can

9.カスタムフィールドの値を更新

get_post_meta関数で該当する価を取得します。get_post_meta関数の第三引数がfalseまたは省略した場合、カスタムフィールドの配列が返ります。trueを指定した場合は、配列の内容が全て一つの文字列となって返ります。

その結果に応じて、次の各関数を呼び出し追加・削除・更新を行います。


add_post_meta ($post_id, $key, $data, true);

add_post_meta() は、指定した投稿や固定ページへカスタムフィールド(「メタデータ」とも呼ばれます)を追加します。どんな投稿タイプの投稿でも構いません。ひとつのカスタムフィールドは、実際にはキーと値の組です。

-- 関数リファレンス/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 ) を実行し、その結果を返します。

-- 関数リファレンス/update post meta

delete_post_meta($post_id, $key, get_post_meta($post_id, $key, true));

この関数は、投稿から指定したキー(もしくはキーと値)を持つカスタムフィールドをすべて削除します。update_post_meta()get_post_meta()add_post_meta() も見てください。

-- 関数リファレンス/delete post meta

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: