WordPressのショートコードで任意のテンプレートを呼び出す

WordPressで投稿の任意の場所にお問い合わせフォームなんかを仕込みたいなー、なんて言われたことはありますでしょうか。でも投稿の中の話なので、テンプレートをいじってどうこうできる話じゃありませんよね。では、どうするか。

ショートコードでテンプレートを呼び出す

ショートコードを使えば、投稿内の任意の場所でPHPのコードを呼び出すことができます。

shortcode

そんな訳でベタにショートコードの関数内に、表示したいHTMLを書いても良いのですが・・・

function show_contact_form() {
  $html = <<
  わたしが問い合わせフォームだ!
EOS; return $html; } add_shortcode('contact', 'show_contact_form');

見た目、ちょっとつらいですよね。こういうときはテンプレートを使いたい。

WordPressにはget_template_part()という関数があり、これを使うと任意の場所でテンプレートを呼び出すことができます。

function show_contact_form() {
  get_template_part('partials/contact'); // partials/contact.phpの内容が表示される
}
add_shortcode('contact', 'show_contact_form');

しかしこのコードのままでは、実際に投稿の中で使おうとすると投稿の一番上に問い合わせフォームが表示されてしまいます。どうやらget_template_part()の内部では最終的にrequire_once()を使ってテンプレートがロードされるようであり、そのせいで投稿の中身が表示されるより先にテンプレートのレンダリングが走ってしまう模様。

ではどうするのかというと、レンダリングのバッファを文字列として取得しておいて、取得した文字列をshortcodeの置換内容として返してあげれば良いようです。PHPにはそんな関数が用意されているのがナイスですね。

function show_contact_form() {
  ob_start();
  get_template_part('partials/contact'); // partials/contact.phpの内容が表示される
  return ob_get_clean();
}
add_shortcode('contact', 'show_contact_form');

これで任意の場所にテンプレートの内容を表示することができます。コードもスッキリしてナイスですね。

そういうわけで地味にWordPressのノウハウが溜まっていくのでした。。