WordPressのショートコードで任意のテンプレートを呼び出す
WordPressで投稿の任意の場所にお問い合わせフォームなんかを仕込みたいなー、なんて言われたことはありますでしょうか。でも投稿の中の話なので、テンプレートをいじってどうこうできる話じゃありませんよね。では、どうするか。
ショートコードでテンプレートを呼び出す
ショートコードを使えば、投稿内の任意の場所でPHPのコードを呼び出すことができます。
そんな訳でベタにショートコードの関数内に、表示したい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のノウハウが溜まっていくのでした。。