web-dev-qa-db-fra.com

400 requêtes incorrectes sur admin-ajax.php uniquement à l'aide du hook d'action wp_enqueue_scripts

Je travaille sur ajax récemment. Les tutoriels que vous trouvez sur le net sont tous très similaires et faciles à mettre en œuvre. Mais je reçois toujours une mauvaise requête 400 sur mon fichier ajax-admin.php.

Après une longue et intensive recherche, j'ai maintenant découvert que c'était à cause de la période d'intégration.

Si j'utilise le hook d'action init pour initialiser le script et wp_localize_script, tout fonctionne correctement. Donc, le code lui-même doit être correct.

ma-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();
}

Mais si j'utilise par exemple wp_enqeue_scripts action hook J'ai toujours la mauvaise requête.

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

Le problème avec ceci est:

Je voudrais avoir les fonctions dans un fichier php supplémentaire et ne les charge que si elles sont nécessaires sur une page particulière. Pour cela, j'ai besoin, par exemple, is_page(). Mais is_page() fonctionne au plus tôt lorsque j'accroche la fonction avec l'option include dans le crochet d'action 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');

Ainsi, les fonctions rattachées à init hook dans le fichier my-page-test-functions.php ne se déclenchent pas, je suppose, car init vient avant parse_query.

Y at-il une meilleure pratique pour organiser cela, alors ça marche? Ou comment puis-je résoudre la mauvaise requête admin-ajax.php lorsque le hook d'action wp_enqeue_scripts est utilisé?

12
Sin

Je pense que la seule chose qui manque ici est que vous devez déplacer add_action('wp_ajax_nopriv_ajaxlogin','ajax_login'); en dehors de ajax_login_init.

Ce code enregistre votre gestionnaire Ajax, mais lorsque vous ne l'exécutez que sur wp_enqueue_scripts, il est déjà trop tard et les hooks wp_ajax_nopriv_ sont déjà exécutés.

Alors, avez-vous essayé quelque chose comme ça:

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();
}

Modifier:

Maintenant, il est plus clair que vous voulez uniquement charger le code JavaScript sur cette page. Cela signifie que vous devez insérer votre is_page() dans ajax_login_init(). J'ai mis à jour le code en conséquence.

Maintenant, pourquoi votre solution n'a-t-elle pas fonctionné?

La vérification is_page() signifiait que votre fichier de fonctions était chargé uniquement sur cette page spécifique. ajax_login_init() est appelé et vos scripts sont mis en file d'attente. Jusqu'ici tout va bien.

Maintenant, votre script effectue l'appel ajax. Comme mentionné dans les commentaires, les appels ajax ne sont pas conscients de la page actuelle sur laquelle vous vous trouvez. Il y a une raison pour laquelle le fichier se trouve à wp-admin/admin-ajax.php. Il n'y a pas de WP_Query et donc is_page() ne fonctionne pas pendant une requête ajax.

Puisque cela ne fonctionne pas, sw18_page_specific_functions() ne fera rien dans un contexte ajax. Cela signifie que votre fichier de fonctions n'est pas chargé et que votre gestionnaire ajax n'existe pas.

C'est pourquoi vous devez toujours inclure ce fichier de fonctions et déplacer cette vérification is_page() dans ajax_login_init().

Donc, au lieu de sw18_page_specific_functions() { … }, lancez include_once dirname(__FILE__).'/includes/my-page-test-functions.php'; directement. Sans appel add_action( 'parse_query' ).

11
swissspidy

N'oubliez pas d'ajouter le nom de la fonction 'action' à la balise wp_ajax_.

function fetchorderrows() { // Want to run this func on ajax submit
  // Do awesome things here all day long
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
0
Mohd Abdul Mujib