web-dev-qa-db-fra.com

Code court pour afficher une boucle

J'ai travaillé sur ce shortcode sans succès ...

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() ?>">en savoir plus <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png"></a>
   </div> <!--  ends here -->
<?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');      

Je n'obtiens aucune sortie

J'apprécierais votre aide

Merci d'avance

METTRE À JOUR enter image description here

4
andresmijares

Il y a une multitude de problèmes avec ce qui précède. D'une part, post_parent dans les arguments de la requête doit être un entier. Vous lui attribuez une chaîne. Certains de vos appels vers les fonctions wordpress, tels que the_excerpt() et wp_reset_query(), ne contiennent pas de points-virgules de fin. $atts est un tableau associatif d'attributs pour le shortcode. Si vous souhaitez utiliser des attributs, ils doivent être extraits dans la fonction shortcode. Il n'est pas nécessaire de les passer à la fonction de bouclage, surtout si vous ne les avez pas extraits auparavant. De plus, vous n'essayez même pas de les utiliser de toute façon.

De plus, je ne vois pas pourquoi vous voudriez le séparer en deux fonctions. Et je n'inclurais pas de balisage direct dans les fonctions et utiliserais ob_get_clean non plus, mais echo ou return le résultat souhaité directement. Les deux derniers sont des préférences plus ou moins personnelles.

Cela étant dit, cela fera ce que vous voulez:

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');

Les lignes 2 à 6 de ce qui précède ne sont pas strictement nécessaires, mais ajoutent à la fonctionnalité de votre shortcode.

Si vous utilisez simplement [andrewloop] dans une page maintenant, cela affichera ce que vous visez actuellement. Pour cela, vous pouvez définir les arguments de la requête de manière statique dans la fonction shortcode. Cependant, avec les lignes 2 à 6, il s’agit des valeurs par défaut du code abrégé, mais elles peuvent être modifiées à la volée sans modifier à nouveau la fonction.

Avec ce qui précède, vous pouvez maintenant utiliser [andrewloop parent="6" perpage="3"] par exemple. Le shortcode peut donc être utilisé pour plusieurs requêtes différentes.

Lectures complémentaires, au cas où vous vous soucieriez:

4
Johannes Pille

Je ne suis pas très bon avec les codes courts parce que je ne les utilise presque pas, mais voici ma contribution.

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() ?>">en savoir plus <img src="<?php bloginfo( "template_url" ); ?>/images/read-more.png"></a>
        </div><!-- /#service-hp -->

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

                       return $content;

 }

add_shortcode('myloop', 'loop_shortcode');
0
Andres Yanez