Creazione di una pagina di categoria personalizzata con paginazione

5 lug 2015, 17:18:14
Visualizzazioni: 32.5K
Voti: 2

Nell'ultima settimana ho cercato di capire come creare una pagina di categoria personalizzata con paginazione. Ho provato in molti modi ma non riesco a far funzionare correttamente la paginazione. Se qualcuno può aiutarmi.

Quello che voglio fare nel mio tema WordPress è creare un template personalizzato che mostri tutti i post della categoria che ha lo stesso nome della pagina.

ESEMPIO

Ho creato una pagina chiamata 'php' con template impostato sul template che sto cercando di costruire. E quando clicco su quella pagina vorrei mostrare tutti i post che appartengono alla categoria 'php'.

Ecco il codice di esempio...

<?php
/**
 * Nome Template: Template Categoria
 *
 */

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
Tutte le risposte alla domanda 2
3

Ci sono alcuni problemi qui

  • Il seguente pezzo di codice è sbagliato e non necessario

    $category = get_post();
    $category = $category->post_title;
    

    L'oggetto della pagina corrente è salvato in get_queried_object(), quindi puoi usare questa funzione per ottenere il titolo del post. Inoltre, post_title non è la proprietà corretta da usare qui. Dovresti guardare allo slug del post che è salvato nella proprietà post_name. Il parametro category_name si aspetta lo slug della categoria, non il nome. Il parametro category_name, secondo me, è chiamato in modo sbagliato. È come dare a una ragazza un nome da maschio e poi aspettarsi che gli altri capiscano che la persona in questione è una ragazza basandosi sul nome.

  • Un po' fuori tema qui, ma non mischiare la sintassi. Scegli una sintassi e attieniti ad essa. Poiché le parentesi graffe sono le più facili da debuggare e sono supportate dalla maggior parte degli editor di codice, usale. Inoltre, indentare correttamente il codice lo rende più facile da leggere e da debuggare.

  • Devi effettivamente impostare la paginazione prima di poterla usare. Per farlo, devi usare il parametro paged. Non entrerò nei dettagli, poiché questo argomento è stato trattato molte volte su questo sito.

  • the_paging_nav() non è una funzione core, quindi dovresti contattare l'autore del codice per scoprire come dovrebbe essere usata con query personalizzate.

Qualcosa come il seguente dovrebbe funzionare

<?php
/**
 * Template Name: Template Categoria
 *
 */

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() usage with max_num_pages
            next_posts_link( 'Articoli più vecchi', $query->max_num_pages );
            previous_posts_link( 'Articoli più recenti' );

            wp_reset_postdata();
        }
        ?>

    </main><!-- #main -->
</div><!-- #primary -->

<?php get_footer(); ?>
5 lug 2015 18:56:04
Commenti

Grazie per la risposta e il consiglio. Un'altra domanda: posso usare la funzione twentyfourteen_paging_nav() in questo caso perché vorrei una navigazione tra pagine numerata.

Puni Puni
5 lug 2015 19:16:11

No, non puoi, supporta solo la query principale (ma puoi modificarla per farla funzionare con query personalizzate). Ho scritto una funzione di impaginazione estesa per questo qualche tempo fa. Dalle un'occhiata qui. Ricorda solo che non funzionerà con versioni di PHP precedenti alla 5.4. Avrai bisogno almeno di PHP 5.4

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

Scusa, sono stato impegnato l'altro giorno e non sono potuto tornare a controllare la risposta. Comunque grazie mille per aver risposto alle mie domande e sì, ho php 5.5.12 quindi ho provato il tuo codice e funziona.

Puni Puni
6 lug 2015 20:21:59
0

Quando ho provato questa soluzione, ottengo ancora "Pagina non trovata". So che è molto vecchia, ma è l'unica che mi ha aiutato ad andare avanti più di qualsiasi altra cosa. Sto cercando di ciclare le pagine sotto le mie categorie arizona-beer e 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,
    'post_type'         => array( 'arizona_wine', 'arizona_beer', 'post' ),
    'paged'             => $paged, 
    'category_name'     => $category,
);
$category_posts = new WP_Query($args);
16 giu 2024 01:44:22