J'ai écrit un cours sur lequel jouer avec l'ajax. A l'origine, j'avais utilisé check_admin_referer
(dans hello()
) sans arguments, mais l'avertissement suivant était émis: "Avis de PHP: check_admin_referer était appeléincorrectly. Vous devez spécifier une action nonce à vérifier à l'aide du premier paramètre."
Je me suis donc dirigé vers le codex et j'ai essayé de suivre l'exemple exemple . Cependant, la vérification échoue. Je reçois maintenant un 403
.
Voici ma classe:
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();
}
}
La seule raison pour laquelle je peux penser est que le nom de l'action est incorrect car je ne pointe pas vers la méthode d'instance, mais je suis nouveau pour PHP et WP, et mon foo Google me manque.
Qu'est-ce que je fais mal. Comment puis-je obtenir check_admin_referer()
pour passer?
Update
Voici le JS:
jQuery(document).ready(function($){
data = {
action: 'hello'
}
$('#stupid_form').submit(function(){
$.post(ajaxurl, data, function(response){
$('#response').html(response);
});
return false;
});
});
Dans le script JS, incluez lenoncedans data
, comme dans l'exemple suivant:
jQuery(document).ready(function($){
data = {
action: 'hello',
token: $( '#token' ).val()
}
$('#stupid_form').submit(function(){
$.post(ajaxurl, data, function(response){
$('#response').html(response);
});
return false;
});
});
Remarque additionnelle
<?php wp_nonce_field('hello', 'token'); ?>
génère une variable input
avec un balisage semblable à:
<input type="hidden" id="token" name="token" value="d9e3867a0e" />
c'est-à-dire que le nomnoncedevient le name
ainsi que le id
du input
.
Cela explique la token: $( '#token' ).val()
dans le code que j'ai fourni, où le format est NONCE_NAME: $( '#NONCE_NAME' ).val()
.
Cependant, vous pouvez aussi cibler la name
comme ceci: token: $( 'input[name="token"]' ).val()
Comme son nom l'indique, check_admin_referer
vérifie que le référant était une page d'administrateur. Wordpress ajoute généralement un champ de référence en tant qu'entrée masquée dans les formulaires d'administration. Vous pouvez en faire de même. Toutefois, il ne doit pas être utilisé dans AJAX, à moins que votre ajax soit limité au côté administrateur. Utilisez simplement la vérification nonce à la place.
Dans tous les cas, la mort (ce que fait check_admin_referer
) n’est pas la meilleure stratégie pour traiter les demandes AJAX et vous souhaiterez sans doute avoir une indication et un message plus personnalisés "d'erreur".