ajaxurl nu este definit în frontend

3 iun. 2015, 10:26:55
Vizualizări: 162K
Voturi: 41

Încerc să creez un formular ajax în partea frontală. Folosesc codul

    jQuery.ajax(
        {
            type: "post",
            dataType: "json", 
            url: ajaxurl,
            data: formData,
            success: function(msg){
                console.log(msg);
            }
        });

pentru care primesc eroarea

Uncaught ReferenceError: ajaxurl is not defined worklorAjaxBookForm @ 
?page_id=2:291onclick @ ?page_id=2:202

În timp ce folosirea unui cod similar în backend-ul de administrare funcționează. Ce URL trebuie să folosesc pentru a procesa cererea ajax?

1
Comentarii

Verifică acest tutorial. S-ar putea să te ajute. http://www.1stwebdesigner.com/implement-ajax-wordpress-themes/

Nilambar Sharma Nilambar Sharma
3 iun. 2015 10:51:32
Toate răspunsurile la întrebare 5
8
75

În backend există variabila globală ajaxurl definită de WordPress.

Această variabilă nu este creată de WP în frontend. Aceasta înseamnă că dacă dorești să folosești apeluri AJAX în frontend, atunci trebuie să definești tu această variabilă.

O metodă bună de a face acest lucru este să folosești wp_localize_script.

Să presupunem că apelurile tale AJAX sunt în fișierul my-ajax-script.js, atunci adaugă wp_localize_script pentru acest fișier JS astfel:

function my_enqueue() {

    wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/my-ajax-script.js', array('jquery') );

    wp_localize_script( 'ajax-script', 'my_ajax_object',
            array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue' );

După localizarea fișierului tău JS, poți folosi obiectul my_ajax_object în fișierul tău JS:

jQuery.ajax(
    {
        type: "post",
        dataType: "json",
        url: my_ajax_object.ajax_url,
        data: formData,
        success: function(msg){
            console.log(msg);
        }
    });
3 iun. 2015 10:42:53
Comentarii

pot folosi wp_localize_script fără să fie nevoie să folosesc wp_enqueue_scritp?

dread_cat_pirate dread_cat_pirate
3 iun. 2015 11:12:18

Folosești un handle de script în wp_localize_script, așa că trebuie să folosești wp_enqueue_script pentru cel puțin unul dintre scripturile tale. Dar... A nu folosi wp_enqueue_script nu este o idee bună (risci să ai conflicte și probleme cu dependențele).

Krzysiek Dróżdż Krzysiek Dróżdż
5 iun. 2015 09:04:02

nu am niciun script extern de încărcat, vreau doar să folosesc ajaxurl pentru a face un apel ajax. nu este posibil acest lucru?

R T R T
23 sept. 2015 10:05:12

Și unde vei pune acest apel AJAX? Ca script inline? Este o idee foarte proastă...

Krzysiek Dróżdż Krzysiek Dróżdż
23 sept. 2015 10:07:34

Am un formular separat, în care fac validarea și la submit, un apel AJAX pentru a trimite formularul, bineînțeles în modul WordPress prin adăugarea unui hook. Oricum, am găsit o soluție pentru folosirea ajaxurl.

R T R T
23 sept. 2015 10:25:09

Minunat... Îl folosesc în JavaScript pe front-end și funcționează perfect :)

Omer Omer
17 oct. 2017 21:17:39

Nu înțeleg. Ce se întâmplă dacă apelurile sunt făcute din multiple fișiere separate? Cum procedați în acest caz? Nu se poate pur și simplu "declara" un singur URL ajax pentru întreaga instanță WP? Și de ce nu se face asta automat?

Cornelius Cornelius
3 nov. 2020 06:21:26

De ceva timp există wp_add_inline_script() care este considerată o alternativă mai modernă și mai curată față de vechiul wp_localize_script() pentru aceste cazuri specifice cu ajax.

Viktor Borítás Viktor Borítás
8 apr. 2021 19:17:17
Arată celelalte 3 comentarii
5
57

pentru a folosi direct ajaxurl, în fișierul tău de plugin adaugă acest cod:

add_action('wp_head', 'myplugin_ajaxurl');

function myplugin_ajaxurl() {

   echo '<script type="text/javascript">
           var ajaxurl = "' . admin_url('admin-ajax.php') . '";
         </script>';
}

apoi poți folosi variabila ajaxurl pentru cereri AJAX.

23 sept. 2015 10:28:41
Comentarii

Acest răspuns face ca ajaxurl să fie similar cu utilizarea implicită. Ceea ce este mult mai bine decât răspunsul acceptat.

Abel Melquiades Callejo Abel Melquiades Callejo
25 dec. 2018 06:01:18

adevărat, dar este inutil dacă îl folosești într-un fișier .js.

Jules Jules
20 mar. 2019 09:56:46

@Jules ajaxurl este încă disponibil într-un fișier *.js. Pentru a face acest lucru, poate fi necesar să declari variabila ajaxurl de la începutul încărcării paginii. Un alt lucru de luat în considerare este apelarea fișierului tău extern *.js. Fișierul extern ar trebui să fie apelat DUPĂ ce ajaxurl a fost instanțiat și i s-a atribuit valoarea corectă a URL-ului.

Abel Melquiades Callejo Abel Melquiades Callejo
9 nov. 2019 02:53:04

ce este o eroare în consolă?

Dharmishtha Patel Dharmishtha Patel
29 ian. 2020 09:10:42

Dar despre conflictele cu alte plugin-uri sau teme care declară variabila în același mod? Cred că ar trebui măcar să folosești un namespace pentru variabilă. Oricum, cred că răspunsul acceptat are mai puțin potențial de a provoca probleme/conflicte mai târziu. Dar presupun că dacă știi exact ce faci, această abordare este în regulă.

Jules Jules
22 sept. 2020 17:42:28
1

Metoda din 2021 este un pic diferită ;-)

