【Contact Form 7】formタグにclass・idを設定する方法|CSSセレクタ・デザインカスタマイズ・複数フォーム対応まで

【Contact Form 7】formタグにclass・idを設定する方法|CSSセレクタ・デザインカスタマイズ・複数フォーム対応まで WordPress

Contact Form 7(CF7)は WordPress で最も利用されている問い合わせフォームプラグインです。しかし、デフォルトのデザインをカスタマイズしたいとき、フォームの form タグにclass や id を追加する方法を知っておくと自由度が格段に上がります。

この記事では、ショートコード属性による基本的なclass/id追加から、CF7が出力するHTML構造の理解CSSセレクタの実践的な使い方、複数フォームのデザイン分けまで、フォームカスタマイズの全体像を解説します。

💡 この記事でわかること

  • html_class / html_id でformタグにclass・idを追加する方法
  • CF7が出力するHTML構造と主要なCSSセレクタ一覧
  • 入力フィールドにclass・idを追加する方法
  • 実践的なCSSデザインカスタマイズ(レスポンシブ対応)
  • 複数フォームを設置して個別にデザインを変える方法
  • wpcf7_form_elements フィルターによるPHP側カスタマイズ
スポンサーリンク

html_class / html_id でformタグにclass・idを追加する

Contact Form 7のショートコードには、formタグに任意のclassやidを付与するための属性が用意されています。

基本の書き方

<!-- classを追加 -->

エラー: コンタクトフォームが見つかりません。

<!-- idを追加 -->

エラー: コンタクトフォームが見つかりません。

<!-- classとid両方を追加 -->

エラー: コンタクトフォームが見つかりません。

属性 対象 用途
html_class <form> タグの class 属性 CSSでスタイルを適用するためのクラス名
html_id <form> タグの id 属性 JSでのDOM操作やページ内リンクのターゲット

出力されるHTMLの変化

<!-- html_class / html_id なし(デフォルト) -->
<form action="/contact/" method="post"
      class="wpcf7-form init">

<!-- html_class="my-contact-form" html_id="inquiry-form" を追加 -->
<form action="/contact/" method="post"
      class="wpcf7-form init my-contact-form"
      id="inquiry-form">

html_class で指定したクラスは、既存の wpcf7-form クラスに追加される形になります。既存クラスが上書きされることはありません。

ℹ️ ポイント: html_class には複数のクラスをスペース区切りで指定できます。
例: html_class="form-standard theme-dark full-width"

Contact Form 7 が出力するHTML構造

CSSでデザインをカスタマイズする前に、CF7 が出力する HTML構造を理解しておくことが重要です。

<!-- CF7が出力するHTML構造 -->
<div class="wpcf7" id="wpcf7-f123-o1">          <!-- 最外側ラッパー -->
  <form class="wpcf7-form init">                <!-- formタグ本体 -->

    <p>お名前<br>
      <span class="wpcf7-form-control-wrap">  <!-- フィールドラッパー -->
        <input type="text"
               class="wpcf7-form-control wpcf7-text"
               name="your-name" />
      </span>
    </p>

    <p>
      <input type="submit"
             class="wpcf7-form-control wpcf7-submit"
             value="送信" />
    </p>

    <div class="wpcf7-response-output">     <!-- 送信結果メッセージ -->
    </div>

  </form>
</div>

主要なCSSセレクタ一覧

セレクタ 対象 用途
.wpcf7 フォーム全体のラッパーdiv フォーム全体の幅・余白・背景を制御
.wpcf7-form formタグ本体 フォーム内のレイアウト制御
.wpcf7-form-control 全入力フィールド共通 フォント・枠線・パディングなど
.wpcf7-text テキスト入力欄 テキストフィールドの個別スタイル
.wpcf7-email メール入力欄 メールフィールドの個別スタイル
.wpcf7-textarea テキストエリア 本文入力欄の高さ・リサイズ制御
.wpcf7-select セレクトボックス ドロップダウンの見た目調整
.wpcf7-submit 送信ボタン ボタンの色・大きさ・ホバー効果
.wpcf7-form-control-wrap 各フィールドのラッパーspan フィールド周辺の余白やエラー表示
.wpcf7-response-output 送信結果メッセージ 成功/失敗メッセージのスタイル
.wpcf7-not-valid-tip バリデーションエラーメッセージ 入力エラー時の警告テキスト

