Usar Transients para cachear resultados

Php marzo 10, 2026

Los Transients son el sistema de caché temporal de WordPress. Almacenan datos en la base de datos (o en un sistema de caché externo como Redis si está configurado) durante un tiempo determinado. Son perfectos para evitar queries lentas, llamadas a APIs externas o procesamiento pesado que no necesita ejecutarse en cada petición.

Casos de uso: cachear resultados de WP_Query costosas, almacenar respuestas de APIs externas, guardar datos procesados que tardan en calcularse (estadísticas, conteos, transformaciones).

<?php
function mi_obtener_posts_destacados() {
    $posts = get_transient( 'mi_posts_destacados' );

    if ( false === $posts ) {
        $query = new WP_Query( array(
            'post_type'      => 'proyecto',
            'posts_per_page' => 3,
            'meta_key'       => '_destacado',
            'meta_value'     => '1',
        ) );
        $posts = $query->posts;

        set_transient( 'mi_posts_destacados', $posts, 12 * HOUR_IN_SECONDS );
        wp_reset_postdata();
    }

    return $posts;
}

add_action( 'save_post_proyecto', function() {
    delete_transient( 'mi_posts_destacados' );
} );

¿Qué hace cada parte?

  • get_transient(): intenta recuperar el valor guardado. Devuelve false si no existe o ha expirado — este es el patrón de comprobación estándar.
  • false === $posts: comparación estricta importante porque el valor guardado podría ser un array vacío [], que es diferente de false.
  • set_transient(): guarda el valor durante el tiempo especificado. El tercer parámetro es la duración en segundos.
  • HOUR_IN_SECONDS: constante de WordPress que vale 3600. WordPress define otras como DAY_IN_SECONDS, WEEK_IN_SECONDS, MONTH_IN_SECONDS.
  • save_post_proyecto: hook específico del CPT que se dispara al guardar un proyecto. Al borrarlo del caché en este momento, se asegura que la próxima visita regenere los datos actualizados.
  • delete_transient(): invalida el caché manualmente. Sin esto, los cambios en el contenido tardarían hasta 12 horas en reflejarse.