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_termsywp_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
- No restablecer post data: Siempre llama a
wp_reset_postdata()despues de loops personalizados - Consultar en cada carga de página: Usa cache para consultas costosas
- No verificar si existen posts: Siempre verifica
have_posts()antes de iterar - Modificar la consulta principal incorrectamente: Usa
pre_get_postsen lugar de crear nuevas consultas en páginas de archivo - 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.



