WordPressのショートコードはHTMLを出力(echo)ではなく、返す(return)ところが要点だ。
HTMLをゴニョゴニョ生成してreturnする。とはいうものの投稿一覧を表示する場合に通常はget_template_part()でよいところ、ショートコードでこれを呼び出すとその場で内容が出力されてしまう。似たコードをfunctions.phpに書いてreturn せねばならないのか?面倒だしモヤモヤする。
なんとかショートコードでget_template_part()を使うことはできないものか?横着な私は考えた。
調べるとob_start()を使うとよいことがわかった。出力をバッファリングするPHPの関数だ。そういうのもあるのか!PHPあまり知らなかった。
ここでは[my_pickup]というショートコードを用意し、アイキャッチを持つ投稿をランダムに3つ表示してみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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とはそういったものなのか…
面倒に感じるときこそチャンス!手を抜くためにいろいろやってみるのだ。