ミギムキ

[WordPress] get_template_partをショートコード化して投稿の編集画面から呼べるようにしたい

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です。