入力フィールドにclass・idを追加する方法

formタグだけでなく、個々の入力フィールドにもclassやidを追加できます。CF7のフォーム編集画面で、各タグにオプションとして指定します。

<!-- CF7フォーム編集画面での記述例 -->

<!-- classを追加 -->
[text* your-name class:input-name]

<!-- idを追加 -->
[email* your-email id:email-field]

<!-- classとid両方 -->
[textarea your-message class:input-message id:message-field]

<!-- 複数classを追加 -->
[text your-company class:input-company class:required-field]

<!-- 送信ボタンにもclass追加可能 -->
[submit class:btn-submit "送信する"]

⚠ 注意: classは class:クラス名、idは id:id名 の形式で指定します。= ではなく :(コロン)区切りなのがポイントです。formタグへの html_class と記法が異なるので混同しないようにしましょう。

出力されるHTMLの変化(フィールド級)

<!-- [text* your-name class:input-name id:name-field] の出力結果 -->
<span class="wpcf7-form-control-wrap" data-name="your-name">
  <input type="text"
         name="your-name"
         class="wpcf7-form-control wpcf7-text wpcf7-validates-as-required input-name"
         id="name-field"
         aria-required="true" />
</span>

class: で指定したクラスは、CF7が自動付与するクラス(wpcf7-form-control など)の後ろに追加されます。既存クラスは保持されるので安心です。

ℹ️ 複数クラスの指定方法の違い:
formタグ(html_class): スペース区切りで一括指定 → html_class="classA classB"
入力フィールド(class:): class: を繰り返して指定 → class:classA class:classB

CSSデザインカスタマイズの実践例

ここからは、html_class やCF7標準のセレクタを使って、実際にフォームデザインをカスタマイズする方法を紹介します。CSSは子テーマの style.css か、WordPress管理画面の「カスタマイズ → 追加CSS」に記述します。

パターン1: シンプルで美しいフォーム

/* フォーム全体 */
.wpcf7-form {
    max-width: 600px;
    margin: 0 auto;
    padding: 32px;
    background: #fff;
    border-radius: 12px;
    box-shadow: 0 2px 16px rgba(0, 0, 0, 0.06);
}

/* 入力フィールド共通 */
.wpcf7-form-control:not([type="submit"]) {
    width: 100%;
    padding: 12px 16px;
    border: 1px solid #ddd;
    border-radius: 8px;
    font-size: 16px;
    transition: border-color 0.3s;
    box-sizing: border-box;
}

/* フォーカス時のハイライト */
.wpcf7-form-control:focus {
    border-color: #4285f4;
    outline: none;
    box-shadow: 0 0 0 3px rgba(66, 133, 244, 0.15);
}

/* 送信ボタン */
.wpcf7-submit {
    display: block;
    width: 100%;
    padding: 14px;
    background: #4285f4;
    color: #fff;
    border: none;
    border-radius: 8px;
    font-size: 16px;
    font-weight: 600;
    cursor: pointer;
    transition: background 0.3s;
}
.wpcf7-submit:hover {
    background: #3367d6;
}

/* エラーメッセージ */
.wpcf7-not-valid-tip {
    color: #e53935;
    font-size: 13px;
    margin-top: 4px;
}

/* 送信結果メッセージ */
.wpcf7-response-output {
    border-radius: 8px;
    padding: 12px 16px;
    margin-top: 16px;
}

パターン2: テーブルレイアウトのフォーム

フォームのラベルと入力欄を横並びに配置するには、CF7のフォーム編集画面でHTMLタグを使います。

<!-- CF7フォーム編集画面のHTMLテンプレート -->
<div class="form-group">
  <label>お名前 <span class="required">*</span></label>
  [text* your-name class:form-input placeholder "例:山田太郎"]
