ajaxurl nu este definit în frontend
Î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?

Î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);
}
});

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

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).

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

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

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.

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

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?

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.

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

@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.

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ă.

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

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.

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

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