400 requête incorrecte sur admin-ajax.php uniquement à l'aide de wp_enqueue_scripts-action-hook

10

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 ajax-admin.php

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

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

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

Mais si j'utilise par exemple 'wp_enqeue_scripts'-action-hook Je reçois 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 php supplémentaire et ne les charger 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'include dans le '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');

Donc, dans my-page-test-functions.php 'init' ne fonctionne pas, je suppose car init vient avant parse_query.

Existe-t-il des meilleures pratiques pour organiser cela, afin que cela fonctionne? Ou comment puis-je corriger la mauvaise requête admin-ajax.php lors de l'utilisation du 'wp_enqeue_scripts'-action-hook?

Difficile à décrire, mais j'espère que c'est tout à fait compréhensible.

    
posée Sin 17.01.2018 - 11:39

2 réponses

11

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 wp_ajax_nopriv_ des hooks 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:

Désormais, il est plus clair que vous souhaitez uniquement charger le code JavaScript sur cette page. Cela signifie que vous devez placer 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() signifie que votre fichier de fonctions n’a été chargé que sur cette page spécifique. ajax_login_init() est appelé et vos scripts sont mis en file d'attente. Jusqu'ici tout va bien.

Votre script effectue maintenant 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 WP_Query et donc is_page() ne fonctionne pas pendant une requête ajax.

Comme 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 ce is_page() dans l'intérieur de ajax_login_init() .

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

    
réponse donnée swissspidy 17.01.2018 - 11:48
-1

écrivez simplement die; à la fin, comme ci-dessous ...

    
réponse donnée ZEe XhAn 12.11.2018 - 14:12

Lire d'autres questions sur les étiquettes