Llamada AJAX desde el frontend
El sistema AJAX de WordPress permite comunicación asíncrona entre el navegador y el servidor sin recargar la página. Todas las peticiones pasan por admin-ajax.php, que actúa como punto de entrada único y gestiona la autenticación. Es imprescindible siempre verificar el nonce para evitar peticiones falsificadas (CSRF).
Casos de uso: formularios que envían datos sin recargar, filtros de contenido dinámicos, cargar más posts con un botón, votar o marcar favoritos.
<?php
// PHP: registrar la acción AJAX
add_action( 'wp_ajax_obtener_datos', 'ajax_obtener_datos' );
add_action( 'wp_ajax_nopriv_obtener_datos', 'ajax_obtener_datos' );
function ajax_obtener_datos() {
check_ajax_referer( 'mi_nonce', 'nonce' );
$id = intval( $_POST['id'] );
$post = get_post( $id );
if ( ! $post ) {
wp_send_json_error( 'Post no encontrado' );
}
wp_send_json_success( array(
'titulo' => get_the_title( $post ),
'excerpt' => get_the_excerpt( $post ),
) );
}
// JS: llamar desde el frontend
/*
jQuery.post(miPlugin.ajaxurl, {
action: 'obtener_datos',
nonce: miPlugin.nonce,
id: 123
}, function( response ) {
if ( response.success ) {
console.log( response.data.titulo );
}
});
*/
¿Qué hace cada parte?
- wp_ajax_{action}: hook para usuarios logueados. El sufijo debe coincidir exactamente con el valor de
actionque envía el JS. - wp_ajax_nopriv_{action}: mismo hook pero para visitantes no logueados. Si solo quieres AJAX para usuarios autenticados, omite esta línea.
- check_ajax_referer(): valida el nonce. Si falla, detiene la ejecución y devuelve un error
-1. Es la línea de seguridad más importante. - intval(): fuerza el parámetro a entero, evitando inyecciones SQL u otros ataques con el ID.
- wp_send_json_error() / wp_send_json_success(): envían la respuesta JSON con el formato estándar de WordPress (
{success: true, data: {...}}) y terminan la ejecución conwp_die(). - response.success: en el JS, esta propiedad indica si el PHP devolvió éxito o error, permitiendo manejar ambos casos.
