Paginazione della Pagina dei Tipi di Post Personalizzati

25 feb 2012, 17:36:03
Visualizzazioni: 24.8K
Voti: 2

Ho creato una pagina per i miei tipi di post personalizzati. Il codice può essere visualizzato su Snippi: http://snippi.com/s/e8852rx

Sto cercando di inserire paginate_links, ma per qualche motivo non viene visualizzato. Ecco il codice di paginate_links (questo codice funziona normalmente nei file archive.php):

<?php
global $wp_query;

$big = 999999999; // serve un numero intero improbabile

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
Commenti

Stai cercando di creare una pagina di archivio per il tuo custom post-type?

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

Stai definendo un nuovo oggetto WP_Query, ma fai riferimento all'oggetto principale WP_Query nella tua chiamata ai link di paginazione. Cambia $wp_query->max_num_pages in $loop->max_num_pages e vedi se questo risolve il problema.

t31os t31os
25 feb 2012 18:40:39

Non ha funzionato. :-(

AndrettiMilas AndrettiMilas
26 feb 2012 16:16:31

In format nella chiamata paginate_links, prova a cambiare paged in page

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

Neanche questo funziona.

AndrettiMilas AndrettiMilas
27 feb 2012 00:54:58

Quale parte non funziona? I link alle pagine vengono visualizzati ma non funzionano quando ci clicchi sopra, oppure la paginazione non viene mostrata del tutto?

Pippin Pippin
28 feb 2012 00:31:40

Non viene visualizzato affatto.

AndrettiMilas AndrettiMilas
28 feb 2012 00:35:14
Mostra i restanti 2 commenti
Tutte le risposte alla domanda 7
0
10

Il seguente codice funziona per me (ho rimosso tutta la formattazione / custom post meta).

Aggiungo che non è chiaro perché sia necessario utilizzare una pagina con un template personalizzato, invece di creare un template chiamato archive-portfolio.php che viene utilizzato per le pagine archivio dei custom post type (vedi gerarchia dei template)

<?php
/*
Template Name: Portfolio
*/
?>

<?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; // serve un numero improbabile
 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

Invece di utilizzare l'approccio "$loop->have_posts()", come ha sottolineato Stephen Harris, puoi anche provare a ciclare i post in questo modo:

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

Hai provato a utilizzare la pagina di archivio principale del tipo di post portfolio?

Se sposti la maggior parte del tuo codice in un file archive-portfolio.php, allora il loop dovrebbe essere configurato correttamente e l'impaginazione dovrebbe funzionare immediatamente, senza funzioni strane, hack o soluzioni approssimative, proprio come avviene negli archivi dei post.

Significa anche che non hai bisogno di utilizzare una query personalizzata, puoi semplicemente usare il main loop, rendendo il caricamento della pagina più veloce

1 mar 2012 14:55:30
Commenti

Assolutamente. E se il custom post type è configurato correttamente, la pagina archivio prenderà lo slug del post type senza bisogno di ulteriori complicazioni: ad esempio, www.miosito/portfolio

Dominic Dominic
2 mar 2012 02:42:17

Quando lo cambio in archive-portfolio.php, il codice originale di paginate_links non funziona. Mi sto perdendo qualcosa?

AndrettiMilas AndrettiMilas
2 mar 2012 04:54:49

La chiamata è dentro o fuori dal main loop?

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

Stai facendo riferimento alla query principale, quindi è probabile che stia cercando di mostrare solo i 'post', anziché il tuo custom post type.

Non sono sicuro del tuo formato esatto, ma rifarei la query in questo modo -

$args = Array( // Array di argomenti per query_posts()
    'numberposts' => -1,
    'posts_per_page' => get_option('posts_per_page'),
    'paged' => $paged,
    'post_type' => array('il-tuo-slug-post-type', 'un-altro-slug-post-type-se-vuoi')
);
query_posts($args);

Questo significa che il tuo codice diventerebbe -

<?php
global $wp_query; // Non ti serve questo se non sei in una funzione, quindi probabilmente può essere rimosso.

$args = Array( // Array di argomenti per query_posts()
    'numberposts' => -1,
    'posts_per_page' => get_option('posts_per_page'),
    'paged' => $paged,
    'post_type' => array('il-tuo-slug-post-type', 'un-altro-slug-post-type-se-vuoi')
);
query_posts($args);


$big = 999999999; // serve un numero improbabile

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

Questo è un problema con cui mi sono scontrato molte volte.

Ecco cosa ha funzionato per me in questa situazione (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();
                        //qualsiasi output tu richieda, come ad esempio:
                        the_excerpt();
                    endwhile;
                endif;
        ?>

Poi, per i controlli di impaginazione:

<?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

Sarebbe meglio creare una funzione all'interno del file functions.php che gestisca la paginazione e possa essere utilizzata in tutto il tuo tema, sia per i post standard che per i tipi di post personalizzati.

Con la seguente funzione, inserendo get_pagination() nel tuo tema, otterrai una navigazione ovunque ne abbia bisogno. Ho scritto un post sul blog a riguardo qui: http://deadlyhifi.com/2011/06/non-bloated-pagination-for-your-wordpress-functions-php-file/ (e il codice si basa originariamente su http://robertbasic.com/blog/wordpress-paging-navigation/)

/**
 * Una funzione per la paginazione
 * @param integer $range: L'intervallo dello slider, funziona meglio con numeri pari
 * Funzioni WP utilizzate:
 * get_pagenum_link($i) - crea il link, es. http://site.com/page/4
 * previous_posts_link(' ‚ '); - restituisce il link alla pagina precedente
 * next_posts_link(' é '); - restituisce il link alla pagina successiva
 * http://robertbasic.com/blog/wordpress-paging-navigation/
 * modificato da tdB ...
 */
function get_pagination($range = 4) {
global $paged, $wp_query;

// Quante pagine abbiamo?
if ( !$max_page ) {
    $max_page = $wp_query->max_num_pages;
}

// Abbiamo bisogno della paginazione solo se ci sono più di 1 pagina
if ( $max_page > 1 ) {
    if ( !$paged ) $paged = 1;

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

    // Pagina precedente
    previous_posts_link('Prec');

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

    // Abbiamo bisogno dell'effetto di scorrimento solo se ci sono più pagine dell'intervallo
    if ( $max_page > $range ) {
        // Quando siamo vicini all'inizio
        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>';
            }
        // Quando siamo vicini alla fine
        } 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>';
            }
        // Nel mezzo
        } 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>';
            }
        }
    // Meno pagine dell'intervallo, non serve l'effetto di scorrimento
    } 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>';
            }
    }

    // Sull'ultima pagina, non mostrare il link all'ultima pagina
    if ( $paged <= $max_page - ($range - 1) ) echo '<span class="page-numbers">&hellip;</span><a href="' . get_pagenum_link($max_page) . '">' . $max_page . '</a>';

    // Pagina successiva
    next_posts_link('Succ');

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

Grazie per il suggerimento, in precedenza avevo implementato qualcosa di simile... tuttavia, sto cercando di ottenere gli stessi risultati con la funzione integrata di paginazione.

AndrettiMilas AndrettiMilas
2 mar 2012 05:17:39
0

Non ho mai avuto problemi nell'utilizzare la paginazione su un archivio personalizzato. Quindi, invece di creare una pagina e poi scrivere la mia query personalizzata, basta copiare/incollare archive.php e rinominarlo per abbinarlo al tuo custom post, ad esempio archive-video.php.

Se vuoi davvero utilizzare un template di pagina personalizzato, aggiungi questo codice appena prima della tua query:

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

Maggiori informazioni: http://scribu.net/wordpress/wp-pagenavi/right-way-to-use-query_posts.html

2 mar 2012 02:33:48