Shortcode per Visualizzare Custom Post Types con Paginazione

18 lug 2012, 17:06:16
Visualizzazioni: 17.4K
Voti: 3

Ho un problema con uno shortcode che sto creando.

Ho 5-10 diversi custom post types e invece di creare un template per ogni singolo post type, preferirei usare una pagina normale e importare i post tramite uno shortcode.

Per spiegare meglio, ho una pagina chiamata Attrazioni e un post type chiamato 'Attrazione'. Nella pagina inserisco lo shortcode -> [feed type="attraction" limit="5"]

Questo mostra tutti i post del custom post type "attrazione".

Il problema che ho è far funzionare correttamente la paginazione. Ho letto mille modi per paginare custom post types e il codice che sto usando attualmente sembra funzionare secondo molti, ma non riesco a farlo funzionare dentro lo shortcode. C'è un motivo per questo?

Attualmente la pagina viene visualizzata correttamente con cinque post, ma non mostra i link next/previous. Se digito nell'url + /page/2 la seconda pagina viene visualizzata correttamente con i successivi 5 post nella sezione. Quindi sembra che la paginazione funzioni, ma non posso accedervi perché non appare alcun link Next/Previous.

Il vantaggio di fare così è che posso usare una pagina normale, importare i post e posso includere contenuti sopra e sotto lo shortcode chiamato.

Spero sia tutto chiaro.

Ecco il mio codice dello shortcode -->

    function section_feed_shortcode( $atts ) {
    extract( shortcode_atts( array( 'limit' => -1, 'type' => 'post'), $atts ) );

    global $paged;
    $q = new WP_Query(  array ( 
        'posts_per_page' => $limit, 
        'post_type' => $type, 
        order => 'ASC', 
        orderby =>'menu_order', 
        'paged' => $paged ) );

    $list = ' ';

    while ( $q->have_posts() ) { $q->the_post();

        $list .= '<article class="listing-view clearfix">' 
        . '<div class="listing-content">' 
        . '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>' 
        .'<p>' . get_the_excerpt() . '</p>'
        . '<a href="' . get_permalink() . '">' . 'Visualizza &raquo;' . '</a>'
        . '</div>'
        . '<a class="listing-thumb" href="' . get_permalink() . '">' . get_the_post_thumbnail($page->ID, 'listing-thumb')  . '<span></span></a>'
        . '</article>';
    }

    return 
    '<div class="listings clearfix">' 
    . $list 
    . '<div class="nav-previous">' . next_posts_link( __( '<span class="meta-nav">&larr;</span> Post più vecchi' ) ) . '</div>'
    . '<div class="nav-next">' . previous_posts_link( __( 'Post più recenti <span class="meta-nav">&rarr;</span>' ) ) . '</div>'
    . '</div>' .
    wp_reset_query();

}
add_shortcode( 'feed', 'section_feed_shortcode' );
2
Commenti

Qual è il vantaggio di farlo in questo modo? Sembra un sacco di sforzo quando WordPress già gestisce gli archivi per i custom post type con una paginazione corretta. Inoltre, è inefficiente eseguire una seconda query quando non è necessario. Non devi nemmeno creare un template speciale perché WordPress ricadrà su archives.php o addirittura index.php. Se hai solo bisogno di aggiungerli al menu c'è http://wordpress.org/extend/plugins/cpt-archives-in-nav-menus/

helgatheviking helgatheviking
18 lug 2012 17:27:41

Il vantaggio è che posso posizionarli dove voglio, e se posso inserirli in una pagina normale di WordPress posso aggiungere contenuto sopra e sotto lo shortcode. Ogni sezione ha contenuto sopra e sotto gli elenchi, se creo un template, tutto questo contenuto dovrà essere hardcodato nel template, rendendo difficile aggiornarlo rapidamente. Ho bisogno che il contenuto su queste pagine di sezione sia facilmente aggiornabile.

Aaron Aaron
18 lug 2012 17:36:20
Tutte le risposte alla domanda 1
4

ok, ancora non mi piace l'idea di una seconda query, ma hai ragione è difficile aggiungere contenuto alle pagine degli archivi.

ho trovato 3 problemi:

  1. next_posts_link e previous_posts_link fanno entrambi echo, ti servono le loro equivalenti get_.

  2. quando cerchi get_next_posts_link, scopri che si basa sulla global $wp_query... che nel tuo caso era sempre per la "pagina" effettiva e non per la query dello shortcode. devi effettivamente fare query_posts e poi annullare la query originale. spero che il reset della query funzioni, ma non ne sono sicuro al 100%. dovrai testarlo.

  3. non sono sicuro che fosse un problema, ma di solito vedo la variabile $paged definita in questo modo quindi ho optato per questa.

    function section_feed_shortcode( $atts ) {
    extract( shortcode_atts( array( 'limit' => -1, 'type' => 'post'), $atts ) );
    
    $paged = get_query_var('paged') ? get_query_var('paged') : 1;  
    
    query_posts(  array ( 
        'posts_per_page' => $limit, 
        'post_type' => $type, 
        'order' => 'ASC', 
        'orderby' =>'menu_order', 
        'paged' => $paged ) );
    
    $list = ' ';   
    
    while ( have_posts() ) { the_post();
    
        $list .= '<article class="listing-view clearfix">' 
        . '<div class="listing-content">' 
        . '<h3><a href="' . get_permalink() . '">' . get_the_title() . '</a></h3>' 
        .'<p>' . get_the_excerpt() . '</p>'
        . '<a href="' . get_permalink() . '">' . 'Visualizza &raquo;' . '</a>'
        . '</div>'
        . '<a class="listing-thumb" href="' . get_permalink() . '">' . get_the_post_thumbnail($page->ID, 'listing-thumb')  . '<span></span></a>'
        . '</article>';
    }
    
    return 
    '<div class="listings clearfix">' 
    . $list 
    . '<div class="nav-previous">' . get_next_posts_link( __( '<span class="meta-nav">&larr;</span> Post più vecchi' ) ) . '</div>'
    . '<div class="nav-next">' . get_previous_posts_link( __( 'Post più recenti <span class="meta-nav">&rarr;</span>' ) ) . '</div>'
    . '</div>' .
    wp_reset_query();
    
    }
    add_shortcode( 'feed', 'section_feed_shortcode' );
    
18 lug 2012 20:40:26
Commenti

Grazie mille @helgatheviking! Non ho ancora provato questa soluzione, ma ti farò sapere come va quando avrò modo di testarla. Ti ringrazio davvero per averci dato un'occhiata.

Aaron Aaron
19 lug 2012 14:54:03

figurati, se effettivamente funziona, per favore segnala la risposta come soluzione. altrimenti fammi sapere cosa succede.

helgatheviking helgatheviking
19 lug 2012 17:12:52

Grazie! Ha funzionato perfettamente. Mi chiedevo solo il perché, sono un po' un principiante con WordPress, ma pensavo sempre che usare wp_query fosse più robusto e avesse più funzionalità rispetto a query_posts. Grazie ancora!

Aaron Aaron
20 lug 2012 17:20:23

per quanto ne so, sono la stessa cosa. new WP_query memorizza un oggetto 'nuovo' invece di sovrascrivere la query originale della pagina, il che è generalmente più sicuro per non compromettere la paginazione/i loop. ma dato che i link next e previous dipendono dalla variabile globale $wp_query, devi modificarla con query_posts

helgatheviking helgatheviking
20 lug 2012 19:14:59