Shortcode pentru afișarea unei bucle în WordPress

25 nov. 2011, 07:06:22
Vizualizări: 18.7K
Voturi: 3

Am încercat să creez acest shortcode fără succes...

function loop_shortcode( $atts = '' ) {

'<div class="clear"></div>
<div class="childs grid_12"> 
 <?php
 $the_query = new  WP_Query( 
     array(
         "post_parent" => "8",
         "post_type" => "page",
         "posts_per_page" => 4,
         "sort_column"   => "menu_order"
     )
 ); ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
   <div id="service-hp">
       <?php the_post_thumbnail("home-thumb") ?>
       <h2 style="margin-bottom:5px"><?php the_title() ?></h2>
       <?php the_excerpt() ?>
       <a class="read-more" href="<?php the_permalink() ?>">află mai multe <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png"></a>
   </div> <!-- se termină aici -->
<?php endwhile; ?>
<?php wp_reset_query() ?>
</div>';
 }

 function my_loop_shortcode( $atts ) {
     ob_start(); 
     loop_shortcode($atts);
     return ob_get_clean(); 
 }         

 add_shortcode('my_loop', 'my_loop_shortcode');      

Nu primesc nicio ieșire

Aș aprecia ajutorul tău

Mulțumesc anticipat

ACTUALIZARE imagine cu eroarea primită

3
Comentarii

Funcția ta nu pare să afișeze sau să returneze nimic. De asemenea, încearcă să folosești get_posts în loc de un nou WP_Query.

Rutwick Gangurde Rutwick Gangurde
25 nov. 2011 07:17:20

Nu înțeleg de ce să dai downvote la întrebarea mea... oricum, există întotdeauna cineva de genul ăsta pe aici...

andresmijares andresmijares
25 nov. 2011 20:18:02

Nu eu am dat downvote, frate! Poate cineva care nu a înțeles-o.

Rutwick Gangurde Rutwick Gangurde
26 nov. 2011 05:50:15
Toate răspunsurile la întrebare 2
4

Există multiple probleme în codul de mai sus. În primul rând, post_parent în argumentele interogării trebuie să fie un număr întreg. Tu îi atribui un șir de caractere. Mai multe dintre apelurile către funcțiile WordPress, cum ar fi the_excerpt() și wp_reset_query(), lipsesc semnul punct și virgulă la final. $atts este un array asociativ de atribute pentru shortcode. Dacă dorești să folosești atribute, acestea trebuie extrase în funcția shortcode-ului. Nu este nevoie să le transmiți funcției de looping, mai ales că nu le-ai extras în prealabil. De asemenea, nici nu încerci să le folosești în ea oricum.

Mai mult, nu văd de ce ai dori să separi codul în două funcții. Și nu aș include markup direct în funcții și aș folosi ob_get_clean, ci aș echo sau return rezultatul dorit direct. Ultimele două sunt mai mult sau mai puțin preferințe personale.

Cu toate acestea, următorul cod va face ceea ce dorești:

function andrew_loop_shortcode( $atts ) {
    extract( shortcode_atts( array(
        'parent' => 8,
        'type' => 'page',
        'perpage' => 4
    ), $atts ) );
    $output = '<div class="clear"></div><div class="childs grid_12">';
    $args = array(
        'post_parent' => $parent,
        'post_type' => $type,
        'posts_per_page' => $perpage,
        'sort_column'   => 'menu_order'
    );
    $andrew_query = new  WP_Query( $args );
    while ( $andrew_query->have_posts() ) : $andrew_query->the_post();
        $output .= '<div id="service-hp">'.
                   get_the_post_thumbnail('home-thumb').
                   '<h2 style="margin-bottom:5px">'.
                   get_the_title().
                   '</h2>'.
                   get_the_excerpt().
                   '<a class="read-more" href="'.
                   get_permalink().
                   '">en savoir plus <img src="'.
                   get_bloginfo( 'template_url' ).
                   '/images/read-more.png"></a></div><!--  ends here -->';
    endwhile;
    wp_reset_query();
    $output .= '</div>';
    return $output;
}
add_shortcode('andrewloop', 'andrew_loop_shortcode');

