Guia completa del desarrollador: WP_Query, get_posts, shortcodes. Aprende a filtrar posts por categoría y optimizar consultas.
ES

Extraer listas de posts de categorías en WordPress – Guia del desarrollador

5.00 /5 - (34 votes )
Última verificación: 1 de mayo de 2026
7min de lectura
Tutorial
500+ proyectos WP
Desarrollador full-stack

#Introduccion a la recuperacion de posts basada en categorías

Conoce más sobre el desarrollo WordPress profesional en WPPoland.

Una de las tareas más comunes en el desarrollo de WordPress es recuperar posts de categorías específicas. Ya sea que estes construyendo un diseño de homepage personalizado, creando una plantilla de archivo de categoría o mostrando contenido relacionado, entender como consultar posts por categoría de forma eficiente es esencial para cualquier desarrollador WordPress.

Esta guía completa cubre multiples enfoques para extraer listas de posts de categorías, desde implementaciónes simples hasta técnicas avanzadas de optimización. Al final, tendras un kit de herramientas completo para manejar consultas basadas en categorías en cualquier proyecto WordPress.

#Entendiendo las categorías de WordPress

Antes de profundizar en el código, es importante entender como WordPress maneja las categorías:

  • Las categorías son una taxonomía incorporada en WordPress
  • Cada post puede pertenecer a multiples categorías
  • Las categorías pueden ser jerarquicas (relaciones padre/hijo)
  • Los datos de categoría se almacenan en las tablas wp_terms y wp_term_taxonomy
  • Las relaciones post-categoría se almacenan en wp_term_relationships

Entender esta estructura te ayuda a escribir consultas más eficientes y soluciónar problemas cuando surjan.

#Método 1: WP_Query (El enfoque flexible)

WP_Query es la clase principal de WordPress para consultar posts. Ofrece maxima flexibilidad y es el enfoque recomendado para la mayoria de los casos de uso.

#Consulta básica por categoría

$args = array(
    'category_name' => 'noticias',
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC'
);

$query = new WP_Query($args);

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        // Mostrar contenido del post
        ?>
        <article>
            <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
            <div class="entry-content">
                <?php the_excerpt(); ?>
            </div>
        </article>
        <?php
    }
    wp_reset_postdata();
}

#Consulta por ID de categoría

$args = array(
    'cat' => 5, // ID de categoria
    'posts_per_page' => 5
);

$query = new WP_Query($args);

#Multiples categorías

// Posts en CUALQUIERA de estas categorias (relacion OR)
$args = array(
    'category__in' => array(5, 10, 15),
    'posts_per_page' => 10
);

// Posts en TODAS estas categorias (relacion AND)
$args = array(
    'category__and' => array(5, 10),
    'posts_per_page' => 10
);

// Excluir categorias específicas
$args = array(
    'category__not_in' => array(3, 7),
    'posts_per_page' => 10
);

#Incluyendo categorías hijas

// Obtener posts de la categoria y todas sus hijas
$id_categoria_padre = 5;

$args = array(
    'cat' => $id_categoria_padre,
    'posts_per_page' => 20
);

// WP_Query incluye automáticamente categorias hijas cuando usas 'cat'

#Método 2: get_posts() (El enfoque simple)

Para casos de uso más simples, get_posts() proporciona una API más directa.

#Uso básico

$posts = get_posts(array(
    'category' => 5,
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC'
));

foreach ($posts as $post) {
    setup_postdata($post);
    ?>
    <article>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    </article>
    <?php
}
wp_reset_postdata();

#Con nombre de categoría

$posts = get_posts(array(
    'category_name' => 'tecnología',
    'numberposts' => 5
));

#Método 3: Shortcodes para editores de contenido

Crear un shortcode permite a los editores de contenido insertar listas de posts por categoría en cualquier lugar.

function shortcode_posts_categoria($atts) {
    $atts = shortcode_atts(array(
        'categoria' => '',
        'posts' => 5,
        'orderby' => 'date',
        'order' => 'DESC'
    ), $atts);

    $args = array(
        'category_name' => $atts['categoria'],
        'posts_per_page' => intval($atts['posts']),
        'orderby' => $atts['orderby'],
        'order' => $atts['order']
    );

    $query = new WP_Query($args);

    ob_start();

    if ($query->have_posts()) {
        echo '<div class="lista-posts-categoria">';
        while ($query->have_posts()) {
            $query->the_post();
            ?>
            <article class="post-categoria">
                <h3><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h3>
                <p><?php the_excerpt(); ?></p>
            </article>
            <?php
        }
        echo '</div>';
    } else {
        echo '<p>No se encontraron posts en esta categoria.</p>';
    }

    wp_reset_postdata();

    return ob_get_clean();
}
add_shortcode('posts_categoria', 'shortcode_posts_categoria');

