使用Golang作为后端搭配WordPress前端的实现方法

使用Golang作为后端搭配WordPress前端的实现方法 我想使用WordPress及其插件、主题等来构建所有前端部分,但仅限于前端,后端则应该使用Go语言。我查阅了这里的文档: https://codex.wordpress.org/Developer_Documentation

但我有点迷失方向,我具体应该从哪里开始?是否有任何教程能告诉我,在后端(使用Go)我将接收到哪些类型的输入,以及如何处理它们?

3 回复

一个半开玩笑的回答:使用 FrankenPHP,这是一个用 Go 编写的 PHP 应用服务器。任务完成。stuck_out_tongue_winking_eye

更多关于使用Golang作为后端搭配WordPress前端的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


看起来你正在使用 PHP 来搭建服务器,但遗憾的是,PHP 是一种前端和后端语言。 粗略地看了一下,你可能需要为活动请求的 GO 后端编写一个插件或类似的东西,例如你请求 GO 来监听的 HTTP 服务。 如果你使用 Go 作为后端,这并不是一个很好的解决方案,而且对接成本似乎有点高?(或者这可能只是我的猜测,我实际上并没有参与过这类操作。)

要实现WordPress前端与Go后端的分离架构,关键在于通过WordPress的REST API进行数据交互。以下是具体实现方案:

1. WordPress端配置

首先在WordPress中启用并配置REST API:

// 在主题的functions.php中添加
add_action('rest_api_init', function() {
    // 注册自定义端点或修改现有端点
    register_rest_route('custom/v1', '/data/', array(
        'methods' => 'GET',
        'callback' => 'get_custom_data',
        'permission_callback' => '__return_true'
    ));
});

function get_custom_data($request) {
    // 这里可以处理WordPress端的数据逻辑
    return rest_ensure_response(array('message' => '来自WordPress的数据'));
}

2. Go后端接收和处理WordPress请求

创建Go服务来处理WordPress的API请求:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/mux"
)

type WordPressRequest struct {
    PostID    int    `json:"post_id"`
    Action    string `json:"action"`
    Data      map[string]interface{} `json:"data"`
}

type APIResponse struct {
    Status  string      `json:"status"`
    Data    interface{} `json:"data"`
    Message string      `json:"message"`
}

func main() {
    r := mux.NewRouter()
    
    // 处理WordPress发来的POST请求
    r.HandleFunc("/api/wordpress", handleWordPressRequest).Methods("POST")
    
    // 提供数据给WordPress前端
    r.HandleFunc("/api/data", getDataForWordPress).Methods("GET")
    
    log.Println("Go后端服务启动在 :8080")
    log.Fatal(http.ListenAndServe(":8080", r))
}

func handleWordPressRequest(w http.ResponseWriter, r *http.Request) {
    var req WordPressRequest
    
    // 解析WordPress发送的JSON数据
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        sendErrorResponse(w, "无效的请求数据", http.StatusBadRequest)
        return
    }
    
    // 根据action处理不同请求
    switch req.Action {
    case "create_post":
        handleCreatePost(req.Data)
    case "update_user":
        handleUpdateUser(req.Data)
    case "process_form":
        handleFormSubmission(req.Data)
    default:
        sendErrorResponse(w, "未知的操作类型", http.StatusBadRequest)
        return
    }
    
    // 返回成功响应
    response := APIResponse{
        Status:  "success",
        Message: "请求处理成功",
        Data:    map[string]interface{}{"received_id": req.PostID},
    }
    
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(response)
}

func getDataForWordPress(w http.ResponseWriter, r *http.Request) {
    // 从Go后端获取数据,供WordPress前端显示
    data := map[string]interface{}{
        "posts": []map[string]interface{}{
            {"id": 1, "title": "Go生成的文章1", "content": "这是来自Go后端的内容"},
            {"id": 2, "title": "Go生成的文章2", "content": "另一篇Go后端内容"},
        },
        "stats": map[string]int{
            "total_users": 150,
            "active_posts": 45,
        },
    }
    
    response := APIResponse{
        Status: "success",
        Data:   data,
    }
    
    w.Header().Set("Content-Type", "application/json")
    w.Header().Set("Access-Control-Allow-Origin", "*") // CORS设置
    json.NewEncoder(w).Encode(response)
}