</div>

<div class="form-group">
  <label>メールアドレス <span class="required">*</span></label>
  [email* your-email class:form-input placeholder "例:info@example.com"]
</div>

<div class="form-group">
  <label>お問い合わせ内容 <span class="required">*</span></label>
  [textarea* your-message class:form-input placeholder "ご用件をご記入ください"]
</div>

[submit class:btn-submit "送信する"]
/* テーブルレイアウトCSS */
.form-group {
    display: flex;
    align-items: flex-start;
    gap: 16px;
    margin-bottom: 20px;
}
.form-group label {
    flex: 0 0 160px;
    padding-top: 10px;
    font-weight: 600;
}
.form-group .wpcf7-form-control-wrap {
    flex: 1;
}
.required {
    color: #e53935;
}

/* レスポンシブ対応: スマホでは縦並び */
@media (max-width: 600px) {
    .form-group {
        flex-direction: column;
        gap: 4px;
    }
    .form-group label {
        flex: none;
        padding-top: 0;
    }
}

✅ ベストプラクティス: CF7のデフォルトでは <p> タグと <br> タグが自動挿入されます。HTMLタグで自分でレイアウトを組む場合は、自動挿入を無効にすると制御しやすくなります(pタグとbrタグの自動挿入を削除する方法)。

複数フォームで個別にデザインを変える方法

1つのサイトに「お問い合わせフォーム」「資料請求フォーム」など複数のフォームを設置し、それぞれ異なるデザインにしたい場合の方法です。

方法1: html_class で分ける(推奨)

<!-- ショートコード -->

エラー: コンタクトフォームが見つかりません。

エラー: コンタクトフォームが見つかりません。

/* お問い合わせフォーム */
.form-inquiry .wpcf7-submit {
    background: #4285f4;
}

/* 資料請求フォーム */
.form-document .wpcf7-submit {
    background: #34a853;
}

方法2: CF7が付与するidセレクタで分ける

CF7はフォームごとに自動的にユニークなidを付与します。このidを使ってもデザインを分けられます。

/* CF7が自動付与するid: wpcf7-f[フォームID]-o[連番] */
/* 例: wpcf7-f123-o1 */

#wpcf7-f123-o1 .wpcf7-submit {
    background: #4285f4;
}

#wpcf7-f456-o1 .wpcf7-submit {
    background: #34a853;
}

ℹ️ どちらを使うべき? html_class の方が意味のあるクラス名を付けられるため、CSSの可読性・保守性が高くなります。自動付与のidはフォームを再作成すると変わる可能性があるため、html_class の方が推奨です。

PHPフィルターによる高度なカスタマイズ

ショートコード属性だけでは対応できない場合は、PHPのフィルターフックを使ってフォームのHTMLを加工できます。以下のコードは子テーマの functions.php に追加します。

do_shortcode_tag でformタグにdata属性を追加

/**
 * CF7のformタグにカスタムdata属性を追加する
 * 例: data-form-type="inquiry" を追加
 */
add_filter( 'do_shortcode_tag', function( $output, $tag, $attr ) {
    if ( 'contact-form-7' === $tag || 'contact-form' === $tag ) {
        $output = str_replace(
            '<form ',
            '<form data-form-type="inquiry" ',
            $output
        );
    }
    return $output;
}, 10, 3 );

wpcf7_form_elements で入力フィールドを加工

/**
 * wpcf7_form_elements でフォーム要素のHTMLを加工する
 * 例: 全テキストフィールドに autocomplete 属性を追加
 */
add_filter( 'wpcf7_form_elements', function( $content ) {
    // name属性で特定のフィールドを狙い撃ち
    $content = str_replace(
        'name="your-name"',
        'name="your-name" autocomplete="name"',
        $content
    );
    $content = str_replace(
        'name="your-email"',
        'name="your-email" autocomplete="email"',
        $content
    );
    return $content;
} );
フィルター 用途
do_shortcode_tag formタグ自体に属性を追加(data属性、aria属性など)
wpcf7_form_elements フォーム内の入力要素のHTMLを加工
wpcf7_form_action_url formタグの action 属性を変更
wpcf7_form_class_attr formタグの class 属性をプログラムから制御

