Crearea unei paginări simple pentru șabloanele tipurilor de postări personalizate

1 feb. 2015, 15:23:55
Vizualizări: 52.8K
Voturi: 0

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?

0
Toate răspunsurile la întrebare 1
7

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 astfel

    function 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

1 feb. 2015 16:57:09
Comentarii

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

Jack Barham Jack Barham
1 feb. 2015 20:51:30

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

Pieter Goosen Pieter Goosen
1 feb. 2015 20:52:51

Ups, am crezut că se va formata corect

Jack Barham Jack Barham
1 feb. 2015 20:55:51

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ă.

Jack Barham Jack Barham
1 feb. 2015 21:13:09

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

Jack Barham Jack Barham
1 feb. 2015 21:28:01

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.

Jack Barham Jack Barham
1 feb. 2015 21:53:27

Verifică doar actualizarea mea, tocmai am făcut același lucru într-o editare cu metoda corectă de a o face. Acum merg la culcare. Sper că actualizarea mea te ajută și pe tine. Distracție plăcută :-)

Pieter Goosen Pieter Goosen
1 feb. 2015 21:54:13
Arată celelalte 2 comentarii