Uso de nonce AJAX con check_ajax_referer() en WordPress
Quiero usar check_ajax_referer() para verificar un campo WP_nonce mediante AJAX. Aquí está mi elemento HTML:
<input type="hidden" name="login_nonce" value="<?= wp_create_nonce('login_nonce'); ?>"/>
Usando jQuery, estoy enviando todos los valores de los campos de entrada a una solicitud POST:
request = $.ajax({
type: 'POST',
url: 'handle-login.php',
data: {
user: $('input[name="login_username"]').val(),
pass: $('input[name="login_password"]').val(),
security: $('input[name="login_nonce"]').val()
},
dataType: 'json'
});
En handle-login.php estoy intentando hacer lo siguiente:
require_once $_SERVER['DOCUMENT_ROOT'].'/wp-load.php';
$return = array();
if( check_ajax_referer( 'login_nonce', $_POST['security'], false ) )
$return['nonce'] = $_POST['login_nonce'];
echo $return
Pero en la respuesta no obtengo nada... ¿Alguien sabe qué está pasando?
Es difícil decir con certeza dónde está el error ya que no has mencionado tu add_action('wp_ajax_my_function','whatever_callback');
lo cual creo que olvidaste incluir. Pero tu pregunta carece de información en este aspecto.
Así es como yo abordaría esto:
En tu archivo functions.php o similar:
add_action(wp_ajax_handle_login, 'handle_login_ajax');
add_action(wp_ajax_nopriv_handle_login, 'handle_login_ajax');
Asegúrate de que tu archivo handle-login.php esté declarado en tu archivo php principal de tu plugin o tema como functions.php
require_once plugin_dir_path(__FILE__) . 'handle-login.php';
Deberías declarar las variables nonce y la url ajax justo después del enlace de tu archivo js, podrás acceder a estos después:
wp_enqueue_script('wccajs',plugin_dir_url( dirname(__FILE__) ) . 'login.js',array('jquery'),'1.0',false);
wp_localize_script('wccajs','MyAjax',array(
'ajax_url' => admin_url( 'admin-ajax.php' ),
'security' => wp_create_nonce('handle_login')
) );
En tu archivo handle-login.php:
function handle_login_ajax(){
check_ajax_referer('handle_login', 'security');
$return = array();
echo $return;
wp_die(); // También olvidaste esto
}
Tu archivo Javascript:
function send_stuff_to_server(){
var data = {
'action': 'handle_login', // olvidaste esto, igual que tu hook de acción wp_ajax_{handle_login}
'security': MyAjax.security // Podemos acceder así
}
$.post(MyAjax.ajax_url, data, function (callBack) {
console.log(callBack); // Devolverá el nonce
});
}
Espero que esto ayude.

He estado teniendo los mismos problemas y los resolví usando otra función ajax relacionada: Simplemente cambiando tu
check_ajax_referer( 'login_nonce', $_POST['security'], false )
por
wp_verify_nonce( $_POST['security'], 'login_nonce' )
parece funcionar y devuelve verdadero/falso correctamente. Sobre si es más seguro de una forma u otra, encontré esta información:
