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

そんな訳でベタにショートコードの関数内に、表示したいHTMLを書いても良いのですが・・・
1 2 3 4 5 6 7 8 9 |
function show_contact_form() { $html = <<<EOS <section class="contact"> わたしが問い合わせフォームだ! </section> EOS; return $html; } add_shortcode('contact', 'show_contact_form'); |
見た目、ちょっとつらいですよね。こういうときはテンプレートを使いたい。
WordPressにはget_template_part()
という関数があり、これを使うと任意の場所でテンプレートを呼び出すことができます。
1 2 3 4 |
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にはそんな関数が用意されているのがナイスですね。
1 2 3 4 5 6 |
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のノウハウが溜まっていくのでした。。