400 solicitud incorrecta en admin-ajax.php solo usando wp_enqueue_scripts-action-hook

10

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

Después de una búsqueda larga e intensiva, ahora he descubierto que eso se debe al tiempo de integración.

Si uso el 'init'-action-hook para inicializar el script y wp_localize_script, todo funciona bien. Así que 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 lo uso por ej. 'wp_enqeue_scripts'-action-hook siempre recibo 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 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 engancho la función con la inclusión en el 'parse_query'-action-hook:

//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, en my-page-test-functions.php 'init' no funciona, supongo que porque init viene antes que parse_query.

¿Existen las mejores prácticas para organizar esto, por lo que funciona? O, ¿cómo puedo corregir la solicitud incorrecta admin-ajax.php cuando utilizo el 'wp_enqeue_scripts'-action-hook?

Es difícil de describir, pero espero que sea bastante comprensible.

    
pregunta Sin 17.01.2018 - 11:39

2 respuestas

11

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 tu controlador Ajax, pero cuando solo lo ejecutas en wp_enqueue_scripts , ya es demasiado tarde y wp_ajax_nopriv_ ya están en ejecución.

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 el JavaScript en esa página en particular. Esto significa que necesitas poner tu is_page() dentro de ajax_login_init() . He actualizado el código en consecuencia.

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

La verificación is_page() significa que su archivo de funciones solo se cargó en esa página específica. ajax_login_init() se llama y sus scripts se ponen en cola. Hasta ahora todo bien.

Ahora su script hace la llamada ajax. Como se mencionó 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.

Ya 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 ese cheque is_page() dentro de ajax_login_init() .

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

    
respondido por el swissspidy 17.01.2018 - 11:48
-1

simplemente escribe die; al final, como a continuación ...

    
respondido por el ZEe XhAn 12.11.2018 - 14:12

Lea otras preguntas en las etiquetas