Por defecto, WordPress no cachea las peticiones AJAX, y mucho menos cuando se trata de peticiones POST
, ya que son consideradas no idempotentes (es decir, se espera que cambien algo en el servidor). Sin embargo, en muchos casos, realizamos peticiones POST
que solo devuelven datos sin modificar nada. En esos casos, podríamos aprovechar los transients de WordPress para cachear los resultados y mejorar el rendimiento.
Vamos a ver cómo podemos cachear peticiones AJAX POST
usando transients de forma segura y eficiente.
NOTA: Este código no es para cachear todas las peticiones, sino para un plugin o algo que tú estés desarrollando. Se usa un ejemplo de WP_Query
como llamada a la base de datos.
El código
/**
* Callback para manejar peticiones AJAX POST y devolver resultados cacheados.
*
* Esta función sanitiza los parámetros recibidos, construye una clave única de caché
* basada en los valores relevantes, intenta obtener los resultados desde un transient,
* y si no existe, ejecuta la consulta, guarda en caché y devuelve los datos en formato JSON.
*
* @return void
*/
function robotstxt_ajax_request_callback() {
// Validamos y saneamos los parámetros necesarios.
$query = isset( $_POST['query'] ) ? sanitize_text_field( $_POST['query'] ) : '';
// Si no hay parámetros válidos, retornamos error.
if ( empty( $query ) ) {
wp_send_json_error( array(
'message' => 'Parámetro "query" no proporcionado.',
));
}
// Preparamos el array que influye en el resultado (excluyendo datos volátiles).
$cacheable_post = array(
'query' => $query,
);
// Generamos la clave única del transient.
$transient_key = 'ajax_cache_' . md5( wp_json_encode( $cacheable_post ) );
// Intentamos obtener los datos cacheados.
$data = get_transient( $transient_key );
if ( $data === false ) {
// Ejecutamos la consulta real.
$results = robotstxt_custom_query_function( $query );
// Si no se obtienen resultados, respondemos con error.
if ( empty( $results ) ) {
wp_send_json_error(array(
'message' => 'No se encontraron resultados.',
));
}
$data = array(
'results' => $results,
);
// Guardamos en la caché (60 segundos por defecto, modificable mediante filtro).
$expiration = apply_filters( 'robotstxt_ajax_cache_expiration', 60 );
set_transient( $transient_key, $data, $expiration );
}
// Devolvemos la respuesta cacheada o recién generada.
wp_send_json_success( $data );
}
/**
* Ejecuta una consulta a la base de datos para obtener publicaciones que coincidan con el término de búsqueda.
*
* Esta función utiliza $wpdb para buscar entradas del tipo 'post' cuyo título contenga la cadena proporcionada.
*
* @param string $query Término de búsqueda.
* @return array Lista de resultados con ID y título de cada publicación.
*/
function robotstxt_custom_query_function( $query ) {
global $wpdb;
// Construimos el patrón de búsqueda.
$like = '%' . $wpdb->esc_like( $query ) . '%';
// Ejecutamos la consulta.
$results = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_title FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' AND post_title LIKE %s LIMIT 10", $like ), ARRAY_A );
return $results;
}
add_action( 'wp_ajax_robotstxt_ajax_request', 'robotstxt_ajax_request_callback' );
add_action( 'wp_ajax_nopriv_robotstxt_ajax_request', 'robotstxt_ajax_request_callback' );
Análisis del código
- Registro del AJAX:
add_action('wp_ajax_my_ajax_request', 'robotstxt_ajax_request_callback'); add_action('wp_ajax_nopriv_my_ajax_request', '
Esto permite que tanto usuarios conectados como no conectados puedan ejecutar la función AJAX.robotstxt
_ajax_request_callback'); - Generación de la clave de caché:
$transient_key = 'ajax_cache_' . md5(json_encode($_POST));
Se utiliza un hash MD5 para generar una clave única basada en los datos delPOST
. Es una técnica eficaz, aunque se puede mejorar (ver mejoras más abajo). - Lectura y escritura del transient:
$data = get_transient($transient_key); if ( false === $data ) { // Generar y cachear }
- Respuesta JSON:
wp_send_json_success($data);
Cachear peticiones POST
en WordPress puede parecer contra intuitivo, pero si sabes que una petición no modifica datos y su resultado puede ser reutilizado, puedes aprovecharlos para reducir la carga en tu servidor y mejorar los tiempos de respuesta para tus usuarios.
Deja una respuesta