WordPressテーマ制作者が押さえるべきContact Form 7の実装ポイント 納品時のポイント
更新日:2025/02/24

WordPressテーマを制作・納品する際、お問い合わせフォームの実装は重要なポイントとなります。今回は、環境に依存せずContact Form 7を確実に動作させるための実装方法をご紹介します。
なぜContact Form 7なのか?
WordPressのお問い合わせフォームプラグインとして、圧倒的なシェアを持つContact Form 7。無料で利用でき、カスタマイズ性も高いため、多くのテーマ制作者が採用しています。
WordPress自作テーマ納品時のContact Form 7実装術 – 環境非依存のアプローチ
問題点
Contact Form 7でフォームを作成すると、自動的にIDが割り振られます。例えば:
エラー: コンタクトフォームが見つかりません。
このIDは環境ごとに異なるため、開発環境で作ったフォームIDが本番環境で使えないことになります
Contact Form 7 のテンプレート書くの面倒問題
ファイルに記述した内容を Contact Form 7 のテンプレートとして利用できるように実装してみました。
https://qiita.com/k_h_b/items/67fcb47cbce45ccc017e
以下のコードを、フォームを表示したい WordPress のテンプレートファイル(page.php など)に埋め込みます。
上記のContact Form 7 のテンプレート書くの面倒問題を実装
<?php
// フォームのデータを取得
add_action('wpcf7_contact_form', function ($form) {
$path = '{ テンプレートを記述したファイルへのパス }'; // フォームテンプレートのファイル
ob_start();
// 指定したテンプレートファイルを読み込む
include $path;
$template = ob_get_clean();
$p = $form->get_properties();
if ($p['form'] === $template) return $form; // 変更がなければそのまま
$p['form'] = $template;
$form->set_properties($p);
$form->replace_all_form_tags();
$form->save();
return $form;
});
// 指定したフォームを取得して表示
$useform = array_shift(get_posts([
'post_type' => 'wpcf7_contact_form',
'posts_per_page' => 1,
'name' => strtolower(urlencode('{ 利用するフォームのスラッグ }'))
]));
echo do_shortcode('エラー: コンタクトフォームが見つかりません。
');
?>
解決アプローチ1
タイトルでフォームをショートコードで設定できるようにする
- 独自ショートコード [cf7_insert form_title=’contact’] を作成
- WordPressの標準機能(get_posts)を使用
- 固定ページなどで簡単に呼び出せる
// オリジナルのショートコード登録
add_shortcode('cf7_insert', 'get_cf7_insert');
function get_cf7_insert($atts){
extract(shortcode_atts(array(
'form_title' => '',
), $atts));
// Contact Form 7のpost_typeから該当タイトルのフォームを検索
$args = array(
'post_type' => 'wpcf7_contact_form',
's' => $form_title,
);
$myposts = get_posts($args);
if($myposts) {
foreach($myposts as $post) {
setup_postdata($post);
$wpcf7_shortcode_command = 'エラー: コンタクトフォームが見つかりません。
';
}
return do_shortcode($wpcf7_shortcode_command);
}
return '';
}
[cf7_insert form_title='contact']
解決アプローチ2
Contact Form 7のAPIを使用して、タイトルからIDを動的に検索
- フォームテンプレートの提供
// functions.php
function register_default_contact_form() {
if (function_exists('wpcf7_load_text_domain')) {
$form_template = file_get_contents(get_template_directory() . '/inc/contact-form-template.txt');
// フォームテンプレートを登録
}
}
add_action('after_switch_theme', 'register_default_contact_form');
- フォーム名による参照
function get_contact_form_by_title($title) {
$forms = WPCF7_ContactForm::find(array('title' => $title));
if (!empty($forms)) {
return 'エラー: コンタクトフォームが見つかりません。
->id() . '" title="' . $title . '"]';
}
return '';
}
- テンプレートファイルでの呼び出し
// page-contact.php
<?php echo do_shortcode(get_contact_form_by_title('お問い合わせフォーム')); ?>
themes/your-theme/
├── inc/
│ └── contact-form-template.txt
└── functions.php
テーマユーザーへの配慮
- カスタマイザーでの設定項目追加
- フォームIDを簡単に変更できる
- スタイルのカスタマイズオプション
- 表示位置の調整機能
- ドキュメント整備のポイント
- プラグインのインストール手順
- フォームID確認方法の説明
- カスタマイズ方法の解説
■ スタイリングのベストプラクティス
環境非依存のCSS設計
.wpcf7-form {
/* フォームの基本スタイル */
}
.wpcf7-response-output {
/* メッセージ表示のスタイル */
}

-
検索
(例) debug search etc.. -
カテゴリー
-
【WordPress】カスタムフィールド作成の仕方「ACF」Advanced Custom Fieldsの使用法
更新日:2024/06/10
298 view
-
mixhostでのWordPress利用について
更新日:2024/04/02
295 view
-
scrollHint
更新日:2024/03/13
249 view
-
LOLIPOPでWordPressインストール(サブディレクトリにインストールしたWordPressをドメイン直下で表示)
更新日:2024/06/13
235 view
-
XML Sitemap Generator for Google不具合のダウングレード対応、代替プラグイン
更新日:2024/06/13
234 view
-
Sass導入方法
更新日:2024/03/13
206 view
-
【SnowMonkey】納品までのフローまとめ
更新日:2025/02/15
163 view
-
【Snow Monkey】Googleサーチコンソール登録
更新日:2024/05/28
157 view
-
ワードプレスでフォントを変えたいとき、プラグインを使えば初心者でも簡単
更新日:2025/02/16
144 view
-
【Googleサーチコンソール】検索画面で表示させたくない「Googleのインデックス削除」
更新日:2024/06/07
129 view
-
【ショートコード】編集画面で任意の場所にHTMLファイルを挿入
更新日:2024/01/26
122 view
-
tailwindcss使い方
更新日:2024/03/13
119 view
-
キーワード検索で上位表示させる方法【SEO】
更新日:2023/10/28
119 view
-
Recline: GitHub Copilotで動作するClaude 3.5 Sonnet搭載の開発支援ツール
更新日:2025/01/20
107 view
-
WordPressプラグイン「All-in-One WP Migration」のトラブル
更新日:2022/03/31
83 view
-
ワードプレスセキュリティー対策まとめ【2025年】「site guard wordpress」「BackWPup バージョン5でUI変更!?」
更新日:2025/02/25
74 view
-
「THE THOR」を半年使ってみて、レビュー【メリット・デメリット】
更新日:2025/02/16
45 view
-
SSHを使用してGitHubのリポジトリをクローン、複数の接続元で公開鍵をディレクトリで区別する方法
更新日:2025/01/13
44 view
-
VSCodeで開発効率を劇的に向上させる!Roo-Clineプラグイン完全ガイド【Gemini API】
更新日:2025/02/08
41 view
-
「JSONスキーマ」と「Few-shot Learning」で実現する次世代生成AIソフトウェア開発の可能性
更新日:2025/02/12
40 view
-
THE THOR(ザ・トール)でグーグルアドセンスを使う
更新日:2025/02/16
39 view
-
WordPressの無料画像素材のおすすめダウンロードサイト!
更新日:2022/02/22
35 view
-
リファクタリング【VSCode Javasctipt Python】
更新日:2025/02/06
34 view
-
形態素解析とは?初心者でもわかるツールの使い方と実践例
更新日:2025/02/08
33 view
-
【Next.js AWS】音声文字起こし&要約、分析アプリケーション(S3)(Transcribe)(Amazon Bedrock)
更新日:2025/02/13
28 view
-
VSCodeプラグイン「 Pretter – Code formatter」「PHP Intelephense 」
更新日:2025/01/06
26 view
-
【WordPress】SVGを投稿記事のサムネイルに!自作プラグイン(未実装🤷♂️)「nonce(ナンス)トークン」wp_postmetaテーブルを利用
更新日:2025/02/16
23 view
-
【CSS JavaScript サンプルコード】アコーディオン 続きを読む(Read more)Toggle 折りたたみコンテンツ
更新日:2025/02/05
23 view
-
Googleアドセンスとは?〜前編〜
更新日:2025/02/16
22 view
-
【WordPressプラグイン】人気記事 管理 WordPress Popular Posts 実践的なカスタマイズ
更新日:2025/02/15
22 view
-
WordPressでカスタムフィールドを使った記事のスコアリング 一定割合ランダム表示でε-greedy方策
更新日:2025/02/24
19 view
-
【WordPress】プラグイン不使用でカスタムタクソノミーを設定、絞り込み検索について
更新日:2025/01/26
18 view
-
スマートフォンファーストのWeb開発実践ガイド
更新日:2025/01/23
16 view
-
「Amazon Bedrock+ Amazon Kendra」で作る社内検索
更新日:2025/01/22
14 view
-
AWSのOCRサービス完全ガイド:Textract、Rekognition、Comprehendの使い分け
更新日:2025/02/09
14 view