Creando una página de categoría personalizada con paginación
La semana pasada estuve tratando de resolver cómo crear una página de categoría personalizada con paginación. Lo he intentado de muchas formas pero no logro que la paginación funcione correctamente. Si alguno de ustedes puede ayudar.
Lo que realmente quiero hacer en mi tema de WordPress es crear una plantilla personalizada que muestre todas las categorías que tienen el mismo nombre que la página.
EJEMPLO
He creado una página llamada 'php' con la plantilla establecida en la plantilla que estaba tratando de construir. Y cuando hago clic en esa página, quiero mostrar todas las entradas que pertenecen a la categoría 'php'.
Aquí está el ejemplo de código...
<?php
/**
* Nombre de la Plantilla: Plantilla de Categoría
*
*/
get_header(); ?>
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<?php
$category = get_post();
$category = $category->post_title;
$query = new WP_Query( array(
'category_name' => $category,
'order' => 'asc',
'post_type' => 'post',
'post_status' => 'publish',
));
?>
<?php
if ($query->have_posts()) {
while ($query->have_posts()) : $query->the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<header class="entry-header">
<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
</header><!-- .entry-header -->
<div class="entry-content">
<?php
the_content();
?>
</div><!-- .entry-content -->
</article><!-- #post-## --><hr>
<?php endwhile; ?>
<?php the_paging_nav(); ?>
<?php
}
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php get_footer(); ?>

Tienes algunos problemas aquí
El siguiente fragmento de código es incorrecto e innecesario
$category = get_post(); $category = $category->post_title;
El objeto de la página actual se guarda en
get_queried_object()
, así que puedes usar esta función para obtener el título de tu publicación. Además,post_title
no es la propiedad correcta para usar aquí. Debes mirar el slug de la publicación que se guarda en la propiedadpost_name
. El parámetrocategory_name
espera el slug de la categoría, no el nombre. En mi opinión, el parámetrocategory_name
está mal nombrado. Es como ponerle a una niña un nombre de niño y luego esperar que los demás sepan que la persona en cuestión es una niña basándose en el nombre.Un poco fuera de tema aquí, pero no mezcles tu sintaxis. Elige una sintaxis y mantente con ella. Como las llaves son las más fáciles de depurar y son mayormente compatibles con los editores de código, úsalas. Además, indenta correctamente tu código, es más fácil de leer y depurar.
Necesitas configurar la paginación antes de poder usarla. Para eso necesitas usar el parámetro
paged
. No voy a entrar en eso, ya que esto se ha tratado muchas veces en este sitio.the_paging_nav()
no es una función del núcleo, así que necesitarías contactar al autor del código para averiguar cómo se debe usar el código con consultas personalizadas.
Algo como lo siguiente debería funcionar
<?php
/**
* Template Name: Plantilla de Categoría
*
*/
get_header(); ?>
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<?php
$current_page = get_queried_object();
$category = $current_page->post_name;
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$query = new WP_Query(
array(
'paged' => $paged,
'category_name' => $category,
'order' => 'asc',
'post_type' => 'post',
'post_status' => 'publish',
)
);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<header class="entry-header">
<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
</header><!-- .entry-header -->
<div class="entry-content">
<?php the_content(); ?>
</div><!-- .entry-content -->
</article><!-- #post-## --><hr>
<?php
}
// next_posts_link() uso con max_num_pages
next_posts_link( 'Entradas antiguas', $query->max_num_pages );
previous_posts_link( 'Entradas recientes' );
wp_reset_postdata();
}
?>
</main><!-- #main -->
</div><!-- #primary -->
<?php get_footer(); ?>

Gracias por la respuesta y el consejo. Una pregunta más, ¿puedo usar la función twentyfourteen_paging_nav() en esto porque quiero una navegación de páginas numerada?

No, no puedes, solo soporta la consulta principal (pero puedes modificarla para que funcione con consultas personalizadas). Hace un tiempo escribí una función extensa de paginación para esto. Échale un vistazo aquí. Solo recuerda, no funcionará en versiones de PHP anteriores a la 5.4. Necesitarás al menos PHP 5.4

Cuando probé esta solución, todavía obtengo "Página no encontrada". Sé que esto es muy antiguo, pero es lo único que me ha ayudado a avanzar más que cualquier otra cosa. Estoy intentando recorrer páginas bajo mis categorías arizona-beer y arizona-wine:
$current_page = get_queried_object();
$category = $current_page->post_name;
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$args = array(
'posts_per_page' => 2, // Número de publicaciones por página
'post_type' => array( 'arizona_wine', 'arizona_beer', 'post' ), // Tipos de publicaciones a consultar
'paged' => $paged, // Página actual
'category_name' => $category, // Nombre de la categoría
);
$category_posts = new WP_Query($args); // Nueva consulta WP_Query con los argumentos