function my_enqueue() {

    wp_enqueue_script( 'ajax-script', get_template_directory_uri() . '/js/my-ajax-script.js', array('jquery') );

    wp_add_inline_script( 'ajax-script', 
        'const myVariables = ' . json_encode( 
                                    array(
                                        'ajaxUrl' => admin_url( 'admin-ajax.php' ),
                                        ) ),
        'before' );

}
add_action( 'wp_enqueue_scripts', 'my_enqueue' );

Sursă: https://developer.wordpress.org/reference/functions/wp_add_inline_script/#comment-4632

23 mar. 2021 23:21:24
Comentarii

Am dat peste aceeași soluție astăzi, există mai multe informații despre când să folosești wp_add_inline_script() versus wp_localize_script() și în documentația pentru wp_localize_script, dacă ești curios.

PsychoMantis PsychoMantis
25 oct. 2021 22:24:34
0

Am folosit codul de mai jos pe un site WordPress.
Putem folosi următorul cod pentru a configura ajaxurl în acest fel:

<?php echo esc_url(admin_url('admin-ajax.php')); ?>  

Am adăugat și un exemplu de AJAX unde putem folosi linia de mai sus:

 function setNotificationRead() {
        fetch('<?php echo esc_url(admin_url('admin-ajax.php')); ?>', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
            },
            body: `action=yourFunctionsAction`,
            credentials: 'same-origin'
        }).then(response => {
            return response.json();
        }).then(data => {
            if (data.status === 'true') {
                console.log('Fă ceva...');
            }
        });
    }
28 ian. 2020 07:39:43
0

Am reușit să fac asta să funcționeze după multe ore... și încercări și erori. Așadar, împărtășesc cum să faci AJAX să funcționeze în WordPress cu un exemplu (am pornit de la https://www.tweaking4all.com/web-development/wordpress/wordpress-ajax-example/#comment-562814 și am adaptat exemplul)

--folosește instrumentele de dezvoltare Chrome și dezactivează cache-ul din fila Network
--uită-te la consolă dacă primești erori, primul obiectiv este să obții mesajul "ready!" în consolă când apeși butonul și dacă totul funcționează, vei obține și o ieșire frumoasă!

--adaugă în site-ul WordPress ca bloc HTML personalizat:

<div id="receiving_div_id">
   <p>Încă nu s-a încărcat nimic</p>
</div>
<button id="button_to_load_data">Încarcă conținut AJAX</button>

--adaugă în tema/js/button.js (creează folderul js):

   jQuery("#button_to_load_data").click(function() {
        console.log( "ready!" );
      var data = {
         'action'   : 't4a_ajax_call', // numele funcției tale PHP!
         'function' : 'show_files',    // o valoare aleatorie pe care dorim să o transmitem
         'fileid'   : '7'              // o altă valoare aleatorie pe care dorim să o transmitem
         };
       
      jQuery.post(my_ajax_object.ajax_url, data, function(response) {
         jQuery("#receiving_div_id").html(response);
      });
   });

--adaugă în functions.php al temei:

 /* script personalizat în functions.php al temei */

/* încarcă button.js (->my-script) și localizează admin-ajax.php pentru my-script */
function add_my_script() {

  wp_enqueue_script( 'my-script', 
         get_template_directory_uri() . '/js/button.js', 
         array ( 'jquery' ), 
         false,
         true
  );
  
      wp_localize_script( 'my-script', 'my_ajax_object',
            array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );

}
add_action( 'wp_enqueue_scripts', 'add_my_script' );
3 dec. 2021 16:23:51