wpcf7_form_class_attr でclassを動的に制御

/**
 * wpcf7_form_class_attr でformタグのclassを動的に追加する
 * 例: ログインユーザーにだけ特別なクラスを付与
 */
add_filter( 'wpcf7_form_class_attr', function( $class ) {
    if ( is_user_logged_in() ) {
        $class .= ' form-logged-in';
    }
    return $class;
} );

送信状態に応じたスタイリング

CF7はフォームの送信状態に応じて class を動的に切り替えます。これを利用してUXを向上させるCSSを書けます。

クラス名 状態 使用場面
.init 初期状態 フォーム読み込み完了時
.submitting 送信中 ローディング表示やボタン無効化
.sent 送信成功 成功メッセージの緑色表示
.failed 送信失敗 エラーメッセージの赤色表示
.invalid バリデーションエラー 必須項目の未入力警告
/* 送信中: ボタンを半透明にしてクリック不可に */
.wpcf7-form.submitting .wpcf7-submit {
    opacity: 0.6;
    pointer-events: none;
}

/* 送信成功: メッセージを緑色で表示 */
.wpcf7-form.sent .wpcf7-response-output {
    border-color: #4caf50;
    background: #e8f5e9;
    color: #2e7d32;
}

/* 送信失敗: メッセージを赤色で表示 */
.wpcf7-form.failed .wpcf7-response-output {
    border-color: #e53935;
    background: #fce4ec;
    color: #c62828;
}

/* バリデーションエラー: メッセージをオレンジ色で表示 */
.wpcf7-form.invalid .wpcf7-response-output {
    border-color: #ff9800;
    background: #fff3e0;
    color: #e65100;
}

よくあるトラブルと対処法

症状 原因 対処法
CSSが反映されない テーマのCSSが優先されている セレクタの詳細度を上げる(例: .wpcf7 .wpcf7-form .wpcf7-submit)。それでも効かない場合は!importantを一時的に使って原因を特定
入力欄の幅がはみ出る box-sizing が未設定 box-sizing: border-box を入力フィールドに追加
レイアウトが崩れる CF7が自動挿入する<p> / <br>タグ 自動挿入を無効化する
スマホで入力欄がズームされる font-sizeが16px未満(iOS Safari) 入力フィールドの font-size16px 以上に設定
フォームが送信できない CSS/JS以外の設定の問題 送信できない時のチェックリストを参照

関連する記事

記事 内容
pタグとbrタグの自動挿入を削除する方法 HTMLレイアウトを壊す自動タグの無効化
プレースホルダーテキストを設定する方法 入力欄にヒントテキストを表示
宛先をカスタムフィールドから取得して動的に変更 フォーム送信先を動的に制御する方法
確認画面と完了画面を追加する方法 Multi-Step Formsプラグインの使い方
ユーザーの入力内容を加工して送信する方法 フィルターフックによるメール内容のカスタマイズ
送信できない時の原因と解決チェックリスト CF7の送信エラーを体系的にトラブルシュート
CF7 × キャッシュの原因と対処法 確認画面が前の入力のまま表示される問題の解決

まとめ

やりたいこと 方法
formタグにclassを追加 html_class="クラス名"(ショートコード属性)
formタグにidを追加 html_id="id名"(ショートコード属性)
入力フィールドにclass/id class:クラス名 / id:id名(タグオプション)
複数フォームのデザイン分け html_class でフォームごとに異なるクラスを付与
data属性の追加 do_shortcode_tag フィルター(functions.php)
送信状態でスタイルを変更 .submitting / .sent / .invalid クラスを利用

Contact Form 7のデザインカスタマイズは、html_class による基本的なクラス追加から始めて、CSSセレクタの活用 → PHPフィルターによる高度な制御へと段階的にステップアップできます。まずは html_class でフォームにクラスを付与し、CSSでスタイルを調整することから試してみてください。