web-dev-qa-db-ja.com

ループを表示するための短いコード

私はこのショートコードには何の成功もなしに取り組んできました...

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

出力がない

どうぞよろしくお願いします。

前もって感謝します

_アップデート_  enter image description here

4
andresmijares

上記には多くの問題があります。たとえば、クエリ引数のpost_parentは整数である必要があります。あなたはそれに文字列を割り当てています。 the_excerpt()wp_reset_query()などのワードプレス関数への呼び出しには、末尾のセミコロンが欠けています。 $attsは、ショートコードの属性の連想配列です。属性を使用したい場合は、それらをshortcode関数で抽出する必要があります。特にそれらを事前に抽出していないという観点から、それらをループ関数に渡す必要はありません。また、あなたはとにかくそれらをそれで使用しようとさえしていません。

さらに、なぜそれを2つの機能に分けたいのかわかりません。そして私は関数に直接マークアップを含めずに ob_get_clean を使用することはしませんが、 echo または return を直接使用することにします。後者の2つは、多かれ少なかれ個人的な好みです。

それが言われて、これはあなたが望むことをするでしょう:

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

上記の2行目から6行目は厳密には必要ではありませんが、あなたのショートコードの機能を追加します。

単にページで[andrewloop]を単に使用すると、現在目指しているものが表示されます。これを実現するためだけに、ショートコード関数でクエリ引数を静的に設定することができます。ただし、2行目から6行目では、これらがショートコードのデフォルト値になりましたが、機能を再度変更することなくオンザフライで変更できます。

上記で、あなたは今[andrewloop parent="6" perpage="3"]を例えば使うことができます。そのため、ショートコードは複数の異なるクエリに使用できます。

あなたが気にする場合のためにさらに読むこと:

4
Johannes Pille

私はこれらをほとんど使用していないので私はショートコードにはあまり良くありませんが、ここに私の貢献があります。

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