Creazione di una pagina di categoria personalizzata con paginazione
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(); ?>

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 parametrocategory_name
si aspetta lo slug della categoria, non il nome. Il parametrocategory_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(); ?>

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.

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

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);
