Shortcode pentru afișarea tipurilor personalizate de postări

18 iul. 2012, 17:06:16
Vizualizări: 17.4K
Voturi: 3

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 &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ări mai vechi' ) ) . '</div>'
    . '<div class="nav-next">' . previous_posts_link( __( 'Postări mai noi <span class="meta-nav">&rarr;</span>' ) ) . '</div>'
    . '</div>' .
    wp_reset_query();

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

Care este avantajul de a face lucrurile în acest fel? Pare mult efort când WordPress oferă deja arhive pentru tipurile personalizate de postări cu paginare corectă. În plus, este ineficient să faci o a doua interogare atunci când nu este necesar. Nu este nevoie nici măcar să creezi un șablon special, deoarece WordPress va recurge automat la archives.php sau chiar la index.php. Dacă ai nevoie doar să le adaugi în meniu, există http://wordpress.org/extend/plugins/cpt-archives-in-nav-menus/

helgatheviking helgatheviking
18 iul. 2012 17:27:41

Avantajul este că le pot poziționa oriunde doresc și dacă le pot plasa pe o pagină normală în WordPress, pot adăuga conținut deasupra și dedesubtul shortcode-ului. Fiecare secțiune are conținut deasupra și dedesubtul listărilor. Dacă aș crea un șablon, tot acest conținut ar trebui să fie hardcodat în șablon, ceea ce ar face actualizarea dificilă. Am nevoie ca conținutul acestor pagini de secțiuni să poată fi actualizat ușor.

Aaron Aaron
18 iul. 2012 17:36:20
Toate răspunsurile la întrebare 1
4

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:

  1. next_posts_link și previous_posts_link afișează direct rezultatul, ai nevoie de echivalentele lor get_.

  2. 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.

  3. 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 &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> Articole mai vechi' ) ) . '</div>'
    . '<div class="nav-next">' . get_previous_posts_link( __( 'Articole mai noi <span class="meta-nav">&rarr;</span>' ) ) . '</div>'
    . '</div>' .
    wp_reset_query();
    
    }
    add_shortcode( 'feed', 'section_feed_shortcode' );
    
18 iul. 2012 20:40:26
Comentarii

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.

Aaron Aaron
19 iul. 2012 14:54:03

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

helgatheviking helgatheviking
19 iul. 2012 17:12:52

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!

Aaron Aaron
20 iul. 2012 17:20:23

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

helgatheviking helgatheviking
20 iul. 2012 19:14:59