WordPress 自建表单后端服务 (终极精简版)
本文档提供了搭建一个通用表单处理服务的最核心、最直接的步骤与代码。
第一步:核心插件准备
整个系统仅依赖以下两个核心插件,请在您的 WordPress 后台安装并启用它们。
- WPCode (或同类插件): (必需) 用于安全地添加下方的自定义 PHP 代码片段,是实现我们 API 接口的关键。
- WP Mail SMTP: (强烈推荐) 配置您的网站通过专业的 SMTP 服务发送邮件,确保每一封表单通知都能稳定、可靠地送达,避免被归为垃圾邮件。
第二步:添加后端 API 核心代码
使用 WPCode 插件,创建一个新的 PHP 代码片段,将下方**最终的完美代码**完整粘贴进去,并将顶部的邮箱地址修改为您自己的。这段代码会创建一个通用的 API 接口。
<?php
/**
* 注册一个通用的表单处理 REST API 接口。
*/
add_action( 'rest_api_init', function () {
register_rest_route( 'my-forms/v1', '/send/(?P<form_key>[a-zA-Z0-9_-]+)', array(
'methods' => 'POST',
'callback' => 'handle_generic_form_submission',
'permission_callback' => '__return_true'
) );
} );
/**
* 处理通用表单提交的回调函数。
*/
function handle_generic_form_submission( WP_REST_Request $request ) {
// --- 请在此处配置您的接收邮箱 ---
$recipient_email = 'your-email@example.com'; // !!!请务必修改成您的邮箱地址!!!
// --------------------------------
$form_key = $request->['form_key'];
$form_data = $request->get_body_params();
if ( empty( $form_data ) ) {
return new WP_REST_Response( array( 'message' => '未收到任何表单数据。API接口工作正常,正在等待POST请求。' ), 400 );
}
$subject = sprintf( '来自网站“%2$s”的新表单提交:%1$s', $form_key, get_bloginfo( 'name' ) );
$message_body = '<p>您好,您收到一份新的表单提交。详细内容如下:</p>';
$message_body .= '<table border="1" cellpadding="10" style="border-collapse: collapse; width: 100%;">';
$message_body .= '<thead><tr><th style="background-color: #f2f2f2; text-align: left;">项目</th><th style="background-color: #f2f2f2; text-align: left;">提交内容</th></tr></thead>';
$message_body .= '<tbody>';
foreach ( $form_data as $key => $value ) {
if ( $key === '_redirect_url' ) {
continue;
}
$clean_key = htmlspecialchars( stripslashes( $key ) );
$clean_value = nl2br( htmlspecialchars( stripslashes( is_array($value) ? implode(', ', $value) : $value ) ) );
$message_body .= "<tr><td><strong>{$clean_key}</strong></td><td>{$clean_value}</td></tr>";
}
$message_body .= '</tbody></table>';
$headers = array('Content-Type: text/html; charset=UTF-8');
$reply_to_email = '';
if (isset($form_data['email'])) {
$reply_to_email = sanitize_email($form_data['email']);
} elseif (isset($form_data['your-email'])) {
$reply_to_email = sanitize_email($form_data['your-email']);
}
if ($reply_to_email) {
$headers[] = 'Reply-To: ' . $reply_to_email;
}
$sent = wp_mail( $recipient_email, $subject, $message_body, $headers );
if ( $sent ) {
$redirect_url = !empty($form_data['_redirect_url']) ? esc_url_raw($form_data['_redirect_url']) : null;
if ($redirect_url) {
$response = new WP_REST_Response( array('message' => '提交成功。页面即将跳转...') );
$response->set_status(302);
$response->header('Location', $redirect_url);
return $response;
}
return new WP_REST_Response( array( 'message' => '您的信息已成功提交,感谢您的反馈!' ), 200 );
} else {
return new WP_REST_Response( array( 'message' => '邮件发送失败。烦请网站管理员检查服务器邮件配置。' ), 500 );
}
}
第三步:配置服务器与安全策略
- 刷新固定链接 (解决404): 在 WordPress 后台 -> “设置” -> “固定链接”,直接点击“保存更改”,以激活新的 API 地址。
- 配置防火墙白名单 (解决拦截): 如果使用宝塔面板等防火墙,请在“URL白名单”中添加规则
^/wp-json/my-forms/v1/send/.*
,以允许表单请求通过。
(可选进阶) CORS 跨域安全策略: 如需限制只允许特定域名提交,请使用 WPCode 添加以下 PHP 代码片段。
add_action( 'rest_api_init', function () {
remove_filter( 'rest_pre_serve_request', 'rest_send_cors_headers' );
add_filter( 'rest_pre_serve_request', function( $value ) {
// !!! 在此数组中添加您允许的静态网站域名 !!!
$allowed_origins = [
'https://www.your-static-site.com',
'http://localhost:8080' // 本地测试地址
];
$origin = get_http_origin();
if ( $origin && in_array( $origin, $allowed_origins ) ) {
header( 'Access-Control-Allow-Origin: ' . esc_url_raw( $origin ) );
header( 'Access-Control-Allow-Methods: POST' );
header( 'Access-Control-Allow-Credentials: true' );
}
return $value;
});
}, 15 );
第四步:前端 HTML 表单书写规范
在您的任何静态 HTML 页面中,都可以使用下方的表单模板。它包含了实现**无刷新异步提交**的全部代码。
- 将
action
属性中的 URL 替换为您自己的,并自定义末尾的form-key
。 - 表单字段的
name
属性可以任意修改和增删。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>联系我们</title>
<style>
#form-status { margin-top: 15px; padding: 10px; border-radius: 5px; display: none; }
.success { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; }
.error { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }
</style>
</head>
<body>
<h3>给我们留言</h3>
<form id="contact-form" action="https://your-domain.com/wp-json/my-forms/v1/send/contact-form-inquiry" method="POST">
<div>
<label for="fullname">您的姓名:</label><br>
<input type="text" id="fullname" name="Full_Name" required>
</div>
<br>
<div>
<label for="email">您的邮箱:</label><br>
<input type="email" id="email" name="email" required>
</div>
<br>
<div>
<label for="details">留言内容:</label><br>
<textarea id="details" name="Details" rows="5" required></textarea>
</div>
<br>
<button type="submit" id="submit-button">发送消息</button>
</form>
<div id="form-status"></div>
<script>
const form = document.getElementById('contact-form');
const statusDiv = document.getElementById('form-status');
const submitButton = document.getElementById('submit-button');
form.addEventListener('submit', function(event) {
event.preventDefault();
submitButton.disabled = true;
submitButton.textContent = '发送中...';
statusDiv.style.display = 'block';
statusDiv.className = '';
statusDiv.textContent = '正在发送...';
const formData = new FormData(form);
const actionURL = form.getAttribute('action');
fetch(actionURL, {
method: 'POST',
body: formData,
})
.then(response => {
if (response.ok) return response.json();
throw new Error('服务器响应失败。');
})
.then(data => {
statusDiv.className = 'success';
statusDiv.textContent = data.message || '消息发送成功!';
form.reset();
})
.catch(error => {
statusDiv.className = 'error';
statusDiv.textContent = '发送失败,请稍后重试。';
})
.finally(() => {
submitButton.disabled = false;
submitButton.textContent = '发送消息';
});
});
</script>
</body>
</html>