wordpress自建表单后端服务API完整流程指南 -超越formspree的完美方案

指南:使用 WordPress 自建表单后端服务 (精简版)

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>

总结完毕。遵循以上精简步骤,即可将任何 WordPress 网站,转变为一个强大的私有表单处理中心。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部