Uso: [posts_categoria categoría="noticias" posts="5"]

#Método 4: Modificar la consulta principal

Cuando quieras cambiar que posts aparecen en las páginas de archivo de categoría, usa la accion pre_get_posts.

function modificar_consultas_categoria($query) {
    // Solo modificar archivos de categoria en la consulta principal
    if ($query->is_category() && $query->is_main_query() && !is_admin()) {
        // Mostrar 20 posts por página en lugar del predeterminado
        $query->set('posts_per_page', 20);

        // Excluir posts de categoria específica en ciertas páginas de categoria
        $cat_actual = get_queried_object();
        if ($cat_actual->slug === 'destacados') {
            $query->set('category__not_in', array(10)); // Excluir categoria ID 10
        }
    }
}
add_action('pre_get_posts', 'modificar_consultas_categoria');

#Optimización de rendimiento

#1. Usar Transients para consultas costosas

function obtener_posts_categoria_con_cache($id_categoria, $cantidad = 5) {
    $clave_cache = 'cat_posts_' . $id_categoria . '_' . $cantidad;
    $posts = get_transient($clave_cache);

    if (false === $posts) {
        $args = array(
            'cat' => $id_categoria,
            'posts_per_page' => $cantidad
        );

        $query = new WP_Query($args);
        $posts = $query->posts;

        // Cache por 1 hora
        set_transient($clave_cache, $posts, HOUR_IN_SECONDS);
    }

    return $posts;
}

#2. Optimizar consultas de base de datos

// Solo recuperar los campos que necesitas
$args = array(
    'category_name' => 'noticias',
    'posts_per_page' => 10,
    'fields' => 'ids' // Solo obtener IDs de posts para mejor rendimiento
);

$query = new WP_Query($args);

#3. Usar Object Caching

Si tu sitio usa un object cache (Redis, Memcached), los resultados de WP_Query se cachean automáticamente, mejorando el rendimiento para consultas repetidas.

#Técnicas avanzadas

#Plantillas personalizadas para archivos de categoría

Crea un archivo de plantilla category-noticias.php para estilos específicos de categoría:

<?php
/* Template Name: Categoria - Noticias */
get_header(); ?>

<div class="archivo-categoria">
    <h1><?php single_cat_title(); ?></h1>

    <?php if (have_posts()) : ?>
        <div class="cuadricula-posts">
            <?php while (have_posts()) : the_post(); ?>
                <?php get_template_part('content', 'category'); ?>
            <?php endwhile; ?>
        </div>

        <?php the_posts_págination(); ?>
    <?php else : ?>
        <p>No se encontraron posts en esta categoria.</p>
    <?php endif; ?>
</div>

<?php get_footer(); ?>

#Carga AJAX para posts de categoría

Para una mejor experiencia de usuario, implementa carga AJAX:

jQuery(document).ready(function($) {
    $('.cargar-mas').on('click', function() {
        var boton = $(this);
        var categoria = boton.data('categoria');
        var página = boton.data('página');

        $.ajax({
            url: ajaxurl,
            type: 'POST',
            data: {
                action: 'cargar_posts_categoria',
                categoria: categoria,
                página: página
            },
            success: function(response) {
                $('.contenedor-posts').append(response);
                boton.data('página', página + 1);
            }
        });
    });
});

#Handler PHP para AJAX

function wppoland_cargar_posts_categoria_ajax() {
    $categoria = sanitize_text_field($_POST['categoria']);
    $página = intval($_POST['página']);

    $query = new WP_Query(array(
        'category_name' => $categoria,
        'posts_per_page' => 10,
        'paged' => $página,
    ));

    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            get_template_part('content', 'category');
        }
    }

    wp_reset_postdata();
    wp_die();
}
add_action('wp_ajax_cargar_posts_categoria', 'wppoland_cargar_posts_categoria_ajax');
add_action('wp_ajax_nopriv_cargar_posts_categoria', 'wppoland_cargar_posts_categoria_ajax');

#Errores comunes a evitar

  1. No restablecer post data: Siempre llama a wp_reset_postdata() despues de loops personalizados
  2. Consultar en cada carga de página: Usa cache para consultas costosas
  3. No verificar si existen posts: Siempre verifica have_posts() antes de iterar
  4. Modificar la consulta principal incorrectamente: Usa pre_get_posts en lugar de crear nuevas consultas en páginas de archivo
  5. Ignorar la páginación: Recuerda manejar la páginación para archivos de categoría grandes

