functions – 400 solicitud incorrecta en admin-ajax.php solo usando el gancho de acción wp_enqueue_scripts

Pregunta:

He estado trabajando en ajax últimamente. Los tutoriales que encuentras en la red son todos muy similares y bastante fáciles de implementar. Pero siempre recibo una solicitud incorrecta 400 en mi archivo ajax-admin.php .

Después de una búsqueda larga e intensa, descubrí que eso se debe al tiempo de integración.

Si utilizo el gancho de acción init para inicializar el script y wp_localize_script , todo funciona bien. Entonces, el código en sí debe ser correcto.

my-page-test-functions.php

function ajax_login_init(){
   wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
   wp_enqueue_script('ajax-login-script');
   wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

if(!is_user_logged_in()){
   add_action('init','ajax_login_init');
}

function ajax_login(){
    //nonce-field is created on page
    check_ajax_referer('ajax-login-nonce','security');
    //CODE
    die();
}

Pero si utilizo, por ejemplo, el gancho de acción wp_enqeue_scripts , siempre obtengo la solicitud incorrecta.

if(!is_user_logged_in()){
    add_action('wp_enqueue_scripts','ajax_login_init');
}

El problema con esto es:

Me gustaría tener las funciones en un archivo php adicional y cargarlas solo si son necesarias en una página en particular. Para esto necesito, por ejemplo, is_page() . Pero is_page() funciona lo antes posible cuando is_page() la función con la inclusión en el gancho de acción parse_query :

functions.php

function sw18_page_specific_functions(){
    if(is_page('page-test')){
        include_once dirname(__FILE__).'/includes/my-page-test-functions.php';
    }
}

add_action('parse_query','sw18_page_specific_functions');

Entonces, las funciones conectadas al gancho init en my-page-test-functions.php archivo my-page-test-functions.php no se activan, supongo, porque init viene antes que parse_query .

¿Existen mejores prácticas para organizar esto, para que funcione? ¿O cómo puedo solucionar la solicitud incorrecta admin-ajax.php cuando uso el gancho de acción wp_enqeue_scripts ?

Respuesta:

Creo que lo único que falta aquí es que necesitas mover add_action('wp_ajax_nopriv_ajaxlogin','ajax_login'); fuera de ajax_login_init .

Ese código registra su controlador Ajax, pero cuando solo lo ejecuta en wp_enqueue_scripts , ya es demasiado tarde y los ganchos wp_ajax_nopriv_ ya están ejecutados.

Entonces, ¿has probado algo como esto?

function ajax_login_init(){
  if ( ! is_user_logged_in() || ! is_page( 'page-test' ) ) {
    return;
  }

  wp_register_script('ajax-login-script',get_stylesheet_directory_uri().'/js/ajax-login-script.js',array('jquery'));
  wp_enqueue_script('ajax-login-script');
  wp_localize_script('ajax-login-script','ajax_login_object',array('ajaxurl' => admin_url('admin-ajax.php'),'redirecturl' => 'REDIRECT_URL_HERE','loadingmessage' => __('Sending user info, please wait...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field is created on page
  check_ajax_referer('ajax-login-nonce','security');
  //CODE
  die();
}

Editar:

Ahora está más claro que solo desea cargar JavaScript en esa página en particular. Esto significa que debe poner su is_page() dentro de ajax_login_init() . Actualicé el código en consecuencia.

Ahora bien, ¿por qué no funcionó su solución?

La is_page() significaba que su archivo de funciones solo se cargó en esa página específica. ajax_login_init() y sus scripts se ajax_login_init() . Hasta ahora tan bueno.

Ahora su script realiza la llamada ajax. Como se menciona en los comentarios, las llamadas ajax no son conscientes de la página actual en la que se encuentra. Hay una razón por la que el archivo se encuentra en wp-admin/admin-ajax.php . No hay WP_Query y, por lo tanto, is_page() no funciona durante una solicitud ajax.

Dado que eso no funciona, sw18_page_specific_functions() no hará nada en un contexto ajax. Esto significa que su archivo de funciones no está cargado y su controlador ajax no existe.

Es por eso que siempre debe incluir ese archivo de funciones y mover esa is_page() dentro de ajax_login_init() .

Entonces, en lugar de sw18_page_specific_functions() { … } simplemente ejecute include_once dirname(__FILE__).'/includes/my-page-test-functions.php'; directamente. Sin ninguna add_action( 'parse_query' ) .

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım