我早期为企业站写过一个留言表单项目,支持后台查看和邮箱通知。原始仓库现在是非公开的历史项目,不能把当年的实现当成可安装、可维护的公开插件。下面重新整理一个生产表单真正需要考虑的边界。
表单不只是 wp_mail()
完整流程包括:
- 浏览器提交姓名、邮箱、主题和留言。
- 服务端验证来源、字段、频率和权限。
- 保存最少必要数据,或直接进入受控工单系统。
- 发送通知邮件,并记录可诊断但不泄露正文的结果。
- 向用户返回不暴露内部信息的成功/失败状态。
- 按隐私政策保留、导出和删除数据。
最小表单
<form
method="post"
action="<?php echo esc_url(
admin_url( 'admin-post.php' )
); ?>"
>
<input
type="hidden"
name="action"
value="site_contact"
>
<?php wp_nonce_field( 'site_contact', 'site_contact_nonce' ); ?>
<label>
姓名
<input name="name" autocomplete="name" required>
</label>
<label>
邮箱
<input
name="email"
type="email"
autocomplete="email"
required
>
</label>
<label>
留言
<textarea name="message" required></textarea>
</label>
<button type="submit">发送</button>
</form>
nonce 用于降低跨站请求伪造风险,不是反垃圾验证码,也不能证明提交者是人。
服务端处理
<?php
add_action(
'admin_post_nopriv_site_contact',
'site_handle_contact'
);
add_action(
'admin_post_site_contact',
'site_handle_contact'
);
function site_handle_contact(): void {
check_admin_referer(
'site_contact',
'site_contact_nonce'
);
$name = isset( $_POST['name'] )
? sanitize_text_field(
wp_unslash( $_POST['name'] )
)
: '';
$email = isset( $_POST['email'] )
? sanitize_email(
wp_unslash( $_POST['email'] )
)
: '';
$message = isset( $_POST['message'] )
? sanitize_textarea_field(
wp_unslash( $_POST['message'] )
)
: '';
if (
'' === $name ||
! is_email( $email ) ||
'' === $message
) {
wp_safe_redirect(
add_query_arg(
'contact',
'invalid',
home_url( '/contact/' )
)
);
exit;
}
$subject = sprintf(
'网站留言:%s',
$name
);
$headers = array(
sprintf(
'Reply-To: %s <%s>',
$name,
$email
),
);
$sent = wp_mail(
get_option( 'admin_email' ),
$subject,
$message,
$headers
);
wp_safe_redirect(
add_query_arg(
'contact',
$sent ? 'sent' : 'failed',
home_url( '/contact/' )
)
);
exit;
}
这只是流程骨架。生产环境还必须增加频率限制、蜜罐或验证码、最大长度、日志与告警。高风险站点应使用成熟表单/反垃圾方案,不要自行发明一套简单 IP 黑名单。
邮件送达
访客邮箱应该放在 Reply-To,From 使用自己已验证的站点域名。否则 SPF、DKIM 和 DMARC 对不齐,邮件容易进入垃圾箱或被拒绝。
wp_mail() 返回 true 只代表邮件组件接受了发送请求,不代表对方邮箱已经收到。重要表单应使用可靠邮件服务,记录 provider message ID 和退信,并为发送失败保留后台待处理记录。
数据与隐私
- 只收集完成回复所需字段。
- 在表单旁说明用途、保存期限和隐私政策。
- 正文可能包含手机号、邮箱等个人信息,不写进普通应用日志。
- 后台列表需要 capability、nonce、分页与输出转义。
- CSV 导出属于敏感操作,应限制权限并记录。
- 制定删除、导出、垃圾留言和备份保留规则。
反垃圾、可靠送达和隐私合规会持续变化。对公共站点,维护中的表单插件加受控邮件服务通常比一段多年不变的自定义 PHP 更可靠。