Liniile 2 - 6 din codul de mai sus nu sunt strict necesare, dar adaugă funcționalitate shortcode-ului tău.

Dacă acum folosești simplu [andrewloop] într-o pagină, va afișa ceea ce urmărești în prezent. Pentru a realiza doar asta, ai putea seta argumentele interogării static în funcția shortcode-ului. Cu liniile 2-6 însă, acestea sunt acum valorile implicite ale shortcode-ului, dar pot fi modificate din mers fără a mai modifica funcția din nou.

Cu codul de mai sus, poți acum folosi [andrewloop parent="6" perpage="3"], de exemplu. Shortcode-ul poate fi astfel utilizat pentru multiple interogări diferite.

Lecturi suplimentare, dacă te interesează:

25 nov. 2011 08:38:22
Comentarii

Salut Johannes, practic foloseam un ghid pentru un tutorial, dar se pare că nu este foarte eficient, mulțumesc pentru răspuns, am încercat și într-un fel a funcționat însă îmi dă câteva erori pe care nu înțeleg de ce, de exemplu, se întrerupe pentru că spune că get_the_permalink() nu este definit și de asemenea afișează link-ul într-un mod ciudat, iar tag-urile H2 nu sunt luate în considerare deloc, ce crezi că ar putea cauza erorile?

andresmijares andresmijares
25 nov. 2011 20:35:03

Am realizat că există o eroare în funcție, este get_permalink, asta e rezolvat, însă acum marea problemă este afișarea rezultatelor gen... mai întâi funcțiile și apoi toate clasele, voi adăuga o poză în întrebare ca să vezi

andresmijares andresmijares
25 nov. 2011 20:40:44

@andrewkthx Am scris-o rapid fără să o verific, scuze. Am editat răspunsul, așa că acum e corect pentru referință viitoare (get_permalink). Nu înțeleg exact care e problema ta acum - dacă nu ești mulțumit de markup, pur și simplu editează loop-ul. Cât despre cum arată - asta e o problemă de stilizare (adică css) și ar trebui rezolvată în fișierele tale de stil.

Johannes Pille Johannes Pille
25 nov. 2011 21:16:16

Mulțumesc din nou Johannes, ceea ce am vrut să spun este să observi că este ceva ciudat pentru că, de exemplu, codul spune '<h2 style="margin-bottom:5px">'. get_the_title() . '</h2>'. dar observă că rezultatul în codul sursă pe care l-am încărcat, generează ceva de genul: mai întâi titlul cu rezultatul celeilalte funcții și apoi după toate, afișează div-urile și tag-urile, restul funcționează excelent, sigur

andresmijares andresmijares
25 nov. 2011 21:43:36
0

Nu sunt foarte priceput cu shortcode-urile pentru că aproape că nu le folosesc, dar iată contribuția mea.

function loop_shortcode($atts, $content = null) {

    shortcode_atts(array(
        'post_parent' => 8,
            'post_type' => 'page',
            'posts_per_page' => 4,
            'sort_column' => 'menu_order'
    ), $atts);

    $the_query = new WP_Query();
    $the_query->query($atts);

    if ($the_query->have_posts()) : while ($the_query->have_posts()) :  
             $the_query->the_post(); ob_start(); ?>

    <div id="service-hp">
              <?php the_post_thumbnail('home-thumb') ?>
                     <h2 style="margin-bottom:5px"><?php the_title() ?></h2>
                                    <?php the_excerpt() ?>
       <a class="read-more" href="<?php the_permalink() ?>">află mai multe <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png" alt="Mai multe informații" title="Mai multe informații"></a>
        </div><!-- /#service-hp -->

 <?php endwhile; endif; wp_reset_query(); 
        $content = ob_get_contents(); ob_end_clean();

                       return $content;

 }

add_shortcode('myloop', 'loop_shortcode');
25 nov. 2011 08:21:47