ajaxurl non definito sul front-end
Sto cercando di creare un form ajax sul lato front-end. Sto utilizzando questo codice
jQuery.ajax(
{
type: "post",
dataType: "json",
url: ajaxurl,
data: formData,
success: function(msg){
console.log(msg);
}
});
per il quale ottengo questo errore
Uncaught ReferenceError: ajaxurl is not definedworklorAjaxBookForm @
?page_id=2:291onclick @ ?page_id=2:202
Mentre utilizzando un codice simile nel backend amministrativo funziona. Quale URL devo utilizzare per elaborare la richiesta ajax?

Nel backend esiste una variabile globale ajaxurl
definita da WordPress stesso.
Questa variabile non viene creata da WP nel frontend. Ciò significa che se vuoi utilizzare chiamate AJAX nel frontend, devi definire questa variabile autonomamente.
Un buon modo per farlo è usare wp_localize_script
.
Supponiamo che le tue chiamate AJAX siano nel file my-ajax-script.js
, allora aggiungi wp_localize_script per questo file JS in questo modo:
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' );
Dopo aver localizzato il tuo file JS, puoi utilizzare l'oggetto my_ajax_object
nel tuo file JS:
jQuery.ajax(
{
type: "post",
dataType: "json",
url: my_ajax_object.ajax_url,
data: formData,
success: function(msg){
console.log(msg);
}
});

Posso usare wp_localize_script
senza dover usare wp_enqueue_script
?

In wp_localize_script usi l'handle dello script, quindi devi usare wp_enqueue_script almeno per uno dei tuoi script. Ma... Non usare wp_enqueue_script non è una buona idea (rischi alcuni problemi di conflitti e dipendenze).

Non ho nessuno script esterno da caricare, voglio solo usare ajaxurl per fare una chiamata ajax. Non è possibile?

E dove metterai questa chiamata AJAX? Come script inline? È un'idea pessima...

ho un modulo separato, in cui gestisco la validazione e all'invio, una chiamata ajax per inviare il modulo naturalmente nel modo WordPress aggiungendo un hook. comunque ho trovato il modo per usare ajaxurl.

Fantastico... Lo sto usando nel mio Javascript sul front end e funziona alla perfezione :)

Non capisco. E se le chiamate vengono fatte da più file separati? Come si procede in quel caso? Non si può semplicemente "dichiarare" un singolo URL AJAX per tutta l'istanza di WP? E perché non viene fatto automaticamente?

per utilizzare direttamente ajaxurl, nel tuo file del plugin aggiungi questo:
add_action('wp_head', 'myplugin_ajaxurl');
function myplugin_ajaxurl() {
echo '<script type="text/javascript">
var ajaxurl = "' . admin_url('admin-ajax.php') . '";
</script>';
}
puoi quindi utilizzare ajaxurl
per le richieste ajax.

Questa risposta rende ajaxurl
sostanzialmente uguale all'utilizzo predefinito. Il che è molto meglio della risposta accettata.

@Jules ajaxurl
è ancora disponibile in un file *.js
. Per farlo, potresti aver bisogno di dichiarare la variabile ajaxurl
all'inizio del caricamento della pagina. Un'altra cosa da considerare è la chiamata del tuo file *.js
esterno. Il file esterno dovrebbe essere chiamato DOPO che ajaxurl
sia stato istanziato e gli sia stato assegnato il valore corretto dell'URL.

E i conflitti con altri plugin o temi che dichiarano la variabile nello stesso modo? Credo che dovresti almeno usare un namespace per la variabile. Comunque, penso che la risposta accettata abbia meno potenziale di causare problemi/conflitti in futuro. Ma immagino che se sai bene cosa stai facendo, questo approccio va bene.

Il metodo del 2021 è un po' diverso ;-)
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' );
Fonte: https://developer.wordpress.org/reference/functions/wp_add_inline_script/#comment-4632

Mi sono imbattuto oggi stesso in questa stessa soluzione, c'è più informazioni su quando usare wp_add_inline_script()
rispetto a wp_localize_script()
anche nella documentazione di wp_localize_script, se sei curioso.

Ho utilizzato il codice seguente nel sito WordPress.
Possiamo usare il codice seguente per impostare ajaxurl in questo modo.
<?php echo esc_url(admin_url('admin-ajax.php')); ?>
Ho anche aggiunto un esempio di AJAX dove possiamo usare la riga sopra.
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('Fai qualcosa...');
}
});
}

Ci ho messo molte ore... e molti tentativi ed errori per far funzionare questo. Quindi, condivido come far funzionare ajax in WordPress con un esempio (ho iniziato con https://www.tweaking4all.com/web-development/wordpress/wordpress-ajax-example/#comment-562814 e ho adattato l'esempio)
--usa gli strumenti per sviluppatori di Chrome e disabilita la cache dalla scheda Network --controlla la console se ottieni errori, il primo obiettivo è vedere "ready!" nella console quando clicchi il pulsante e se tutto funziona otterrai anche un bel output!
--aggiungi al sito WordPress come blocco HTML personalizzato:
<div id="receiving_div_id">
<p>Niente ancora caricato</p>
</div>
<button id="button_to_load_data">Ottieni Contenuto Ajax</button>
--aggiungi a theme/js/button.js (crea la cartella js):
jQuery("#button_to_load_data").click(function() {
console.log( "ready!" );
var data = {
'action' : 't4a_ajax_call', // il nome della tua funzione PHP!
'function' : 'show_files', // un valore casuale che vogliamo passare
'fileid' : '7' // un altro valore casuale che vogliamo passare
};
jQuery.post(my_ajax_object.ajax_url, data, function(response) {
jQuery("#receiving_div_id").html(response);
});
});
--aggiungi al file functions.php del tema:
/* script personalizzato in functions.php del tema */
/* leggi button.js (->my-script) e localizza admin-ajax.php per 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' );
