web-dev-qa-db-ja.com

投稿をまだ保存していないのに、なぜsave_post _ $(custom_post_type)が起動されるのですか?

Datasheetという名前のカスタム投稿タイプを登録しています。登録時にメタボックスのコールバックを登録します

'register_meta_box_cb'  => [ $this, "add_metaboxes" ]

これは私のコールバックです

function add_metaboxes ( $post ) {  
   wp_nonce_field ( plugin_basename(__FILE__), 'datasheet_meta_nonce');
   add_meta_box( 
   ....... 

このフックも登録しました

add_action ('save_post_datasheet', [ $this, 'save_datasheet_meta' ], 10, 2);

これがコールバックです

function save_datasheet_meta ( $post_id, $post ) {

    $nonce = wp_verify_nonce ( plugin_basename(__FILE__), 'datasheet_meta_nonce');

    if (!$nonce) {
      die ("Security check failed");
    }

Expected/dsidered:作成または更新時にこの最後のコールバックが起動されることを期待していましたが以下の場合のみ;ナンスを確認できます。

実際の動作新しいデータシートの作成を開始しただけでは、他に何も得られませんでした

Security check failed    

これは単にdomain.tld/wp-admin/post-new.php?post_type=datasheetサイド管理メニューから

そのため、ページに入るだけでこのアクションが発生する理由を理解できません... nonceチェックが失敗します。

1
realtebo

"Your CPT> Add New"を選択すると、WP Calls get_default_post_to_edit() となり、実際に「空の」投稿が(_'post_status' => 'auto-draft'_で)作成され、次に wp_insert_post() を呼び出します。これがsave_datasheet_meta()関数が呼び出される前に呼び出される原因です。

したがって、通常、_save_post_にフックする関数の先頭に、いくつかの追加の健全性チェックを追加する必要があります。

_function
save_datasheet_meta ($post_id, $post)
{
    if ('auto-draft' == $post->post_status) {
        // bail, because your nonce will not be set at this point
        return ;
        }

    // post{,-new}.php enqueue some JS which periodically saves the post_content,
    // but NOT any post_meta
    // so, a `save_post` hook func that only cares about updating post_meta should
    // bail when DOING_AUTOSAVE is true
    if (defined ('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return ;
        }

    $nonce = wp_verify_nonce ( plugin_basename(__FILE__), 'datasheet_meta_nonce');

    if (!$nonce) {
        die ("Security check failed");
        }

    // save post_meta's here

    return ;
}
_

メタボックスにnonceを含めるべきではなく、保存ハンドラーでnonceをチェックしないでください。

誰もがメタボックスを作成する際にコーデックスページをコピーしたことは知っていますが、ノンスの使用はまったく間違っています。提出されたフォーム全体でノンスが実行および検証され、メタボックスに追加することによる追加のセキュリティやその他の価値はありません。

Nonceが行う唯一のことは、送信がページ編集からであり、クイック編集、xml-rpc、またはjson apiからではないことを検証することですが、そのような使用法では、単純な非表示入力を使用することをお勧めします(これにより、メタボックスにチェックボックスのみが含まれている場合は必須です)。

1
Mark Kaplun