Por que usar admin-ajax.php e como isso funciona?

9

Minha chamada ajax para dados json funciona bem como esta 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 () {
  //get data here
}

javascript:

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

Eu tenho 2 perguntas.

1) Por que usar admin-ajax.php em vez de codificar seu json em um arquivo separado, como themes/example/json.phpcodificar seus dados lá?

2) Como o admin-ajax.php funciona? Eu não entendo muito desse arquivo. Ele carrega todas as funções para que você esteja pronto para usá-las?

Obrigado!

Claudiu Creanga
fonte
2
É importante notar que qualquer resposta falaria sobre por que themes/example/json.phpdeveria ser considerada uma grande vulnerabilidade de segurança
Tom J Nowell

Respostas:

14

1) Por que usar em admin-ajax.phpvez de codificar seu json em um arquivo separado como themes/example/json.phpe codificar seus dados lá?

Usar admin-ajax.phpsignifica que o WordPress Core está carregado e disponível. Sem isso, você precisaria carregar manualmente os arquivos necessários, o que é um processo complicado e propenso a falhas se você não conhece muito bem o Core. E quão bom você está com a segurança Javascript?

2) Como admin-ajax.phpfunciona? Eu não entendo muito desse arquivo. Ele carrega todas as funções para que você esteja pronto para usá-las?

  1. Carrega o WordPress Core, o que significa que você pode usar coisas como $wpdb e $WP_Query. Isso acabou na linha 25.
  2. Ele envia alguns cabeçalhos - linhas 37 - 41.
    1. Um cabeçalho de tipo de conteúdo
    2. Um cabeçalho para dizer aos navegadores para não armazenar em cache os resultados
    3. Os cabeçalhos interessantes são aqueles enviados por send_nosniff_headers()
    4. e nocache_headers().
  3. O admin_initgancho dispara.
  4. As ações principais são definidas e registradas dinamicamente - linhas 46 - 73. Elas não serão registradas a menos que sejam necessárias - ou seja, a menos que sejam solicitadas por $_GETou $_POST.
  5. O gancho da API "heartbeat" é acionado - linha 75
  6. O status "logado" do usuário solicitante é verificado e o gancho administrativo ou "sem privilégios" apropriado é acionado.

Os itens 1 e 6 são os principais motivos para usar a API AJAX, na minha opinião. Você tem o WordPress Core, que quase certamente precisa, e possui o mesmo sistema de segurança de login que o restante do WordPress.

s_ha_dum
fonte
6

admin-ajax.phpfaz parte da API AJAX do WordPress e, sim, lida com solicitações de back-end e front-end. aqui o que eu descobri para sua pergunta que é:

2) Como o admin-ajax.php funciona?

para a lógica que você pode visitar aqui.

Isso pressupõe que você já sabe enfileirar JavaScript etc.

Peça JavaScript:

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

    // We'll pass this variable to the PHP function example_ajax_request
    var fruit = 'Banana';

    // This does the ajax request
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // This outputs the result of the ajax request
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

Peça PHP:

function example_ajax_request() {

    // The $_REQUEST contains all the data sent via ajax 
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Let's take the data that was sent and do something with it
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Now we'll return it to the javascript function
        // Anything outputted will be returned in the response
        echo $fruit;

        // If you're debugging, it might be useful to see what was sent in the $_REQUEST
        // print_r($_REQUEST);

    }

    // Always die in functions echoing ajax content
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// If you wanted to also use the function for non-logged in users (in a theme for example)
 add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

1) Por que usar admin-ajax.php em vez de codificar seu json em um arquivo separado como themes / example / json.php e codificar seus dados lá?

pode ser útil. admin-ajax.php vs modelo de página personalizado para solicitações de Ajax

sohan
fonte
Ei, você pode explicar esses ganchos de ação 'wp_ajax_example_ajax_request' e 'wp_ajax_nopriv_example_ajax_request' Não encontro nenhuma explicação em lugar algum. Além disso, o que o ajaxurl resolve? Obrigado
David Okwii