Crearea unei paginări simple pentru șabloanele tipurilor de postări personalizate
Am un tip de postare personalizat numit 'news' și întâmpin dificultăți în a face paginarea să funcționeze corect. Caut o soluție simplă pentru linkurile anterior și următor, fără a fi necesare numerele paginilor în mijloc.
În page-news.php acesta este codul meu:
<?php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array('post_type' => 'news', 'posts_per_page' => 2, 'paged' => $paged);
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post();
?>
// Buclă
<?php endwhile; wp_reset_postdata(); ?>
<div id="pagination" class="clearfix">
<?php posts_nav_link(); ?>
</div>
Codul de mai sus afișează 2 postări, dar nu afișează linkurile de paginare
Acesta este codul meu pentru tipul de postare personalizat:
function custom_post_news() {
register_post_type( 'news',
array('labels' => array(
'name' => __('Știri', 'post type general name'), /* Acesta este Titlul Grupului */
'singular_name' => __('Știre', 'post type singular name'), /* Acesta este tipul individual */
'add_new' => __('Adaugă Nou', 'custom post type item'), /* Elementul de meniu adaugă nou */
'add_new_item' => __('Adaugă Nou'), /* Titlul Adaugă Nou */
'edit' => __( 'Editează' ), /* Dialog Editare */
'edit_item' => __('Editează'), /* Titlu Editare */
'new_item' => __('Nou '), /* Titlu Nou */
'view_item' => __('Vizualizare'), /* Titlu Vizualizare */
'search_items' => __('Caută știri'), /* Titlu Căutare Tip Personalizat */
'not_found' => __('Nu s-a găsit nimic în Baza de Date.'), /* Acest mesaj se afișează dacă nu există înregistrări */
'not_found_in_trash' => __('Nu s-a găsit nimic în Coș'), /* Acest mesaj se afișează dacă nu există nimic în coș */
'parent_item_colon' => ''
), /* sfârșitul array-urilor */
'description' => __( 'Acesta este exemplul de tip de postare personalizat' ), /* Descriere Tip Personalizat */
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false,
'show_ui' => true,
'query_var' => true,
'menu_position' => 2, /* aceasta este ordinea în care doriți să apară în meniul din partea stângă */
'capability_type' => 'post',
'hierarchical' => false,
'rewrite' => array('slug' => 'news', 'with_front' => true ),
/* următorul este important, indică ce este activat în editorul de postări */
'supports' => array( 'title', 'editor', 'thumbnail')
)
);
}
// ÎNREGISTRARE TAXONOMII
add_action( 'init', 'custom_post_news');
register_taxonomy( 'custom_news',
array('news'), /* dacă schimbați numele din register_post_type( 'movies', atunci trebuie să schimbați și aici */
array('hierarchical' => true,
'labels' => array(
'name' => __( 'Categorii Știri' ), /* numele taxonomiei personalizate */
'singular_name' => __( 'Categorie Știri' ), /* numele singular al taxonomiei */
'search_items' => __( 'Caută Categorii Știri' ), /* titlu căutare pentru taxonomie */
'all_items' => __( 'Toate Categoriile de Știri' ), /* toate titlurile pentru taxonomii */
'parent_item' => __( 'Categorie Părinte Știri' ), /* titlu părinte pentru taxonomie */
'parent_item_colon' => __( 'Categorie Părinte Știri:' ), /* titlu taxonomie părinte */
'edit_item' => __( 'Editează Categoria de Știri' ), /* titlu editare taxonomie personalizată */
'update_item' => __( 'Actualizează Categoria de Știri' ), /* titlu actualizare pentru taxonomie */
'add_new_item' => __( 'Adaugă Știre Nouă' ), /* titlu adaugă nou pentru taxonomie */
'new_item_name' => __( 'Știre Nouă Personalizată' ) /* titlu nume pentru taxonomie */
),
'show_ui' => true,
'query_var' => true,
)
);
Aceasta este o temă personalizată (începută de la zero) așa că nu există nimic în functions.php referitor la paginare. Am căutat pe Internet răspunsuri, dar primesc soluții diferite și nimic nu pare să funcționeze.
De asemenea, nu am un archive-news.php deoarece nu sunt sigur dacă acesta trebuie implementat sau nu?

