私はajaxで遊ぶためのクラスを書きました。私はもともと引数なしでcheck_admin_referer
(hello()
内)を使っていましたが、この警告を受けました: "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;
});
});
次の例のように、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" />
つまり、ナンス名がname
のid
と同様にinput
になります。
これは私が提供したコードの中のtoken: $( '#token' ).val()
を説明しています。形式はNONCE_NAME: $( '#NONCE_NAME' ).val()
です。
ただし、次のようにname
をターゲットにすることもできます。token: $( 'input[name="token"]' ).val()
名前が暗示しているように、check_admin_referer
はリファラーが管理者ページであることを確認します。 Wordpressは通常adminフォームへの隠し入力としてrefererフィールドを追加します、そしてあなたは同じことをすることができます、しかしあなたのajaxがadmin側に制限されない限り基本的にそれはAJAXで使われるべきではありません。代わりにnonce検証を使うだけです。
どのような場合でも、AJAXリクエストを処理するときには、死ぬこと(check_admin_referer
が行うこと)が最善の方法ではないので、おそらくもっとカスタマイズされた "エラー"指示とメッセージを得たいでしょう。