¿Por qué usar admin-ajax.php y cómo funciona?

9

Mi llamada ajax para datos json funciona bien 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.

Tengo 2 preguntas

1) ¿Por qué usar admin-ajax.php en lugar de codificar su json en un archivo separado themes/example/json.phpy codificar sus datos allí?

2) ¿Cómo funciona admin-ajax.php? No entiendo mucho de ese archivo. ¿Carga todas las funciones para que esté listo para usarlas?

¡Gracias!

Claudiu Creanga
fuente
2
Cabe destacar que cualquier respuesta hablaría sobre por qué themes/example/json.phpdebería considerarse una vulnerabilidad de seguridad importante
Tom J Nowell

Respuestas:

14

1) ¿Por qué usar en admin-ajax.phplugar de codificar su json en un archivo separado themes/example/json.phpy codificar sus datos allí?

Usar admin-ajax.phpsignifica que WordPress Core está cargado y disponible. Sin eso, necesitaría cargar manualmente los archivos que necesita, lo cual es un proceso complicado y propenso a fallas si no conoce muy bien el Core. Y, ¿qué tan bueno eres con la seguridad de Javascript?

2) ¿Cómo admin-ajax.phpfunciona? No entiendo mucho de ese archivo. ¿Carga todas las funciones para que esté listo para usarlas?

  1. Carga el núcleo de WordPress, lo que significa que puede usar cosas como $wpdb y $WP_Query. Eso es a través de la línea 25.
  2. Envía algunos encabezados: líneas 37-41.
    1. Un encabezado de tipo de contenido
    2. Un encabezado para indicar a los navegadores que no almacenen en caché los resultados
    3. Los encabezados interesantes son aquellos enviados por send_nosniff_headers()
    4. y nocache_headers().
  3. El admin_initgancho se dispara.
  4. Las acciones principales se definen y registran dinámicamente (líneas 46 a 73). No se registrarán a menos que sean necesarias, es decir, a menos que se soliciten mediante $_GETo $_POST.
  5. El "latido" API dispara enganches-- línea 75
  6. Se verifica el estado de "inicio de sesión" del usuario solicitante y se activa el enlace administrativo apropiado o "sin privilegios".

Los elementos n. ° 1 y n. ° 6 son las razones principales para utilizar la API AJAX, en mi opinión. Tiene el WordPress Core, que casi seguramente necesita, y tiene el mismo sistema de seguridad de inicio de sesión que con el resto de WordPress.

s_ha_dum
fuente
6

admin-ajax.phpes parte de la API AJAX de WordPress , y sí, maneja solicitudes tanto de backend como de front. Aquí lo que descubrí para su pregunta es:

2) ¿Cómo funciona admin-ajax.php?

por la lógica que puedes visitar aquí.

Esto supone que ya sabe cómo poner en cola JavaScript, etc.

Pieza de 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);
        }
    });   

});

Pieza de 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 qué usar admin-ajax.php en lugar de codificar su json en un archivo separado como themes / example / json.php y codificar sus datos allí?

puede ser de ayuda admin-ajax.php vs Plantilla de página personalizada para solicitudes de Ajax

Sohan
fuente
Oye, ¿puedes explicar estos ganchos de acción 'wp_ajax_example_ajax_request' y 'wp_ajax_nopriv_example_ajax_request'? No encuentro ninguna explicación en ningún lado. Además, ¿a qué se resuelve ajaxurl? Gracias
David Okwii