posts_nav_link()
nu va funcționa aici
Util pentru a oferi navigare "paginată" pe paginile de index, categorii și arhive.
Va trebui să folosești funcțiile mai generice next_posts_link()
și previous_posts_link()
. Asigură-te doar să setezi parametrul $max_pages
pentru next_posts_links()
, altfel nu va funcționa, și reține, dacă folosești această pagină ca pagină frontală statică, atunci ar trebui să folosești page
, nu paged
.
EDITARE 1
Folosește link-urile menționate mai sus după cum urmează
next_posts_link( 'Articole mai vechi', $loop->max_num_pages );
previous_posts_link( 'Articole mai noi' );
EDITARE 2
Cred că există o mică neînțelegere. Încearcă următoarele:
În argumentele tipului de postare personalizat unde îți înregistrezi postarea personalizată, adaugă următorul parametru,
'has_archive' => true
. Funcția ta ar trebui să arate astfelfunction custom_post_news() { register_post_type( 'news', array('labels' => array( 'name' => __('Știri', 'nume general tip postare'), /* Acesta este Titlul Grupului */ 'singular_name' => __('Știre', 'nume singular tip postare'), /* Acesta este tipul individual */ 'add_new' => __('Adaugă nou', 'element tip postare personalizat'), /* Elementul de meniu Adaugă nou */ 'add_new_item' => __('Adaugă nou'), /* Titlul Afișat la Adăugare Nouă */ 'edit' => __( 'Editează' ), /* Dialogul de Editare */ 'edit_item' => __('Editează'), /* Titlul Afișat la Editare */ 'new_item' => __('Nou '), /* Titlul Afișat Nou */ 'view_item' => __('Vezi'), /* Titlul Afișat la Vizualizare */ 'search_items' => __('Caută știri'), /* Titlul Căutării pentru Tipul Personalizat */ 'not_found' => __('Nimic găsit în Baza de Date.'), /* Acesta se afișează dacă nu există încă intrări */ 'not_found_in_trash' => __('Nimic găsit în Coșul de Gunoi'), /* Acesta se afișează dacă nu există nimic în coșul de gunoi */ 'parent_item_colon' => '' ), /* sfârșitul array-urilor */ 'description' => __( 'Acesta este un exemplu de tip de postare personalizat' ), /* Descrierea Tipului Personalizat */ 'public' => true, 'publicly_queryable' => true, 'exclude_from_search' => false, 'show_ui' => true, 'query_var' => true, 'menu_position' => 2, /* ordinea în care apare în meniul din partea stângă */ 'capability_type' => 'post', 'hierarchical' => false, 'rewrite' => array('slug' => 'news', 'with_front' => true ), 'has_archive' => true, /* următorul este important, indică ce este activat în editorul de postări */ 'supports' => array( 'title', 'editor', 'thumbnail') ) ); }
Resetează permalink-urile după această adăugare și apoi vizitează pagina principală
Creează un fișier
archive-news.php
. Ar trebui să arate astfel<?php while ( have_posts() ) : the_post(); ?> // Buclă <?php endwhile; ?> <div id="pagination" class="clearfix"> <?php posts_nav_link(); ?> </div>
Apoi, în functions.php, folosește
pre_get_posts
pentru a modifica interogarea principală după cum este necesar.add_action( 'pre_get_posts', function ( $q ) { if( !is_admin() && $q->is_main_query() && $q->is_post_type_archive( 'news' ) ) { $q->set( 'posts_per_page', 2 ); } });
Șterge pagina pe care ai creat-o în panoul de administrare. Totul ar trebui să funcționeze perfect acum

Scuze, am văzut că tocmai ai comentat în timp ce eu am rezolvat problema, așa că le-am șters. Oricum, mulțumesc pentru actualizări. Funcționează în sensul că afișează linkul 'Articole mai vechi', dar acesta trimite înapoi către pagina index.php

Asta are legătură cu regulile tale de rescriere. Ai reîncărcat permalinkurile?

Acel cod (al doilea bloc de cod din întrebare) este deja în functions.php - am făcut un nou flush salvând din nou setările de permalinkuri dar încă nu funcționează.

Sigur, am șters acum acel comentariu. Am separat endwhile și l-am plasat după buclă, apoi am adăugat link-urile next și prev post_links, apoi l-am închis cu wp_reset_postdata(); am golit cache-ul și tot se încarcă index.php

Ești legendar! A funcționat. Iată ce am făcut (ca să ajut pe alții). Am folosit codul tău next/prev. Am adăugat has_archive => true la register_post_type și apoi am mutat tot codul din page-news.php în archive-news.php și a funcționat. Apreciez ajutorul tău.
