web-dev-qa-db-ja.com

Check_admin_referer()から403が返されるのはなぜですか?

私はajaxで遊ぶためのクラスを書きました。私はもともと引数なしでcheck_admin_refererhello()内)を使っていましたが、この警告を受けました: "PHP Notice:check_admin_refererはと間違って呼ばれていました

だから私はコーデックスに向かって、 の例 に従うことを試みました。ただし、チェックは失敗します。私は今403を取得しています。

これが私のクラスです:

class StupidClass {

    private $settings_page;

    // scripts, 
    public function __construct(){
        add_action('admin_menu', array($this, 'add_menu'));
        add_action('admin_enqueue_scripts', array($this, 'load_scripts'));
        add_action('wp_ajax_hello', array($this, 'hello'));
    }

    // setup
    public function add_menu(){
        $this->settings_page = add_menu_page( 'Menu item', 'settings page', 'edit_pages', 'settingspage', array($this, 'render_page'), false, 62 );
    }

    public function load_scripts($hook){
        if ($this->settings_page !== $hook) {
            return;
        }

        $path = plugin_dir_url( __FILE__ ) . 'stupid.js';
        wp_enqueue_script( 'stupid_js', $path, array('jquery'));
    }

    // view
    public function render_page(){
        ?>
        <h1>This is the title</h1>
        <form action="" id="stupid_form" method="post">
            <?php wp_nonce_field('hello', 'token'); ?>
            <input type="submit" value="hit me">
        </form>
        <div id="response"></div>
        <?php
    }

    public function hello(){
        check_admin_referer('hello', 'token');
        wp_die();
    }
}

私が考えることができる唯一の理由は、私がインスタンスメソッドを指していないのでアクション名が間違っているということですが、私はPHPとWPに新しいです、そして私のGoogle fooは私に失敗しています。

何がおかしいのですか。 check_admin_referer()を渡すにはどうすればいいですか?

更新

これがJSです。

jQuery(document).ready(function($){
    data = {
        action: 'hello'
    }
    $('#stupid_form').submit(function(){
        $.post(ajaxurl, data, function(response){
            $('#response').html(response);
        });
        return false;
    });
});
1
user3574603

次の例のように、JSスクリプトでdataナンスを含めます。

jQuery(document).ready(function($){
    data = {
        action: 'hello',
        token: $( '#token' ).val()
    }
    $('#stupid_form').submit(function(){
        $.post(ajaxurl, data, function(response){
            $('#response').html(response);
        });
        return false;
    });
});

追加の注意事項

<?php wp_nonce_field('hello', 'token'); ?>

次のようなマークアップで隠しinputを生成します。

<input type="hidden" id="token" name="token" value="d9e3867a0e" />

つまり、ナンス名nameidと同様にinputになります。

これは私が提供したコードの中のtoken: $( '#token' ).val()を説明しています。形式はNONCE_NAME: $( '#NONCE_NAME' ).val()です。

ただし、次のようにnameをターゲットにすることもできます。token: $( 'input[name="token"]' ).val()

3
Sally CJ

名前が暗示しているように、check_admin_refererはリファラーが管理者ページであることを確認します。 Wordpressは通常adminフォームへの隠し入力としてrefererフィールドを追加します、そしてあなたは同じことをすることができます、しかしあなたのajaxがadmin側に制限されない限り基本的にそれはAJAXで使われるべきではありません。代わりにnonce検証を使うだけです。

どのような場合でも、AJAXリクエストを処理するときには、死ぬこと(check_admin_refererが行うこと)が最善の方法ではないので、おそらくもっとカスタマイズされた "エラー"指示とメッセージを得たいでしょう。

1
Mark Kaplun