Shortcode pentru afișarea tipurilor personalizate de postări
Am o problemă cu un shortcode pe care îl creez.
Am 5-10 tipuri diferite de postări personalizate și, în loc să creez un șablon pentru fiecare tip de postare, aș prefera să folosesc o pagină normală și să import postările prin intermediul unui shortcode.
Pentru a explica mai detaliat, am o pagină numită Atracții și un tip de postare numit 'Atracție'. Pe pagină inserez shortcode-ul -> [feed type="attraction" limit="5"]
Acesta afișează toate postările din tipul de postare personalizat "attraction".
Problema pe care o am este că nu reușesc să fac paginarea să funcționeze corect. Am citit o mie de metode pentru paginarea tipurilor de postări personalizate, iar codul pe care îl folosesc în prezent pare să funcționeze conform multor persoane, dar nu reușesc să-l fac să funcționeze în interiorul shortcode-ului. Există vreun motiv pentru asta?
În prezent, pagina se afișează corect, cu cinci postări, dar nu afișează link-urile pentru postările următoare/precedente. Dacă introduc în URL + /page/2, a doua pagină se afișează corect cu următoarele 5 postări din secțiune. Deci se pare că paginarea funcționează, dar nu le pot accesa pentru că nu apar link-urile Next/Previous.
Avantajul acestei metode este că pot folosi o pagină normală, import postările și pot include conținut deasupra și dedesubtul shortcode-ului apelat.
Sper că totul este clar.
Iată codul meu pentru 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() . '">' . 'Vezi detalii »' . '</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ări mai vechi' ) ) . '</div>'
. '<div class="nav-next">' . previous_posts_link( __( 'Postări mai noi <span class="meta-nav">→</span>' ) ) . '</div>'
. '</div>' .
wp_reset_query();
}
add_shortcode( 'feed', 'section_feed_shortcode' );
ok, încă nu îmi place ideea unei a doua interogări, dar ai dreptate că este greu să adaugi conținut pe paginile de arhivă.
Am identificat 3 probleme:
next_posts_link și previous_posts_link afișează direct rezultatul, ai nevoie de echivalentele lor get_.
când te uiți la get_next_posts_link, descoperi că se bazează pe variabila globală $wp_query... care în cazul tău era întotdeauna pentru "pagina" reală și nu pentru interogarea shortcode-ului. trebuie să folosești query_posts și să suprascrii interogarea originală. sper că reset-ul interogării funcționează, dar nu sunt 100% sigur. va trebui să testezi asta.
nu sunt sigur că a fost o problemă, dar de obicei văd variabila $paged definită în acest fel, așa că am ales această variantă.
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() . '">' . 'Vezi detalii »' . '</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> Articole mai vechi' ) ) . '</div>' . '<div class="nav-next">' . get_previous_posts_link( __( 'Articole mai noi <span class="meta-nav">→</span>' ) ) . '</div>' . '</div>' . wp_reset_query(); } add_shortcode( 'feed', 'section_feed_shortcode' );

Mulțumesc mult @helgatheviking! Nu am încercat asta încă, dar voi reveni cu rezultatele când voi apuca să testez. Apreciez foarte mult că te-ai uitat la asta pentru mine.

desigur, dacă funcționează cu adevărat, te rog marchează-o ca răspuns. dacă nu, spune-mi ce se întâmplă exact.

Mulțumesc! A funcționat perfect. Mă întreb doar de ce, sunt cam începător când vine vorba de WordPress, dar mereu am crezut că wp_query este mai puternic și oferă mai multe funcționalități decât query_posts. Mulțumesc din nou!

din câte știu, sunt la fel. WP_query nou doar stochează un obiect 'nou' în loc să suprascrie interogarea originală a paginii, ceea ce este în general mai sigur pentru a nu afecta paginarea/buclele. dar deoarece link-urile următor și anterior depind de variabila globală $wp_query, trebuie să o modifici cu query_posts
