Contactform7でチェックボックスにBootstrap4のボタンデザインを適用する

Contactform7でチェックボックスにBootstrap4のボタンデザインを適用する場合に2時間くらいハマったのでメモ。

https://getbootstrap.com/docs/4.4/components/buttons/#checkbox-and-radio-buttons

まずは完成形。

Contactform7でのフォームに入力

<div class="form-group">
   <label class="col control-label">チェックボックス</label>
      <div class="col">
        [checkbox naiyo use_label_element "チェックボックス1" "チェックボックス2" "チェックボックス3"]
      </div>
</div>

Javascriptに追加
ボタン(.btn-secondary、.btn-success)はお好きなものに。

  $('.wpcf7-checkbox > .wpcf7-list-item, .wpcf7-radio > .wpcf7-list-item')
    .addClass('btn-group-toggle')
    .attr('data-toggle', 'buttons');
  $('.wpcf7-form input[type=checkbox], .wpcf7-form input[type=radio]')
    .closest('label')
    .addClass('btn btn-secondary');
  $('label.btn.active')
    .removeClass('btn-secondary')
    .addClass('btn-success');
  $('.wpcf7-list-item-label').on('click', function () {
    if ($(this).parent().hasClass('active')) {
       $(this).parent().removeClass('active');
    } else {
      $(this).parent().addClass('active');
    }
  });

ハマった理由は、Contactform7ではラベルのテキストがスパンで囲まれているのだが、
そうすると、テキスト部分(.wpcf7-list-item-label)がクリックで反応してくれない。外周部分は反応する。
まず、テキスト部分だけが反応しないことがわからなかった。

<div class="form-group">
  <label class="col control-label">チェックボックス</label>
  <div class="col">
    <span class="wpcf7-form-control-wrap naiyo">
      <span class="wpcf7-form-control wpcf7-checkbox">
        <span class="wpcf7-list-item first btn-group-toggle" data-toggle="buttons">
          <label class="btn btn-secondary">
            <input type="checkbox" name="naiyo[]" value="チェックボックス1">
            <span class="wpcf7-list-item-label">チェックボックス1</span>
          </label>
        </span>
        <span class="wpcf7-list-item btn-group-toggle" data-toggle="buttons">
          <label class="btn btn-secondary">
            <input type="checkbox" name="naiyo[]" value="チェックボックス2">
            <span class="wpcf7-list-item-label">チェックボックス2</span>
          </label>
        </span>
        <span class="wpcf7-list-item last btn-group-toggle" data-toggle="buttons">
          <label class="btn btn-secondary">
            <input type="checkbox" name="naiyo[]" value="チェックボックス3">
            <span class="wpcf7-list-item-label">チェックボックス3</span>
          </label>
        </span>
      </span>
    </span>
  </div>
</div>

テキスト部分をクリックしても、ボタンを押した場合と同じようにactiveが付与されるようにする。

  $('.wpcf7-list-item-label').on('click', function () {
    if ($(this).parent().hasClass('active')) {
       $(this).parent().removeClass('active');
    } else {
      $(this).parent().addClass('active');
    }
  });