Eroare 400 bad request la admin-ajax.php folosind doar hook-ul de acțiune wp_enqueue_scripts

17 ian. 2018, 12:39:08
Vizualizări: 108K
Voturi: 24

Am lucrat recent cu ajax. Tutorialele pe care le găsești pe internet sunt toate foarte similare și destul de ușor de implementat. Dar întotdeauna primesc o eroare bad request 400 pe fișierul meu ajax-admin.php.

După o căutare lungă și intensivă, am descoperit că este din cauza momentului integrării.

Dacă folosesc hook-ul de acțiune init pentru a inițializa scriptul și wp_localize_script, totul funcționează bine. Deci codul în sine trebuie să fie corect.

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' => __('Se trimit informațiile utilizatorului, vă rugăm așteptați...')));
   add_action('wp_ajax_nopriv_ajaxlogin','ajax_login');
}

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

function ajax_login(){
    //câmpul nonce este creat în pagină
    check_ajax_referer('ajax-login-nonce','security');
    //COD
    die();
}

Dar dacă folosesc de exemplu hook-ul de acțiune wp_enqeue_scripts primesc întotdeauna eroarea bad request.

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

Problema cu aceasta este:

Aș dori să am funcțiile într-un fișier php separat și să le încarc doar dacă sunt necesare pe o anumită pagină. Pentru aceasta am nevoie, de exemplu, de is_page(). Dar is_page() funcționează cel mai devreme când conectez funcția cu include la hook-ul de acțiune 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');

Așadar, funcțiile conectate la hook-ul init în fișierul my-page-test-functions.php nu sunt declanșate, presupun, deoarece init vine înaintea parse_query.

Există cele mai bune practici pentru a organiza acest lucru, astfel încât să funcționeze? Sau cum pot remedia eroarea bad request de la admin-ajax.php când folosesc hook-ul de acțiune wp_enqeue_scripts?

1
Comentarii

poți verifica această discuție aici https://stackoverflow.com/a/66464509/13278193

mod7ex mod7ex
3 mar. 2021 22:44:13
Toate răspunsurile la întrebare 4
4
21

Cred că singurul lucru care lipsește aici este că trebuie să muți add_action('wp_ajax_nopriv_ajaxlogin','ajax_login'); în afara funcției ajax_login_init.

Acel cod înregistrează handler-ul tău Ajax, dar când îl rulezi doar pe wp_enqueue_scripts, deja este prea târziu și hook-urile wp_ajax_nopriv_ au fost deja executate.

Deci, ai încercat ceva de genul acesta:

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' => __('Trimit informațiile utilizatorului, te rog așteaptă...')));
}

add_action( 'wp_enqueue_scripts','ajax_login_init' );

add_action( 'wp_ajax_nopriv_ajaxlogin','ajax_login' );

function ajax_login(){
  //nonce-field este creat pe pagină
  check_ajax_referer('ajax-login-nonce','security');
  //COD
  die();
}

Edit:

Acum este mai clar că vrei să încarci JavaScript-ul doar pe acea pagină specifică. Asta înseamnă că trebuie să pui verificarea is_page() în interiorul funcției ajax_login_init(). Am actualizat codul în consecință.

Acum, de ce nu a funcționat soluția ta?

Verificarea is_page() însemna că fișierul tău de funcții era încărcat doar pe acea pagină specifică. ajax_login_init() este apelat și scripturile tale sunt încărcate. Până aici, totul este în regulă.

Acum, scriptul tău face apelul ajax. După cum s-a menționat în comentarii, apelurile ajax nu sunt conștiente de pagina curentă pe care te afli. Există un motiv pentru care fișierul se află la wp-admin/admin-ajax.php. Nu există WP_Query și astfel is_page() nu funcționează în timpul unui apel ajax.

Deoarece asta nu funcționează, sw18_page_specific_functions() nu va face nimic într-un context ajax. Asta înseamnă că fișierul tău de funcții nu este încărcat și handler-ul tău ajax nu există.

De aceea, trebuie să incluzi întotdeauna acel fișier de funcții și să muți verificarea is_page() în interiorul funcției ajax_login_init().

Deci, în loc de sw18_page_specific_functions() { … }, rulează direct include_once dirname(__FILE__).'/includes/my-page-test-functions.php';. Fără niciun apel add_action( 'parse_query' ).

17 ian. 2018 12:48:26
Comentarii

Sugestie bună. Am schimbat asta (în continuare aceeași eroare), dar problema rămâne că fișierul care conține funcțiile se va încărca prea târziu. Dar am nevoie de o metodă pentru a distinge ce pagină este utilizată. - în prezent încerc acest lucru cu is_page() așa cum este descris mai sus.

Sin Sin
17 ian. 2018 13:04:22

Încerci să rulezi is_page() din interiorul ajax_login() sau din interiorul ajax_login_init(). Prima variantă nu poate funcționa pentru că se află într-un context Ajax.

swissspidy swissspidy
17 ian. 2018 14:05:58

Am enumerat fișierele în care se află funcțiile, ca text descriptiv mai sus. Funcția is_page() este utilizată în functions.php și servește pentru a include fișierul cu funcțiile ajax doar atunci când este necesar.

Sin Sin
17 ian. 2018 14:48:35

@Sin Din nou, is_page() nu funcționează într-un context Ajax. Am actualizat răspunsul meu în consecință.

swissspidy swissspidy
17 ian. 2018 14:58:22
0

Nu uitați să adaugi numele funcției 'action' după tag-ul wp_ajax_.

function fetchorderrows() { // Această funcție va fi executată la submit-ul AJAX
  // Fă lucruri minunate aici toată ziua
}

add_action('wp_ajax_fetchorderrows', 'fetchorderrows', 0);
14 apr. 2019 23:43:03
1
-1

În cazul în care cineva utilizează o abordare bazată pe clase și întâmpină problema de eroare 400 la cererile AJAX, poate fi necesar să mutați manipulatoarele AJAX în afara clasei (încercați în fișierul principal al plugin-ului) și să utilizați clasa și metoda în al doilea argument.

add_action( 'wp_ajax_your_handle', [ 'Class_Name', 'function_name' ] );
add_action( 'wp_ajax_nopriv_your_handle', [ 'Class_Name', 'function_name' ] );
18 nov. 2020 11:48:31
Comentarii

Nu este nevoie să le mutați în afara clasei. Doar conectați-le la admin_init, astfel încât acestea să fie executate în timpul gestionării cererilor ajax.

Erenor Paz Erenor Paz
18 dec. 2020 16:50:41
1
-4

doar scrie die; la sfârșit ca mai jos...introdu descrierea imaginii aici

12 nov. 2018 15:12:27
Comentarii

Salut Zee Xhan. Bine ai venit pe site. Răspunsul tău are nevoie de unele revizuiri. În primul rând, dacă răspunsul tău conține cod, nu posta o captură de ecran. În schimb, postează codul ca un fragment și formatează-l ca cod (folosește butonul {}). Acesta este probabil motivul pentru care răspunsul tău a primit un vot negativ și nu a fost acceptat. De asemenea, o mică explicație suplimentară ar fi utilă - cum ar fi "de ce" să folosești doar die(), și unde anume se plasează acest lucru în relație cu codul din OP (postarea originală)?

butlerblog butlerblog
12 nov. 2018 16:46:11