contact form 7 で確認画面を追加してつまった話

`contact form 7`で確認画面の実装に`contact form 7 add confirm`を使用したときにつまったところをまとめておきます。

チェックボックスをオリジナルデザインで実装していると、確認をしたときに選択されていないようになってしまう
（実際には選択されているが、隠れてしまっている）ので、その解決策をまとめておきます。
こんな感じで選択されていないようになってしまったときの解決方法。
![af1efeab8a0aed4f54e72921534f21cb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/1387da58-c1fe-14d7-ba5f-f607a32ebb7a.gif)


#前提

・`contact form 7 add confirm`を使用
・チェックボックスを使用

では`contact form 7`でチェックボックスを作成するところから順番に説明していきます。

# チェックボックスの作成
まずは、`contact form 7`の初期画面です。
![4359b9187bc47fe3b1bd41bcfad4e2a0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/c9e19a3d-9f23-4b4e-815b-c142188577e8.png)

チェックボックスを追加します。
![8141c75eeebd3a9ae89ef86f2e0e8ab8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/e216f3e9-aca8-f38c-b9d6-ab4d580895c8.png)

追加されたのを確認して、保存します。
![271cff2286289f1bf35d4edb9b17e1f3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/419e76e0-8aca-8e43-72d2-d4d5c1fb7ab6.png)

こんな感じで動作します。
![989a2d7539c1e3f9832f042c68308a68.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/e611c054-3959-4679-548f-c89893d826ee.gif)

#contact form 7 add confirmで確認画面を追加
こちらのプラグインをインストールします。
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/2a0500c7-7cd9-4297-6865-12ade898e0c4.png)


追加すると画面にこのように追加されます。
![964e07778aa59e683c7c3cff9117bdc8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/cb315b40-2cba-1278-a580-74700cedea16.png)

下記のように追加して、表示をみてみましょう。
![2256e8d5fe87ec3b602b70b66f9c6bbe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/17598cad-f2ab-f043-0abe-b5666c095795.png)

このように動作します。
![cb426c732f4dab01bbcc8da5b90d6fb5 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/9ecb145a-3611-bd86-b854-5cdf5403a0fd.gif)

#チェックボックスにオリジナルのCSSを当てた時の対処方法
このように非常に簡単に、確認画面が実装できるんですよね。
でも、ここからが本題になりますがチェックボックスにオリジナルのデザインをあてたときに確認を押すと
選択されていないようになっていました。

![af1efeab8a0aed4f54e72921534f21cb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/1387da58-c1fe-14d7-ba5f-f607a32ebb7a.gif)

これだと、
「入力したはずなのに消えてしまっている、もう一回やるか。あれ、また消えてる、、無限ループ」
となってしまいますよね。

これが何が起きているかを、検証画面で確認しました。

■入力した時のバナナの項目
![7f48be3f68d1f8d95adb130a32351138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/fa4e223a-8fd8-c210-8e2d-8de0a546af60.png)

■確認した時のバナナの項目
![7cc21ea6b316c75f383a04bd82e16d1d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/4a838baa-390e-7e24-3c5f-2e3408e236ad.png)
見ていただいて分かる通り、`input`タグが追加されていますね。

これが悪さをしているのですが、選択したときにチェックボックスを当てるCSSを確認すると下記のように書いていました。

```style.css
input[type="checkbox"]:checked + .wpcf7-list-item-label:after {/*チェックアイコン*/
  content: "";
  display: block;
  position: absolute;
  top: -2px;
  left: 16px;
  width: 20px;
  height: 20px;
  background: url(../../assets/check.png) no-repeat center;
}

```

ふむふむ、`input[type="checkbox"]:checked + .wpcf7-list-item-label:after `が怪しいですね。
この`＋`というのは、隣接セレクタといい直後に隣接している要素にスタイルを適用するようです。

なので、下記のように`input`タグが自動で生成されてしまうと直後の隣接している要素がかわってしまうということですね。
この場合だと、最初は`span`タグが直後だったが、`input`タグが直後になってしまったということです。
![7cc21ea6b316c75f383a04bd82e16d1d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/4a838baa-390e-7e24-3c5f-2e3408e236ad.png)

なので、直後の隣接している要素の指定から、`~`に書き換えてあげましょう！
`説明:E ~ F …… E要素の後ろにある同じ階層のF要素`
http://www.htmq.com/selector/precede.shtml

書き換えたコードがこちら

```style.css
input[type="checkbox"]:checked ~ .wpcf7-list-item-label:after {/*チェックアイコン*/
  content: "";
  display: block;
  position: absolute;
  top: -2px;
  left: 16px;
  width: 20px;
  height: 20px;
  background: url(../../assets/check.png) no-repeat center;
}
```

上記のように書き換えることで、このように確認画面を押しても、選択された状態が保っているのが確認とれるようになります。

![22d17823912d746e9005043cd860a38b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/d959e1be-6727-71bc-6c26-1a5b4db3aa28.gif)


#まとめ
プラグインを使用するときは、自動で生成されるコードがあることを理解して検証画面を確認することが大切ですね。


※本記事で使用したコードはこちらを参考にさせていただきました。めちゃくちゃわかりやすいので見てみてください。
https://yuyauver98.me/contactform7-checkbox-customize/