Shortcode per Visualizzare Custom Post Types con Paginazione
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 »' . '</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">←</span> Post più vecchi' ) ) . '</div>'
. '<div class="nav-next">' . previous_posts_link( __( 'Post più recenti <span class="meta-nav">→</span>' ) ) . '</div>'
. '</div>' .
wp_reset_query();
}
add_shortcode( 'feed', 'section_feed_shortcode' );
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:
next_posts_link e previous_posts_link fanno entrambi echo, ti servono le loro equivalenti get_.
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.
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 »' . '</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">←</span> Post più vecchi' ) ) . '</div>' . '<div class="nav-next">' . get_previous_posts_link( __( 'Post più recenti <span class="meta-nav">→</span>' ) ) . '</div>' . '</div>' . wp_reset_query(); } add_shortcode( 'feed', 'section_feed_shortcode' );

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.

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

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!

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
