400 fehlerhafte Anfrage auf admin-ajax.php nur mit dem Aktions-Hook wp_enqueue_scripts
3 Antworten
- Stimmen
-
- 2018-01-17
Ich denke,daseinzige,was hierfehlt,ist,dass Sie
add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
außerhalb vonajax_login_init
verschiebenmüssen.Dieser Code registriert Ihren Ajax-Handler,aber wenn Sieihnnur auf
wp_enqueue_scripts
ausführen,istesbereits zu spät undwp_ajax_nopriv_
-Hooks werdenbereits ausgeführt.Haben Sie also Folgendes versucht:
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(); }
Bearbeiten:
Jetztist klarer,dass Sienur das JavaScript auf dieserbestimmten Seite ladenmöchten. Diesbedeutet,dass Sie Ihre
is_page()
inajax_login_init()
einfügenmüssen. Ich habe den Codeentsprechend aktualisiert.Warum hat Ihre Lösungnichtfunktioniert?
Die Prüfung
is_page()
bedeutete,dass Ihre Funktionsdateinur auf dieserbestimmten Seitegeladen wurde.ajax_login_init()
wird aufgerufen und Ihre Skriptein die Warteschlangegestellt. So weit sogut.Jetztführt Ihr Skript den Ajax-Aufruf durch. Wiein den Kommentarenerwähnt,kennen Ajax-Anrufe die aktuelle Seite,auf der Sie sichbefinden,nicht. Esgibt einen Grund,warum sich die Datei unter
wp-admin/admin-ajax.php
befindet. Esgibt keinWP_Query
und daherfunktioniertis_page()
währendeiner Ajax-Anforderungnicht.Da diesnichtfunktioniert,führt
sw18_page_specific_functions()
in einem Ajax-Kontextnichts aus. Diesbedeutet,dass Ihre Funktionsdateinichtgeladenist und Ihr Ajax-Handlernicht vorhandenist.Deshalbmüssen Sieimmer diese Funktionsdateieinschließen und diese
is_page()
-Prüfunginajax_login_init()
verschieben.Führen Sie also anstelle von
sw18_page_specific_functions() { … }
einfachinclude_once dirname(__FILE__).'/includes/my-page-test-functions.php';
direkt . Ohneadd_action( 'parse_query' )
-Aufruf.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.-
Guter Vorschlag.Ich habe dasgeändert (immernoch dergleiche Fehler),aber das Problemistimmernoch,dass die Dateimit den Funktionen zu spätgeladen wird.Aberichbraucheeine Möglichkeit zu unterscheiden,welche Seite verwendet wird.- Derzeit versucheich diesmit is_page () wie obenbeschrieben.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
-
Versuchen Sie,"is_page ()"innerhalb von "ajax_login ()" oderinnerhalb von "ajax_login_init ()" auszuführen?Ersteres kannnichtfunktionieren,daes sich umeinen Ajax-Kontext handelt.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
-
Ich habe die Dateien,in denen sich die Funktionenbefinden,alsbeschreibenden Text oben aufgezählt.Die Dateiis_page () wirdin der Dateifunctions.php verwendet und dient dazu,die Dateinurbei Bedarfin die Ajax-Funktionen aufzunehmen.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 Auch hierfunktioniert `is_page ()`nichtin einem Ajax-Kontext.Ich habemeine Antwortentsprechend aktualisiert.@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
Denken Sie daran,den Funktionsnamen 'action' an das Tag
wp_ajax_
anzuhängen.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);
-
-
Hallo Zee Xhan.Willkommen auf der Website.Ihre Antwortmuss überarbeitet werden.Wenn Ihre Antwort Codeist,veröffentlichen Sie zunächst keinen Screenshot.Veröffentlichen Sie den Code stattdessen als Snippet undformatieren Sieihn als Code (verwenden Sie die Schaltfläche {}).Diesist wahrscheinlich der Grund,warum Ihre Antwort abgelehnt undnicht akzeptiert wurde.Außerdem wäreeine etwas ausführlichere Erklärung hilfreich - wie "Warum" schreibeeinfach die (),und wogenaugeht dasin Bezug auf den Codeim OP (Originalbeitrag) hin?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
-
Ich habein letzter Zeit an Ajaxgearbeitet. Die Tutorials,die Sieim Internetfinden,sind alle sehr ähnlich und rechteinfach zuimplementieren. Icherhaltejedochimmereine fehlerhafte Anfrage 400 in meiner
ajax-admin.php
-Datei.Nacheiner langen undintensiven Suche habeichjetzt herausgefunden,dass dies an der Zeit der Integration liegt.
Wennich den Aktionshaken
init
verwende,um das Skript undwp_localize_script
zuinitialisieren,funktioniert alleseinwandfrei. Der Code selbstmuss also korrekt sein.Aber wennich z.B.
wp_enqeue_scripts
Aktions-Hook Icherhalteimmer die schlechte Anfrage.Das Problem dabeiist:
Ichmöchte die Funktionenin einer zusätzlichen PHP-Datei haben und sienur laden,wenn sie aufeinerbestimmten Seitebenötigt werden. Dafürbraucheich zum Beispiel
is_page ()
. Aberis_page ()
funktioniertfrühestens,wennich die Funktionmit dem Includein den Aktionscodeparse_query
einbinde:Funktionen.php
Dann werden Funktionen,diemit
init
verknüpft sind,in der Dateimy-page-test-functions.php
vermutlichnicht ausgelöst,weilinit
kommt vorparse_query
.Gibtes Best Practices,um dies zu organisieren,damitesfunktioniert? Oder wie kannich diefehlerhafte Anforderung
admin-ajax.php
beheben,wennich den Aktionshakenwp_enqeue_scripts
verwende?