web-dev-qa-db-ja.com

Ajaxノンスをチェックインする方法 PHP

メディアライブラリに外部添付ファイルを追加するための新しいメニュー項目を追加して、メディアモーダルを変更しています。私は、JSコードから、データベースにアクセスし、3つのパラメータ(url、post id、nonce)を受け取るPHP関数を呼び出しています。私の質問は、どのように私はPHPコードから一回だけチェックすることができますか?別の質問ですが、この場合は本当にナンスを送信する必要がありますか。

JS:

wp.media.controller.Custom = wp.media.controller.State.extend({

    initialize: function(){
        this.props = new Backbone.Model({ url: '' });
    },

    customAction: function(){
        wp.media.post( 'add-attachment', {
            url:     this.props.get( 'url' ),
            post_id: wp.media.view.settings.post.id,
            nonce:   wp.media.view.settings.post.nonce
        });
    }

});

PHP:

add_action( 'wp_ajax_add-attachment', 'add_attachment' );
function add_attachment() {
    $url = trim($_POST['url']);
    $post_ID = intval($_POST['post_id']);
    $nonce = $_POST['nonce'];

    CHECK NONCE HERE!

    if (!current_user_can( 'edit_post', $post_ID ) ) {
        wp_send_json_error();
    }

    $attachment = array( ...data... );
    $attachment_id = wp_insert_post( $attachment );
    if( ! is_int($attachment_id) ) {
        wp_send_json_error();
    }

    if ( ! $attachment_js = wp_prepare_attachment_for_js( $attachment_id ) ) {
        wp_send_json_error();
    }

    wp_send_json_success( $attachment_js );

}

前もって感謝します

1
leemon

4.1.1以降、ノンスはwp-includes/media.php2883行で定義されています。

$settings['post'] = array(
    'id' => $post->ID,
    'nonce' => wp_create_nonce( 'update-post_' . $post->ID ),
);

だから一回だけを検証する:

wp_verify_nonce( $nonce, "update-post_$post_ID" );
3
TheDeadMedic