Perché usare admin-ajax.php e come funziona?

10 giu 2015, 02:53:54
Visualizzazioni: 40.4K
Voti: 15

La mia chiamata ajax per i dati json funziona correttamente in questo modo functions.php:

add_action( 'wp_ajax_nopriv_load-filter', 'prefix_load_cat_posts' );
add_action( 'wp_ajax_load-filter', 'prefix_load_cat_posts' );
function prefix_load_cat_posts () {
  //ottieni i dati qui
}

javascript:

var ajaxurl = 'http://'+window.location.host+'/wp-admin/admin-ajax.php';
jQuery.ajax({
    type: 'POST',
    url: ajaxurl,
    etc.

Ho 2 domande.

1) Perché usare admin-ajax.php invece di codificare il json in un file separato come themes/example/json.php e codificare i dati lì?

2) Come funziona admin-ajax.php? Non capisco molto da quel file. Carica tutte le funzioni in modo che siano pronte all'uso?

Grazie!

1
Commenti

Da notare, qualsiasi risposta dovrebbe spiegare perché themes/example/json.php dovrebbe essere considerata una grave vulnerabilità di sicurezza

Tom J Nowell Tom J Nowell
10 giu 2015 04:45:12
Tutte le risposte alla domanda 2
0
17

1) Perché usare admin-ajax.php invece di codificare il tuo json in un file separato come themes/example/json.php e codificare i dati lì?

Usare admin-ajax.php significa che il Core di WordPress è caricato e disponibile. Senza di esso, dovresti caricare manualmente i file necessari, un processo complicato e soggetto a errori se non conosci il Core in modo approfondito. Inoltre, quanto sei esperto in sicurezza Javascript?

2) Come funziona admin-ajax.php? Non capisco molto da quel file. Carica tutte le funzioni così sono pronte per l'uso?

  1. Carica il Core di WordPress, il che significa che puoi usare elementi come $wpdb e $WP_Query. Questo avviene fino circa alla riga 25.
  2. Invia alcuni header - righe 37 - 41.
    1. Un header per il tipo di contenuto
    2. Un header per dire ai browser di non memorizzare nella cache i risultati
    3. Gli header interessanti sono quelli inviati da send_nosniff_headers()
    4. e nocache_headers().
  3. Viene attivato l'hook admin_init.
  4. Le azioni principali sono definite e registrate dinamicamente - righe 46 - 73. Queste non verranno registrate a meno che non siano necessarie - cioè, a meno che non siano richieste via $_GET o $_POST.
  5. Viene attivato l'hook dell'API "heartbeat" - riga 75
  6. Viene verificato lo stato di "accesso" dell'utente che fa la richiesta e viene attivato l'hook amministrativo appropriato o quello "senza privilegi".

I punti #1 e #6 sono le ragioni principali per usare l'API AJAX, secondo me. Hai il Core di WordPress, di cui quasi certamente hai bisogno, e hai lo stesso sistema di sicurezza per l'accesso come nel resto di WordPress.

10 giu 2015 17:04:27
1

admin-ajax.php fa parte della API AJAX di WordPress e gestisce le richieste sia dal backend che dal frontend. Ecco cosa ho capito per la tua domanda:

2) Come funziona admin-ajax.php?

Per la logica puoi visitare questo link.

Si presuppone che tu sappia già come accodare JavaScript, ecc.

Parte JavaScript:

jQuery(document).ready(function($) {

    // Passeremo questa variabile alla funzione PHP example_ajax_request
    var fruit = 'Banana';

    // Questa è la richiesta ajax
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // Questo mostra il risultato della richiesta ajax
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

Parte PHP:

function example_ajax_request() {

    // $_REQUEST contiene tutti i dati inviati via ajax
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Prendiamo i dati inviati e facciamo qualcosa
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Restituiamo il risultato alla funzione javascript
        // Qualsiasi output sarà restituito nella risposta
        echo $fruit;

        // Se stai facendo debug, può essere utile vedere cosa è stato inviato in $_REQUEST
        // print_r($_REQUEST);

    }

    // È sempre necessario usare die() nelle funzioni che restituiscono contenuti ajax
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// Se vuoi usare la funzione anche per utenti non loggati (ad esempio in un tema)
 add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

1) Perché usare admin-ajax.php invece di codificare il json in un file separato come themes/example/json.php e codificare i dati lì?

Forse questo può esserti utile: admin-ajax.php vs Template di Pagina Personalizzata per Richieste Ajax

10 giu 2015 10:54:47
Commenti

Ciao, puoi spiegarmi questi action hook 'wp_ajax_example_ajax_request' e 'wp_ajax_nopriv_example_ajax_request'? Non trovo spiegazioni da nessuna parte. Inoltre, a cosa risolve ajaxurl? Grazie

David Okwii David Okwii
13 apr 2020 13:55:19