func handleCreatePost(data map[string]interface{}) {
    // 处理创建文章的逻辑
    fmt.Printf("创建文章: %v\n", data)
}

func handleFormSubmission(data map[string]interface{}) {
    // 处理表单提交
    fmt.Printf("表单数据: %v\n", data)
}

func sendErrorResponse(w http.ResponseWriter, message string, statusCode int) {
    response := APIResponse{
        Status:  "error",
        Message: message,
    }
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(statusCode)
    json.NewEncoder(w).Encode(response)
}

3. WordPress前端调用Go API

在WordPress主题或插件中调用Go后端:

// 在WordPress中调用Go后端API
function fetch_data_from_go_backend() {
    $go_api_url = 'http://localhost:8080/api/data';
    
    $response = wp_remote_get($go_api_url, array(
        'timeout' => 30,
        'headers' => array(
            'Content-Type' => 'application/json',
        )
    ));
    
    if (is_wp_error($response)) {
        error_log('调用Go API失败: ' . $response->get_error_message());
        return false;
    }
    
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);
    
    return $data['data'] ?? array();
}

// 发送数据到Go后端
function send_data_to_go_backend($action, $data) {
    $go_api_url = 'http://localhost:8080/api/wordpress';
    
    $payload = array(
        'action' => $action,
        'data' => $data,
        'timestamp' => current_time('timestamp')
    );
    
    $response = wp_remote_post($go_api_url, array(
        'timeout' => 30,
        'headers' => array(
            'Content-Type' => 'application/json',
        ),
        'body' => json_encode($payload)
    ));
    
    return !is_wp_error($response);
}

4. 使用Vue.js/React与Go后端交互示例

// 在WordPress主题中使用JavaScript调用Go API
async function fetchGoData() {
    try {
        const response = await fetch('http://localhost:8080/api/data');
        const result = await response.json();
        
        if (result.status === 'success') {
            // 使用Go返回的数据更新页面
            displayPosts(result.data.posts);
            updateStats(result.data.stats);
        }
    } catch (error) {
        console.error('调用Go API失败:', error);
    }
}

async function submitToGoBackend(action, formData) {
    const payload = {
        action: action,
        data: formData
    };
    
    const response = await fetch('http://localhost:8080/api/wordpress', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(payload)
    });
    
    return await response.json();
}

5. Go与WordPress数据库交互

如果需要Go直接操作WordPress数据库:

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
)

type WordPressDB struct {
    db *sql.DB
}

func NewWordPressDB(dsn string) (*WordPressDB, error) {
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        return nil, err
    }
    
    return &WordPressDB{db: db}, nil
}

func (w *WordPressDB) GetPost(postID int) (map[string]interface{}, error) {
    query := `
        SELECT ID, post_title, post_content, post_date 
        FROM wp_posts 
        WHERE ID = ? AND post_status = 'publish'
    `
    
    row := w.db.QueryRow(query, postID)
    
    var id int
    var title, content, date string
    
    err := row.Scan(&id, &title, &content, &date)
    if err != nil {
        return nil, err
    }
    
    return map[string]interface{}{
        "id":      id,
        "title":   title,
        "content": content,
        "date":    date,
    }, nil
}

func (w *WordPressDB) CreateUser(username, email string) error {
    query := `INSERT INTO wp_users (user_login, user_email, user_registered) VALUES (?, ?, NOW())`
    _, err := w.db.Exec(query, username, email)
    return err
}

关键配置要点:

  1. CORS配置:确保Go后端设置正确的CORS头,允许WordPress域名的请求
  2. 认证机制:实现JWT或API密钥验证,确保通信安全
  3. 数据同步:确定哪些数据由Go管理,哪些由WordPress管理
  4. 错误处理:实现统一的错误响应格式
  5. 性能优化:使用Redis缓存频繁访问的数据

这种架构下,WordPress负责内容展示和用户界面,Go处理业务逻辑、高性能计算和数据处理,两者通过HTTP API进行通信。

回到顶部