400 mauvaise requête sur admin-ajax.php en utilisant uniquement le hook d'action wp_enqueue_scripts
3 réponses
- votes
-
- 2018-01-17
Jepense que la seule chose quimanqueiciest que vous devez déplacer
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
en dehors deajax_login_init
.Ce codeenregistre votregestionnaire Ajax,mais lorsque vousne l'exécutez que sur
wp_enqueue_scripts
,ilest déjàtroptardet leswp_ajax_nopriv_
hooks sont déjàexécutés.Alors,avez-vousessayé quelque chose comme ceci:
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(); }
Ilestmaintenantplus clair que vousne souhaitez charger le JavaScript que sur cettepageparticulière. Cela signifie que vous devezmettre votre
is_page()
dansajax_login_init()
. J'aimis àjour le codeen conséquence.Maintenant,pourquoi votre solutionn'a-t-ellepasfonctionné?
La vérification
is_page()
signifiait que votrefichier defonctionsn'était chargé que sur cettepage spécifique.ajax_login_init()
est appeléet vos scriptsmisen file d'attente. Jusqu'icitout vabien.Maintenant,votre scripteffectue l'appel ajax. Commementionné dans les commentaires,les appels ajaxne sontpas conscients de lapage actuelle sur laquelle vous voustrouvez. Il y a une raisonpour laquelle lefichier setrouve dans
wp-admin/admin-ajax.php
. Iln'y apas deWP_Query
et doncis_page()
ne fonctionnepaspendant une requête ajax.Puisque celane fonctionnepas,
sw18_page_specific_functions()
ne fera rien dans un contexte ajax. Cela signifie que votrefichier defonctionsn'estpas chargéet que votregestionnaire ajaxn'existepas.C'estpourquoi vous deveztoujoursinclure cefichier defonctionset déplacer cette vérification
is_page()
dansajax_login_init()
.Donc au lieu de
sw18_page_specific_functions() { … }
exécutez simplementinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
directement . Sans aucun appeladd_action( 'parse_query' )
.I think the only thing missing here is that you need to move
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
outsideajax_login_init
.That code registers your Ajax handler, but when you only run it on
wp_enqueue_scripts
, it's already too late andwp_ajax_nopriv_
hooks are already run.So, have you tried something like this:
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(); }
Edit:
Now it's more clear that you only want to load the JavaScript on that particular page. This means you need to put your
is_page()
insideajax_login_init()
. I've updated the code accordingly.Now, why didn't your solution work?
The
is_page()
check meant that your functions file was only loaded on that specific page.ajax_login_init()
gets called and your scripts enqueued. So far so good.Now your script makes the ajax call. As mentioned in the comments, ajax calls are not aware of the current page you're on. There's a reason the file sits at
wp-admin/admin-ajax.php
. There's noWP_Query
and thusis_page()
does not work during an ajax request.Since that does not work,
sw18_page_specific_functions()
won't do anything in an ajax context. This means your functions file is not loaded and your ajax handler does not exist.That's why you need to always include that functions file and move that
is_page()
check insideajax_login_init()
.So instead of
sw18_page_specific_functions() { … }
just runinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
directly. Without anyadd_action( 'parse_query' )
call.-
Bonne suggestion.J'ai changé cela (toujours lamêmeerreur),mais leproblèmeesttoujours que lefichier contenant lesfonctions se chargeratroptard.Maisj'aibesoin d'unmoyen de distinguer quellepageest utilisée.- actuellementj'essaye ceci avecis_page () comme décrit ci-dessus.Good suggestion. I have changed that (still the same error), but the problem still is that the file containing the functions will load too late. But I need a way to distinguish which page is used. - currently I try this with is_page () as described above.
- 0
- 2018-01-17
- Sin
-
Essayez-vous d'exécuter `is_page ()` depuis `ajax_login ()` ou depuis `ajax_login_init ()`.Lepremierne peutpasfonctionner car c'est dans un contexte Ajax.Are you trying to run `is_page()` from within `ajax_login()` or from within `ajax_login_init()`. The former can't work because it's in an Ajax context.
- 0
- 2018-01-17
- swissspidy
-
J'ai énuméré lesfichiers dans lesquels setrouvent lesfonctions,commetexte descriptif ci-dessus.Is_page ()est utilisé dans lefunctions.phpet sert àinclure lefichier avec lesfonctions ajax uniquement lorsque celaestnécessaire.I have enumerated the files in which the functions are, as descriptive text above. The is_page() is used in the functions.php and serves to include the file with the ajax functions only when needed.
- 0
- 2018-01-17
- Sin
-
@Sin Encore unefois,`is_page ()`ne fonctionnepas dans un contexte Ajax.J'aimis àjourma réponseen conséquence.@Sin Again, `is_page()` does not work in an Ajax context. I have updated my answer accordingly.
- 0
- 2018-01-17
- swissspidy
-
- 2019-04-14
N'oubliezpas d'ajouter lenom de lafonction 'action' à labalise
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);
Remember to have the 'action' function name appended to the
wp_ajax_
tag.function fetchorderrows() { // Want to run this func on ajax submit // Do awesome things here all day long } add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
-
-
Salut Zee Xhan.Bienvenue sur le site.Votre réponse abesoin de quelques révisions.Premièrement,si votre réponseest un code,ne publiezpas de capture d'écran.À laplace,publiez le code sousforme d'extrait de codeet formatez-le sousforme de code (utilisez lebouton {}).C'estprobablement la raisonpour laquelle votre réponse a été rejetéeet refusée.En outre,unpeuplus d'explications serait utile - comme "pourquoi" écrivez simplement die (),et où cela va-t-ilexactementpar rapport au code dans l'OP (message original)?Hi Zee Xhan. Welcome to the site. Your answer needs some revisions. First, if your answer is code, don't post a screenshot. Instead, post the code as a snippet and format it as code (use the {} button). That's likely the reason your answer was downvoted and not accepted. Also, a little more explanation would be helpful - like "why" just write die(), and where exactly does this go in relation to the code in the OP (original post)?
- 9
- 2018-11-12
- butlerblog
-
Jetravaille sur ajax ces dernierstemps. Lestutoriels que voustrouvez sur lenet sonttoustrès similaireset assezfaciles àmettreen œuvre. Maisj'obtienstoujours une mauvaise requête 400 surmonfichier
ajax-admin.php
.Après une recherche longueet intensive,j'aimaintenant découvert que c'était à cause dutemps d'intégration.
Sij'utilise le hook d'action
init
pourinitialiser le scriptetwp_localize_script
,toutfonctionnebien. Le code lui-même doit donc être correct.my-page-test-functions.php
Mais sij'utiliseparexemple
wp_enqeue_scripts
crochet d'action Je reçoistoujours lamauvaise requête.Leproblème avec ceciest:
Je voudrais avoir lesfonctions dans unfichierphp supplémentaireet les charger uniquement sielles sontnécessaires sur unepageparticulière. Pour cela,j'aibesoin,parexemple,de
is_page ()
. Maisis_page ()
fonctionne auplustôt lorsquej'accroche lafonction avec l'inclusion dans le hook d'actionparse_query
:functions.php
Ainsi,lesfonctions accrochées au hook
init
dans lefichiermy-page-test-functions.php
ne se déclenchentpas,je suppose,carinit
vient avantparse_query
.Existe-t-il desbonnespratiquespour organiser cela,pour que celafonctionne? Ou commentpuis-je corriger lamauvaise requête
admin-ajax.php
lors de l'utilisation du hook d'actionwp_enqeue_scripts
?