Creando una página de categoría personalizada con paginación

5 jul 2015, 17:18:14
Vistas: 32.5K
Votos: 2

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(); ?>
0
Todas las respuestas a la pregunta 2
3

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 propiedad post_name. El parámetro category_name espera el slug de la categoría, no el nombre. En mi opinión, el parámetro category_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(); ?>
5 jul 2015 18:56:04
Comentarios

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?

Puni Puni
5 jul 2015 19:16:11

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

Pieter Goosen Pieter Goosen
5 jul 2015 19:22:17

Disculpa, estuve ocupado el otro día y no pude volver a revisar la respuesta. De todos modos, muchas gracias por responder a mis preguntas y sí, tengo php 5.5.12 así que probé tu código y funciona.

Puni Puni
6 jul 2015 20:21:59
0

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
16 jun 2024 01:44:22