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

10 jun 2015, 02:53:54
Vistas: 40.4K
Votos: 15

Mi llamada ajax para datos json funciona bien de esta manera 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 () {
  //obtener datos aquí
}

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 tu json en un archivo separado como themes/example/json.php y codificar tus datos allí?

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

¡Gracias!

1
Comentarios

Es importante destacar que cualquier respuesta debería hablar sobre por qué themes/example/json.php debería considerarse una vulnerabilidad de seguridad importante

Tom J Nowell Tom J Nowell
10 jun 2015 04:45:12
Todas las respuestas a la pregunta 2
0
17

1) ¿Por qué usar admin-ajax.php en lugar de codificar tu json en un archivo separado como themes/example/json.php y codificar tus datos allí?

Usar admin-ajax.php significa que el núcleo de WordPress está cargado y disponible. Sin eso, tendrías que cargar manualmente los archivos que necesitas, lo cual es un proceso complicado y propenso a fallos si no conoces muy, muy bien el núcleo. Además, ¿qué tan bueno eres con la seguridad en Javascript?

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

  1. Carga el núcleo de WordPress, lo que significa que puedes usar cosas como $wpdb y $WP_Query. Esto ocurre hasta aproximadamente la línea 25.
  2. Envía algunas cabeceras - líneas 37 - 41.
    1. Una cabecera de tipo de contenido
    2. Una cabecera para indicar a los navegadores que no almacenen en caché los resultados
    3. Las cabeceras interesantes son las enviadas por send_nosniff_headers()
    4. y nocache_headers().
  3. Se ejecuta el hook admin_init.
  4. Las acciones principales se definen y registran dinámicamente - líneas 46 - 73. Estas no se registrarán a menos que sean necesarias, es decir, a menos que se soliciten mediante $_GET o $_POST.
  5. Se ejecuta el hook de la API "heartbeat" - línea 75
  6. Se verifica el estado de "logueado" del usuario que realiza la solicitud y se ejecuta el hook administrativo apropiado o el hook de "sin privilegios".

Los puntos #1 y #6 son las principales razones para usar la API AJAX, en mi opinión. Tienes el núcleo de WordPress, que casi seguramente necesitas, y tienes el mismo sistema de seguridad de inicio de sesión que en el resto de WordPress.

10 jun 2015 17:04:27
1

admin-ajax.php es parte de la API AJAX de WordPress, y sí, maneja solicitudes tanto del backend como del frontend. esto es lo que descubrí para tu pregunta que es:

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

para la lógica puedes visitar aquí.

Esto asume que ya sabes cómo encolar JavaScript, etc.

Parte de JavaScript:

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

    // Pasaremos esta variable a la función PHP example_ajax_request
    var fruit = 'Banana';

    // Esto hace la solicitud ajax
    $.ajax({
        url: ajaxurl,
        data: {
            'action':'example_ajax_request',
            'fruit' : fruit
        },
        success:function(data) {
            // Esto muestra el resultado de la solicitud ajax
            console.log(data);
        },
        error: function(errorThrown){
            console.log(errorThrown);
        }
    });   

});

Parte de PHP:

function example_ajax_request() {

    // $_REQUEST contiene todos los datos enviados via ajax 
    if ( isset($_REQUEST) ) {

        $fruit = $_REQUEST['fruit'];

        // Tomemos los datos que fueron enviados y hagamos algo con ellos
        if ( $fruit == 'Banana' ) {
            $fruit = 'Apple';
        }

        // Ahora lo retornaremos a la función javascript
        // Cualquier salida será retornada en la respuesta
        echo $fruit;

        // Si estás depurando, puede ser útil ver lo que fue enviado en $_REQUEST
        // print_r($_REQUEST);

    }

    // Siempre usa die() en funciones que emiten contenido ajax
   die();
}

add_action( 'wp_ajax_example_ajax_request', 'example_ajax_request' );

// Si también quisieras usar la función para usuarios no logueados (en un tema por ejemplo)
 add_action( 'wp_ajax_nopriv_example_ajax_request', 'example_ajax_request' );

1) ¿Por qué usar admin-ajax.php en lugar de codificar tu json en un archivo separado como themes/example/json.php y codificar tus datos allí?

quizás esto sea útil.admin-ajax.php vs Plantilla de Página Personalizada para Solicitudes Ajax

10 jun 2015 10:54:47
Comentarios

Oye, ¿puedes explicar estos action hooks 'wp_ajax_example_ajax_request' y 'wp_ajax_nopriv_example_ajax_request'? No encuentro explicación en ningún lado. También, ¿a qué resuelve ajaxurl? Gracias.

David Okwii David Okwii
13 abr 2020 13:55:19