Contact Form 7のメール設定で、「空のメールタグを含む行を出力から除外する」にチェックを入れると、未入力の項目の行はメール本文から除外されます。

ただ、チェックボックスなどの複数選択ができる項目では、未入力でも値が空と判定されないためメールから除外されません(値に空の配列が入るためです)。「お問い合わせ種別:[contact_type]」といったメールタグがそのまま送られてしまいます。

そこで今回は、任意入力でかつ複数選択可能な項目が未入力の時に、メール本文から対象の行を除外する方法をご紹介いたします。

「空のメールタグを含む行を出力から除外する」にチェックを入れてもメールか除外されない場合の対処法

対象の項目が1つの場合

例えば、”contact_type”という項目が未入力の時に除外したいとします。その場合、適用しているテーマのfunctions.phpや自作プラグイン、スニペット系のプラグインで以下のように記述します。

‘contact_type’のところは適宜変更してください。

add_filter('wpcf7_mail_components', function ($components, $contact_form) {
  $submission = WPCF7_Submission::get_instance();
  if (! $submission) {
    return $components;
  }
  $posted_data = $submission->get_posted_data();
  $body = $components['body'];
  $checkbox_tag = 'contact_type';
  if (empty($posted_data[$checkbox_tag])) {
    $body = preg_replace(
      '/^.*\[' . preg_quote($checkbox_tag, '/') . '\].*\R?/m',
      '',
      $body
    );
  }
  $components['body'] = $body;
  return $components;
}, 10, 2);

対象の項目が複数ある場合

“contact_type” “contact_find” “contact_etc” というように、対象の項目が複数ある場合は、以下のように記述します。

add_filter('wpcf7_mail_components', function ($components, $contact_form) {
  $submission = WPCF7_Submission::get_instance();
  if (! $submission) {
    return $components;
  }
  $posted_data = $submission->get_posted_data();
  $body = $components['body'];
  $checkbox_tags = array('contact_type', 'contact_find', 'contact_etc');
  foreach ($checkbox_tags as $tag) {
    if (empty($posted_data[$tag])) {
      $body = preg_replace(
        '/^.*\[' . preg_quote($tag, '/') . '\].*\R?/m',
        '',
        $body
      );
    }
  }
  $components['body'] = $body;
  return $components;
}, 10, 2);

あとがき

フォーム内のチェックボックスは必須にすることが多いと思いますが、任意入力でかつ未入力の時にメールから除外したい場合は、ぜひ参考にしていただければと思います。

投稿者

himecasのアバター

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Table of Contents