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

15

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

Après une recherche longue et intensive, j'ai découvert que c'était à cause du temps d'intégration.

Si j'utilise le initcrochet d'action pour initialiser le script et wp_localize_script, tout fonctionne bien. Le code lui-même doit donc ê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 le wp_enqeue_scriptscrochet d'action, je reçois toujours la mauvaise demande.

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 les charger uniquement 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 je connecte la fonction avec l'inclusion au parse_querycrochet d'action:

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');

Alors les fonctions accrochées pour initaccrocher le my-page-test-functions.phpfichier ne se déclenchent pas, je suppose, car initvient avant parse_query.

Existe-t-il des meilleures pratiques pour organiser cela, donc ça marche? Ou comment puis-je corriger la admin-ajax.phpmauvaise demande lors de l'utilisation du wp_enqeue_scriptscrochet d'action?

Péché
la source

Réponses:

13

Je pense que la seule chose qui manque ici, c'est que vous devez vous déplacer à l' add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');extérieur 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 wp_ajax_nopriv_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();
}

Éditer:

Il est maintenant plus clair que vous ne souhaitez charger que le JavaScript sur cette page particulière. Cela signifie que vous devez mettre votre is_page()intérieur ajax_login_init(). J'ai mis à jour le code en conséquence.

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

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

Votre script lance maintenant l'appel ajax. Comme mentionné dans les commentaires, les appels ajax ne connaissent pas 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_Queryet is_page()ne fonctionne donc pas lors d'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 is_page()vérification à l'intérieur ajax_login_init().

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

swissspidy
la source
Bonne suggestion. J'ai changé cela (toujours la même erreur), mais le problème est toujours que le fichier contenant les fonctions se chargera trop tard. Mais j'ai besoin d'un moyen de distinguer quelle page est utilisée. - actuellement j'essaye ceci avec is_page () comme décrit ci-dessus.
Sin
Essayez-vous de courir is_page()de l'intérieur ajax_login()ou de l'intérieur ajax_login_init(). Le premier ne peut pas fonctionner parce que c'est dans un contexte Ajax.
swissspidy
J'ai énuméré les fichiers dans lesquels se trouvent les fonctions, comme texte descriptif ci-dessus. Is_page () est utilisé dans le fichier functions.php et ne sert à inclure le fichier avec les fonctions ajax qu'en cas de besoin.
Sin
@Sin Again, is_page()ne fonctionne pas dans un contexte Ajax. J'ai mis à jour ma réponse en conséquence.
swissspidy
0

N'oubliez pas d'avoir le nom de la fonction «action» ajouté à la wp_ajax_balise.

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

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
Mohd Abdul Mujib
la source
-3

il suffit d'écrire mourir; à la fin comme ci-dessous ...entrez la description de l'image ici

ZEe XhAn
la source
8
Salut Zee Xhan. Bienvenue sur le site. Votre réponse a besoin de quelques révisions. Tout d'abord, si votre réponse est un code, ne postez pas de capture d'écran. Au lieu de cela, publiez le code en tant qu'extrait et formatez-le en tant que code (utilisez le bouton {}). C'est probablement la raison pour laquelle votre réponse a été rejetée et n'a pas été acceptée. En outre, un peu plus d'explications seraient utiles - comme "pourquoi" écrivez simplement die (), et où cela va-t-il exactement par rapport au code dans l'OP (article d'origine)?
butlerblog