WordPress でメールフォームから送信されたデータを元に、自動で投稿を作成したい案件があり、調べてみたら Contact Form 7 を使うと実装できることがわかりました。

ContactForm7のフォーム送信時に自動でブログ記事を作成する方法

Contact Form 7 で用意されているフック「wpcf7_mail_sent」を利用して投稿を作成できるというもので、カスタムフィールドの値も登録することができ、まさに実現したい仕様でしたが、今回、Advanced Custom Fields (ACF) プラグインのグループフィールドのサブフィールドにもデータを登録する必要がありました。

そこで、次の記事を参考にして、上記の方法と組み合わせることで実現することができました。

【WordPress】PHPプログラムからAdvanced Custom Fieldsの繰り返しフィールドに値を保存する方法 – 上尾市のWEBプログラマーによるブログ

更に、Contact Form 7 Serial Numbers プラグインによる連番も取得してカスタムフィールドに反映してみました。

// フォーム送信時にブログ投稿をおこなう
function wpcf7_insert_post(){

  // 送信情報を取得
  $submission = WPCF7_Submission::get_instance();
  if($submission) {
    $formdata = $submission->get_posted_data();

    // cf7_serial_number の値を3桁にして取得
    $formid = $submission->get_contact_form()->id();
    $serialnumber = sprintf('%03d', get_option('nklab_wpcf7sn_count_'. $formid));

    // 投稿を作成
    $new_post = array(
      'post_type' => 'post',
      'post_title' => $formdata['your_title'],
      'post_content' => $formdata['your_content'],
      'post_status' => 'draft'  // 下書きで保存
    );
    $post_id = wp_insert_post($new_post);

    // 作成に成功した場合
    if(!is_wp_error($post_id)) {

    // カスタムフィールドのデータを登録する
      update_post_meta($post_id, 'custom_number', $serialnumber);  // 連番
      update_post_meta($post_id, 'custom_field1', $formdata['your_field1']);
      update_post_meta($post_id, 'custom_field2', $formdata['your_field2']);
      update_post_meta($post_id, 'custom_field3', $formdata['your_field3']);

      // グループフィールド(5つのサブフィールド)
      update_post_meta($post_id, 'custom_group', 5);
      update_post_meta($post_id, 'custom_group_sub_field1', $formdata['your_field4']);
      update_post_meta($post_id, 'custom_group_sub_field2', $formdata['your_field5']);
      update_post_meta($post_id, 'custom_group_sub_field3', $formdata['your_field6']);
      update_post_meta($post_id, 'custom_group_sub_field4', $formdata['your_field7']);
      update_post_meta($post_id, 'custom_group_sub_field5', $formdata['your_field8']);
    }
  }
}
add_action('wpcf7_mail_sent', 'wpcf7_insert_post', 10, 1);

先の「ContactForm7のフォーム送信時に自動でブログ記事を作成する方法」の記事では、カスタムフィールドのデータを登録する部分で add_post_meta が使用されていますが、今回 ACF で既に用意されたカスタムフィールドにデータを登録するので、update_post_meta としています。

そして、以下の記述でグループフィールドのサブフィールドにデータを登録することができました。

update_post_meta($post_id, グループフィールドのフィールド名, サブフィールドの件数);
update_post_meta($post_id, グループフィールドのフィールド名_サブフィールドのフィールド名, 登録するデータ);
(サブフィールドの件数分繰り返し)

(2020年7月15日訂正)
上記コード10行目のフォームIDの取得の記述を $formid = $data['_wpcf7']; としていましたが、Contact Form 7 ver.5.2 で取得できなくなりましたので、$formid = $submission->get_contact_form()->id(); に変更しました。