Paginare pentru Pagina Custom Post Type

25 feb. 2012, 17:36:03
Vizualizări: 24.8K
Voturi: 2

Am creat o pagină pentru tipurile mele de postări personalizate (custom post types). Codul poate fi văzut pe Snippi: http://snippi.com/s/e8852rx

Încerc să inserez paginate_links, dar din diverse motive nu apare deloc. Iată codul pentru paginate_links (acest cod funcționează pe fișierele normale archive.php):

<?php
global $wp_query;

$big = 999999999; // avem nevoie de un număr întreg improbabil

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $wp_query->max_num_pages
) );
?>
7
Comentarii

Încercați să creați o pagină de arhivă pentru tipul vostru personalizat de postare?

Stephen Harris Stephen Harris
25 feb. 2012 17:42:16

Definiți un nou obiect WP_Query, dar faceți referire la obiectul principal WP_Query în apelul pentru linkurile de paginare. Schimbați $wp_query->max_num_pages în $loop->max_num_pages și vedeți dacă asta ajută.

t31os t31os
25 feb. 2012 18:40:39

Nu a funcționat. :-(

AndrettiMilas AndrettiMilas
26 feb. 2012 16:16:31

În format din apelul paginate_links, încearcă să schimbi paged în page

Matthew Boynes Matthew Boynes
26 feb. 2012 21:08:40

Nici asta nu funcționează.

AndrettiMilas AndrettiMilas
27 feb. 2012 00:54:58

Care parte nu funcționează? Linkurile de pagină apar, dar nu funcționează când dai click pe ele sau paginarea nu apare deloc?

Pippin Pippin
28 feb. 2012 00:31:40

Nu apare deloc.

AndrettiMilas AndrettiMilas
28 feb. 2012 00:35:14
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 7
0
10

Următorul cod funcționează pentru mine (am eliminat toată formatarea și meta-datelor personalizate pentru postări).

Aș mai adăuga că nu este clar de ce ai nevoie să folosești o pagină cu un șablon personalizat, în loc să creezi un șablon numit archive-portfolio.php care este folosit pentru arhivele tipurilor de postări personalizate (vezi ierarhia șabloanelor)

<?php
/*
Șablon: Portofoliu
*/
?>

<?php get_header(); ?>
<div id="container">
<div id="portfolio_content">
<div id="portfolio_wrap">

    <?php $loop = new WP_Query(array('post_type' => 'portfolio', 'posts_per_page' => get_option('to_count_portfolio'), 'paged' => get_query_var('paged') ? get_query_var('paged') : 1 )
); ?>
    <?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
        <span class="title"><?php the_title(); ?></span></br>
        <?php endwhile; ?>  

<?php

$big = 999999999; // un număr improbabil de mare
 echo paginate_links( array(
    'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $loop->max_num_pages
) );
?>
</div>
</div>
</div>
</div>

<?php get_footer(); ?>
29 feb. 2012 17:23:14
0

În loc să folosești abordarea "$loop->have_posts()", așa cum a menționat Stephen Harris, poți încerca să parcurgi postările astfel:

<?php foreach ($loop->get_posts() as $post) { ?>
     <span class="title"><?php echo $post->post_title; ?></span></br>
<?php } ?>
29 dec. 2012 23:16:46
3

Ați încercat să utilizați pagina de arhivă principală pentru tipul de postare portofoliu?

Dacă mutați cea mai mare parte a codului într-un fișier archive-portfolio.php, atunci bucla ar trebui să fie configurată corect și paginarea ar trebui să funcționeze fără modificări suplimentare, fără funcții complicate, hack-uri sau soluții improvizate, exact cum funcționează pe arhivele de articole obișnuite.

De asemenea, aceasta înseamnă că nu aveți nevoie să utilizați o interogare personalizată, ci puteți folosi bucla principală, ceea ce va face ca pagina să se încarce mai rapid.

1 mar. 2012 14:55:30
Comentarii

Absolut. Și dacă tipul de postare personalizat este configurat corect, pagina de arhivă va prelua slug-ul tipului de postare fără eforturi suplimentare: de ex., www.mysite/portfolio

Dominic Dominic
2 mar. 2012 02:42:17

Când îl schimb în archive-portfolio.php, codul original paginate_links nu funcționează. Lipsesc ceva?

AndrettiMilas AndrettiMilas
2 mar. 2012 04:54:49

apelul este în interiorul sau în afara buclei principale?

Tom J Nowell Tom J Nowell
2 mar. 2012 12:08:54
0

Te referi la interogarea principală, deci este probabil că încearcă să afișeze doar 'postări' (posts), și nu tipul tău personalizat de postare.

Nu sunt sigur care este formatul tău exact, dar aș reface interogarea astfel -

$args = Array( // Array de argumente pentru query_posts()
    'numberposts' => -1,
    'posts_per_page' => get_option('posts_per_page'),
    'paged' => $paged,
    'post_type' => array('slug-tip-tau-post', 'alt-tip-post-daca-doresti')
);
query_posts($args);

Asta înseamnă că codul tău va deveni -

<?php
global $wp_query; // Nu ai nevoie de asta dacă nu ești într-o funcție, deci poate fi eliminat.

$args = Array( // Array de argumente pentru query_posts()
    'numberposts' => -1,
    'posts_per_page' => get_option('posts_per_page'),
    'paged' => $paged,
    'post_type' => array('slug-tip-tau-post', 'alt-tip-post-daca-doresti')
);
query_posts($args);


$big = 999999999; // avem nevoie de un număr improbabil

echo paginate_links( array(
    'base' => str_replace( $big, '%#%', get_pagenum_link( $big ) ),
    'format' => '?paged=%#%',
    'current' => max( 1, get_query_var('paged') ),
    'total' => $wp_query->max_num_pages )
);
?>
29 feb. 2012 13:14:09
0

Acesta este o problemă cu care m-am confruntat de multe ori.

Iată ce a funcționat pentru mine în această situație (WP 3.1.1):

<?php   
                $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
                $args = array( 'post_type' => 'custom_post_type', 'posts_per_page' => 5, 'paged' => $paged);
                $loop = new WP_Query( $args );
                if($loop->have_posts()):
                    while ( $loop->have_posts() ) : $loop->the_post();
                        //orice ieșire ai nevoie, cum ar fi, de exemplu:
                        the_excerpt();
                    endwhile;
                endif;
        ?>

Apoi, pentru controalele de paginare:

<?php 
    echo custom_paginate_links( 
                            array(
                                'format' => '?paged=%#%',
                                'current' => max( 1, get_query_var( 'paged' ) ),
                                'total' => $loop->max_num_pages
                                ) );
?>
29 feb. 2012 18:28:12
1

Ar fi mai bine să creezi o funcție în fișierul tău functions.php care să gestioneze paginarea și care să poată fi folosită în întreaga temă, atât pentru postări standard, cât și pentru tipuri personalizate de postări.

Cu următoarea funcție, adăugând get_pagination() în tema ta, vei obține navigare oriunde ai nevoie. Am scris un articol pe blog despre asta aici: http://deadlyhifi.com/2011/06/non-bloated-pagination-for-your-wordpress-functions-php-file/ (iar codul este bazat inițial pe http://robertbasic.com/blog/wordpress-paging-navigation/)

/**
 * O funcție de paginare
 * @param integer $range: Intervalul slider-ului, funcționează cel mai bine cu numere pare
 * Funcții WordPress folosite:
 * get_pagenum_link($i) - creează link-ul, de ex. http://site.com/page/4
 * previous_posts_link(' ‚ '); - returnează link-ul paginii Anterioare
 * next_posts_link(' é '); - returnează link-ul paginii Următoare
 * http://robertbasic.com/blog/wordpress-paging-navigation/
 * adaptat de tdB ...
 */
function get_pagination($range = 4) {
global $paged, $wp_query;

// Câte pagini avem?
if ( !$max_page ) {
    $max_page = $wp_query->max_num_pages;
}

// Avem nevoie de paginare doar dacă există mai mult de o pagină
if ( $max_page > 1 ) {
    if ( !$paged ) $paged = 1;

    echo '<div class="postpagination">';

    // Pagina anterioară
    previous_posts_link('Prev');

    if ( $paged >= $range ) echo '<a href="' . get_pagenum_link(1) . '">1</a>';
    if ( $paged >= ($range + 1) ) echo '<span class="page-numbers">&hellip;</span>';

    // Avem nevoie de efectul de alunecare doar dacă există mai multe pagini decât intervalul
    if ( $max_page > $range ) {
        // Când suntem mai aproape de început
        if ( $paged < $range ) {
            for ( $i = 1; $i <= ($range + 1); $i++ ) {
                    echo ( $i != $paged ) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
            }
        // Când suntem mai aproape de sfârșit
        } elseif ( $paged >= ($max_page - ceil(($range/2))) ) {
            for ( $i = $max_page - $range; $i <= $max_page; $i++ ) {
                echo ( $i != $paged ) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
            }
        // Undeva la mijloc
        } elseif ( $paged >= $range && $paged < ($max_page - ceil(($range/2))) ) {
            for ( $i = ($paged - ceil($range/2)); $i <= ($paged + ceil(($range/2))); $i++ ) {
                echo ($i != $paged) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
            }
        }
    // Mai puține pagini decât intervalul, nu este nevoie de efect de alunecare
    } else {
        for ( $i = 1; $i <= $max_page; $i++ ) {
                echo ($i != $paged) ? '<a href="' . get_pagenum_link($i) .'">'.$i.'</a>' : '<span class="this-page">'.$i.'</span>';
            }
    }

    // La ultima pagină, nu afișa link-ul Ultimei pagini
    if ( $paged <= $max_page - ($range - 1) ) echo '<span class="page-numbers">&hellip;</span><a href="' . get_pagenum_link($max_page) . '">' . $max_page . '</a>';

    // Pagina următoare
    next_posts_link('Next');

    echo '</div><!-- postpagination -->';
}
}
1 mar. 2012 10:00:45
Comentarii

Mulțumesc pentru sfat, anterior aveam ceva similar implementat... totuși, încerc să obțin aceleași rezultate folosind funcția încorporată de paginare.

AndrettiMilas AndrettiMilas
2 mar. 2012 05:17:39
0

Nu am avut niciodată probleme cu utilizarea paginării pe un arhivă personalizată. Așadar, în loc să creez o pagină și apoi să scriu propria interogare pe ea, pur și simplu copiez/lipește archive.php și îi redenumesc pentru a se potrivi cu postarea personalizată, de exemplu archive-videos.php.

Dacă chiar dorești să utilizezi un șablon personalizat pentru pagină, adaugă acest cod înaintea interogării tale:

query_posts( array( 'post_type' => 'videos', 'paged' => get_query_var('page') ) )

Mai multe informații: http://scribu.net/wordpress/wp-pagenavi/right-way-to-use-query_posts.html

2 mar. 2012 02:33:48