#Conclusion

WordPress proporciona multiples formás de extraer posts de categorías, cada una adecuada para diferentes escenarios:

  • WP_Query: Mejor para visualizaciones complejas y personalizadas
  • get_posts(): Ideal para listas simples de posts
  • Shortcodes: Perfecto para flexibilidad del editor de contenido
  • pre_get_posts: Esencial para modificar páginas de archivo

Entender estos métodos y cuando usar cada uno te hara un desarrollador WordPress más efectivo. Recuerda siempre considerar el rendimiento, especialmente en sitios con grandes cantidades de contenido.

Para sitios en producción, implementa estrategias de cache y prueba tus consultas con herramientas como Query Monitor para asegurar un rendimiento optimo.

Necesitas ayuda con consultas avanzadas de WordPress? Nuestro equipo de desarrollo WordPress puede implementar soluciones optimizadas para tu proyecto. Contactanos.

Siguiente paso

Transforma el artículo en una implementación real

Este bloque refuerza el enlazado interno y lleva al lector al siguiente paso más útil dentro de la arquitectura del sitio.

¿Quieres implementar esto en tu sitio?

Si quieres transformar el artículo en mejoras concretas, rediseño o un plan de implementación, puedo cerrar el alcance y ejecutar.

Cluster relacionado

Explora otros servicios WordPress y base de conocimiento

Refuerza tu negocio con soporte técnico profesional en áreas clave del ecosistema WordPress.

FAQ del artículo

Preguntas Frecuentes

Respuestas prácticas para aplicar el tema en la ejecución real.

SEO-ready GEO-ready AEO-ready 4 Q&A
Necesito ser un desarrollador experimentado para usar esta guía?
Esta guía esta diseñada para desarrolladores WordPress intermedios. Se asume conocimiento básico de PHP y WordPress, pero todo el código se explica paso a paso.
Estas técnicas funcionaran con cualquier tema de WordPress?
La mayoria de las técnicas son independientes del tema y funcionan con temas estándar de WordPress. Sin embargo, algunos temas muy personalizados pueden requerir adaptacion adicional.
Es seguro implementar estos cambios en un sitio en vivo?
Siempre prueba los cambios en un entorno de staging primero. Aunque estas técnicas estan listas para producción, las pruebas previenen problemas potenciales en sitios en vivo.
Estos métodos funcionan con constructores de páginas como Elementor?
Si, la mayoria de los métodos funcionan junto a constructores de páginas. Algunos pueden requerir pasos de integración específicos que se indican en la sección de implementación.

¿Necesitas un FAQ adaptado a tu sector y mercado? Preparamos una versión alineada con tus objetivos de negocio.

Hablemos

Artículos Relacionados

Guía completa de WordPress Multisite para despliegues enterprise. Aprende patrones de arquitectura, escalabilidad a 1000+ sitios, hardening de seguridad, mapeo de dominios, gestión de usuarios y optimización de costes para redes de franquicias, universidades y organismos gubernamentales.
wordpress

WordPress Multisite para Enterprise: Arquitectura, Escalabilidad y Mejores Prácticas

Guía completa de WordPress Multisite para despliegues enterprise. Aprende patrones de arquitectura, escalabilidad a 1000+ sitios, hardening de seguridad, mapeo de dominios, gestión de usuarios y optimización de costes para redes de franquicias, universidades y organismos gubernamentales.

Migrar tu sitio WordPress puede parecer abrumador, pero con los conocimientos y la preparación adecuados, se convierte en un proceso manejable. Ya sea que estés cambiando de dominio, actualizando el hosting o reestructurando la arquitectura de tu sitio, esta guía completa cubre cada paso.
development

Guía Completa de Migración WordPress: Mueve Tu Sitio de Forma Segura en 2024

Migrar tu sitio WordPress puede parecer abrumador, pero con los conocimientos y la preparación adecuados, se convierte en un proceso manejable. Ya sea que estés cambiando de dominio, actualizando el hosting o reestructurando la arquitectura de tu sitio, esta guía completa cubre cada paso.

Fragmento rápido de PHP: Como mostrar solo el nombre de la categoría sin la etiqueta anchor (enlace)? Explicacion de get_the_category() y separadores.
wordpress

Como obtener el nombre de categoría sin enlace en WordPress (get_the_category)

Fragmento rápido de PHP: Como mostrar solo el nombre de la categoría sin la etiqueta anchor (enlace)? Explicacion de get_the_category() y separadores.