ajaxurl non definito sul front-end

3 giu 2015, 10:26:55
Visualizzazioni: 162K
Voti: 41

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?

1
Commenti

Controlla questo tutorial. Potrebbe esserti d'aiuto. http://www.1stwebdesigner.com/implement-ajax-wordpress-themes/

Nilambar Sharma Nilambar Sharma
3 giu 2015 10:51:32
Tutte le risposte alla domanda 5
8
75

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);
        }
    });
3 giu 2015 10:42:53
Commenti

Posso usare wp_localize_script senza dover usare wp_enqueue_script?

dread_cat_pirate dread_cat_pirate
3 giu 2015 11:12:18

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

Krzysiek Dróżdż Krzysiek Dróżdż
5 giu 2015 09:04:02

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

R T R T
23 set 2015 10:05:12

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

Krzysiek Dróżdż Krzysiek Dróżdż
23 set 2015 10:07:34

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.

R T R T
23 set 2015 10:25:09

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

Omer Omer
17 ott 2017 21:17:39

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?

Cornelius Cornelius
3 nov 2020 06:21:26

Da un po' di tempo esiste wp_add_inline_script() che viene considerata un'alternativa più moderna e pulita rispetto al vecchio wp_localize_script() per questi specifici casi AJAX.

Viktor Borítás Viktor Borítás
8 apr 2021 19:17:17
Mostra i restanti 3 commenti
5
57

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.

23 set 2015 10:28:41
Commenti

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

Abel Melquiades Callejo Abel Melquiades Callejo
25 dic 2018 06:01:18

vero, ma è inutile se lo stai usando in un file .js.

Jules Jules
20 mar 2019 09:56:46

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

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

cos'è un errore nella console?

Dharmishtha Patel Dharmishtha Patel
29 gen 2020 09:10:42

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.

Jules Jules
22 set 2020 17:42:28
1

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

23 mar 2021 23:21:24
Commenti

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.

PsychoMantis PsychoMantis
25 ott 2021 22:24:34
0

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...');
            }
        });
    }
28 gen 2020 07:39:43
0

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' );
3 dic 2021 16:23:51