Contact Form 7のショートコードの埋め込みとフォームのidに違いが出る時の対応


WordPressでWebサイトを運用する中で、お問い合わせを受けるコンタクトフォームを、Contact Form 7というプラグインで実装されることが多いでしょう。

Contact Form 7を利用する中で、実際にWebページにフォームを表示させる時には、フォームを埋め込むためのショートコードを使っていきます。
固定ページや投稿ページでは、ショートコードを貼り付けるだけで簡単に表示ができますが、個別のテンプレートファイルでお問い合わせのページを構築している場合は、ソースコードに埋め込む必要があります。

ショートコードでフォームを表示するには、フォームのidの情報を必要としますが、もしテスト環境から本番環境にファイルをアップロードする場合などでは、idの違いで表示されないといったミスも起こりうります。
その他のことでもidに違いが出てくることもあるでしょう。

ここでは、Contact Form 7での簡単なショートコードの埋め込み方法、またidの違いに対応する方法をご紹介します。


ショートコードの埋め込み


まずはシンプルな埋め込み方法です。

Contact Form 7のフォームの一覧にて、埋め込みのショートコードが確認できます。

Contact Form 7のショートコード



固定ページなどの投稿で利用する際は、そのまま貼り付ければよいですし、ソースコードに埋め込む時にも、こちらのショートコードを使います。

個別のテンプレートファイルに埋め込む場合には、WordPressのdo_shortcode関数を使います。
以下、サンプルコードになります。

<?php echo do_shortcode('[contact-form-7 id="6" title="コンタクトフォーム 1"]'); ?>



たった1行でWebページにコンタクトフォームを表示させることができます。


idが環境によって変わる場合


環境によってidが違うため、その度にidを合わせて埋め込むのが面倒な場合には、コンタクトフォームの情報を取得してから、その情報をもとにショートコードを埋め込みます。

以下、サンプルコードです。

<?php
$get_form = get_posts(array('post_type' => 'wpcf7_contact_form', 'posts_per_page' => -1, 'name' => 'コンタクトフォーム 1'))[0];
echo do_shortcode( '[contact-form-7 id="'.$get_form->ID.'" title="'.$get_form->post_title.'"]' );
?>



get_posts()関数でWP_Queryクラスを利用し、パラメータに一致した投稿を取得します。
取得した情報は、array()で配列として変数「get_form」に格納します。

Contact Form 7のフォームはカスタム投稿タイプとして作られるので、「’post_type’ => ‘wpcf7_contact_form’」として配列の格納対象とします。
「’posts_per_page’ => -1」では、すべてのフォームを取得します。
「’name’ => ‘コンタクトフォーム 1’」では、対象のフォームの名前を指定します。ただ、この名前は一番最初に付けた名前になります。後からわかりやすい名前に変更すると思いますが、変更後の名前ではありません。
Contact Form 7を利用する時に一番最初に作成されているフォームは、日本語版ですと「コンタクトフォーム 1」となります。
「[0]」は、get_posts()の配列のインデックス番号になります。nameで1つのフォームを取得した場合は、配列は1つしかないのでそのまま「[0]」でOKです。

変数「get_form」に情報を格納できたら、do_shortcode関数でidやtitleを取得したフォームオブジェクトから、アロー演算子「->」で「ID」と「post_title」を取り出し、ショートコード内に設定します。

これで環境が変わっても最初のフォームの名前で、idが変わってくる場合の対応ができます。


また、複数のフォームから配列のインデックス番号で取得する方法もあります。
以下のように複数のフォームがある場合、配列には3つの情報を取得することができます。

Contact Form 7での複数のフォームのショートコード情報



フォームを作成していくと、下に最新のフォームとして一覧に並びます。
配列に入る順番は最新のフォームからとなります。
サンプルの場合は、[0]に「コンタクトフォーム 03」[1]に「コンタクトフォーム 02」[0]に「Contact From」が格納されます。

もし、テスト環境と本番環境でフォームの数や作成した順番が統一されているのであれば、配列のインデックス番号で調整することもできます。

<?php
$get_form = get_posts(array('post_type' => 'wpcf7_contact_form', 'posts_per_page' => -1))[1];
echo do_shortcode( '[contact-form-7 id="'.$get_form->ID.'" title="'.$get_form->post_title.'"]' );
?>



この時、nameのパラメーターは必要ありません。
上記のサンプルコードの場合、「コンタクトフォーム 02」が表示されます。


まとめ


シンプルにコンタクトフォームを埋め込むのであれば、do_shortcode関数1行で表示させることができます。

ただ、もしテスト環境や本番環境ほか、環境の変化でidが変わることがある場合にも対応するのであれば、フォームの名前を指定してフォームの情報を取得すると良いでしょう。
最初にフォームを作成した名前さえ一致していれば、環境を気にすることはありません。