ショートコードだって get_template_part()したい

WordPressのショートコードはHTMLを出力(echo)ではなく、返す(return)ところが要点だ。
HTMLをゴニョゴニョ生成してreturnする。とはいうものの投稿一覧を表示する場合に通常はget_template_part()でよいところ、ショートコードでこれを呼び出すとその場で内容が出力されてしまう。似たコードをfunctions.phpに書いてreturn せねばならないのか?面倒だしモヤモヤする。

なんとかショートコードでget_template_part()を使うことはできないものか?横着な私は考えた。

shortcode

調べるとob_start()を使うとよいことがわかった。出力をバッファリングするPHPの関数だ。そういうのもあるのか!PHPあまり知らなかった。

ここでは[my_pickup]というショートコードを用意し、アイキャッチを持つ投稿をランダムに3つ表示してみる。

function my_pickup ( $atts ) {

    ob_start();

    $args = array(
        'posts_per_page' => 3,
        'post_type' => 'post',
        'post_status' => 'publish',
        'meta_key' => '_thumbnail_id',
        'orderby'=> 'rand',
    );

    $the_query = new WP_Query($args);
    if ( $the_query->have_posts() ) :

        while ( $the_query->have_posts() ) : $the_query->the_post();
            get_template_part( 'content' );
        endwhile;

        wp_reset_postdata();
    endif;

    return ob_get_clean();
}
add_shortcode( 'my_pickup', 'my_pickup' );

ob_start()は、これより後の出力をバッファリングする。get_template_part ()を使っても出力されずバッファにたまる。ob_get_clean() はバッファされている内容を取得し、バッファを削除する。ショートコードではこの内容をreturn すればよい。

オーソドックスな手法らしく、検索するとすぐに出てくる。いったいどこにバッファされているのか?私は変数やメモリも用意してないのに、PHPとはそういったものなのか…
面倒に感じるときこそチャンス!手を抜くためにいろいろやってみるのだ。

コメントを残す

メールアドレスが公開されることはありません。