/**
* フォームからのAJAXリクエストを処理する汎用関数
*/
add_action('wp_ajax_custom_form_action', 'handle_custom_form_submission');
add_action('wp_ajax_nopriv_custom_form_action', 'handle_custom_form_submission');
function handle_custom_form_submission() {
// --- ▼▼ 設定はここから ▼▼ ---
// 1. Submissionsに表示されるフォーム名
$form_name = 'サイトからのお問い合わせ';
// 2. あなたが通知を受け取る管理者メールアドレス
$admin_email_to = 'your-email@example.com';
// 3. ユーザーへの自動返信メールの送信元情報
$from_name = '私のサイト名';
$from_email = 'info@example.com';
// 4. ユーザーへの自動返信メールに記載する署名
$signature = "---
株式会社○○○○
〒000-0000 ○○県○○町123
TEL: 000-000-0000
FAX: 000-000-0000
MAIL: info@example.com
---";
// 5. 送信完了後に表示するサンクスページのURL
$redirect_url = '/thank-you/';
// --- ▲▲ 設定はここまで ▲▲ ---
// 独自のNonce(セキュリティトークン)を検証
if (!isset($_POST['custom_nonce']) || !wp_verify_nonce($_POST['custom_nonce'], 'custom_form_nonce_action')) {
wp_send_json_error(['message' => 'Custom nonce verification failed.'], 403);
return;
}
// JavaScriptから送られてきたデータを整理
$form_data_raw = isset($_POST['form_data']) ? $_POST['form_data'] : [];
$field_labels_raw = isset($_POST['field_labels']) ? $_POST['field_labels'] : [];
// ユーザーが入力したデータと、Elementorの内部データを分離
$user_data = [];
$meta_data = [];
foreach ($form_data_raw as $field) {
if (strpos($field['name'], 'form_fields[') === 0) {
$key = str_replace(['form_fields[', ']'], '', $field['name']);
$user_data[$key] = sanitize_textarea_field($field['value']);
} else {
$meta_data[$field['name']] = sanitize_text_field($field['value']);
}
}
$field_labels = [];
foreach ($field_labels_raw as $key => $label) {
$field_labels[sanitize_key($key)] = sanitize_text_field($label);
}
// --- アクション1: データベースに保存 (Submissions) ---
global $wpdb;
$submission_table = $wpdb->prefix . 'e_submissions';
$values_table = $wpdb->prefix . 'e_submissions_values';
$hash_id = md5(wp_generate_uuid4());
$wpdb->insert(
$submission_table,
[
'form_name' => $form_name,
'post_id' => isset($meta_data['post_id']) ? $meta_data['post_id'] : 0,
'user_ip' => $_SERVER['REMOTE_ADDR'],
'user_agent' => $_SERVER['HTTP_USER_AGENT'],
'created_at_gmt' => current_time('mysql', 1),
'updated_at_gmt' => current_time('mysql', 1),
'status' => 'new',
'user_id' => get_current_user_id(),
'hash_id' => $hash_id,
'actions_count' => 3,
'actions_succeeded_count' => 3,
]
);
$submission_id = $wpdb->insert_id;
if ($submission_id) {
foreach ($user_data as $key => $value) {
$wpdb->insert($values_table, ['submission_id' => $submission_id, 'key' => $key, 'value' => $value]);
}
if (isset($user_data['email'])) {
$main_meta_value_id = $wpdb->get_var($wpdb->prepare(
"SELECT id FROM {$values_table} WHERE submission_id = %d AND `key` = 'email'",
$submission_id
));
if ($main_meta_value_id) {
$wpdb->update(
$submission_table,
['main_meta_id' => $main_meta_value_id],
['id' => $submission_id]
);
}
}
}
// --- アクション2: メール送信 ---
$email_from = isset($user_data['email']) ? $user_data['email'] : '';
$admin_body = '';
foreach ($user_data as $key => $value) {
$label = isset($field_labels[$key]) ? $field_labels[$key] : $key;
$admin_body .= "【{$label}】\n{$value}\n\n";
}
// 管理者宛メール
$admin_subject = 'ウェブサイトから新しい問い合わせがありました';
$admin_headers = [];
$admin_headers[] = 'From: ' . $from_name . ' <' . $from_email . '>';
if (!empty($email_from)) {
$admin_headers[] = 'Reply-To: ' . $email_from;
}
wp_mail($admin_email_to, $admin_subject, $admin_body, $admin_headers);
// ユーザーへの自動返信メール
if (!empty($email_from)) {
$user_subject = 'お問い合わせありがとうございます';
$user_body = "お問い合わせいただき、誠にありがとうございます。\n\n以下の内容で受け付けました。\n-------------------\n{$admin_body}\n-------------------\n\n" . $signature;
$user_headers = ['From: ' . $from_name . ' <' . $from_email . '>';
wp_mail($email_from, $user_subject, $user_body, $user_headers);
}
wp_send_json_success(['redirect_url' => $redirect_url]);
wp_die();
}
/**
* JavaScriptにAJAX通信用の情報を渡す関数
*/
add_action('wp_footer', 'my_add_ajax_url_to_footer');
function my_add_ajax_url_to_footer() {
$nonce = wp_create_nonce('custom_form_nonce_action');
echo '<script>const myAjax = { url: "' . admin_url('admin-ajax.php') . '", nonce: "' . $nonce . '" };</script>';
}