[WordPress] get_template_partをショートコード化して投稿の編集画面から呼べるようにしたい
「get_template_part」は、複数のページで共通利用する定型文やCTAといったテンプレートを読み込む際に便利なAPIです。
ですが、あくまでphpの関数となるため投稿ページや固定ページの編集画面で直接呼び出すことはできません。
「get_template_part」をショートコード化することで、投稿でもテンプレートを自由に呼び出すことができるようになります。
サンプルコード
functions.php
function wrap_get_template_part($atts) {
extract(shortcode_atts(
array(
'arg1' => '',
'arg2' => '',
), $atts)
);
ob_start();
get_template_part( $arg1, $arg2 );
$html = ob_get_contents();
ob_end_clean();
return $html;
}
add_shortcode( 'template', 'wrap_get_template_part' );
投稿編集画面
投稿画面のエディタ内で、テンプレートを呼び出したい箇所に以下のようなショートコードを書きます。
サンプルでは「template-contact.php」というテンプレートファイルを呼び出すときの書き方になります。
引数は読み込みたいテンプレートの名称を指定します。関数版のget_template_partと使い方は一緒です。
[template arg1="content" arg2="contact"]
仕組み、解説、補足など
ob_start();から始まる一連の処理。一見、get_template_partを呼び出して終わりでいいのでは?と思われるかも知れません。
この処理を書かずにget_template_partを呼び出すと、ショートコードを埋め込んだ位置ではなく、ページの最上部にテンプレートが表示されてしまいます。これは、ページの内容が描画される前にテンプレートの呼び出されるWordPressの仕様によるものです。
そこで、ob_start();~ob_end_clean();の処理を入れることで、テンプレートを一時的に退避させて、ページの内容が描かれるときに一緒に描かれるようにしている、というわけです。
これは今回のケースに限らず、ショートコードを使ってhtml文を吐きたいときには必要な処理になります。
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。