You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WP REST API发起订单,让WooCommerce Lottery插件自动分配彩票号码?

解决WooCommerce Lottery通过WP REST API创建订单时的彩票号码分配问题

核心原因

直接调用标准WooCommerce REST API创建订单时,不会触发WooCommerce Lottery插件内置的彩票号码分配逻辑——这些逻辑通常绑定在前端购票流程的专属钩子(如woocommerce_checkout_order_processed)上,API创建订单的默认流程不会自动触发这些钩子。

解决方案步骤

1. 自定义REST API端点(推荐方案)

扩展WP REST API,创建专门处理彩票订单的自定义端点,在端点内部主动调用插件的号码分配逻辑。

示例代码(添加到主题functions.php或自定义插件中):

add_action('rest_api_init', function () {
    register_rest_route(
        'lottery/v1',
        '/create-order',
        array(
            'methods' => 'POST',
            'callback' => 'create_lottery_order_via_api',
            'permission_callback' => function () {
                // 可添加API密钥验证等权限逻辑,示例仅验证管理员权限
                return current_user_can('manage_woocommerce');
            }
        )
    );
});

function create_lottery_order_via_api(WP_REST_Request $request) {
    // 提取请求参数
    $params = $request->get_params();
    $product_id = $params['product_id'] ?? 0;
    $quantity = $params['quantity'] ?? 1;
    $user_id = $params['user_id'] ?? get_current_user_id();

    // 验证彩票产品有效性
    $product = wc_get_product($product_id);
    if (!$product || $product->get_type() !== 'lottery') {
        return new WP_REST_Response('无效的彩票产品ID', 400);
    }

    // 构建订单基础数据
    $order_data = array(
        'status' => 'processing',
        'customer_id' => $user_id,
        'line_items' => array(
            array(
                'product_id' => $product_id,
                'quantity' => $quantity
            )
        ),
        // 按需添加账单、配送信息等字段
    );

    // 创建订单
    $order = wc_create_order($order_data);
    if (is_wp_error($order)) {
        return new WP_REST_Response('订单创建失败:' . $order->get_error_message(), 500);
    }

    // 触发插件号码分配逻辑
    if (function_exists('woocommerce_lottery_assign_numbers')) {
        woocommerce_lottery_assign_numbers($order->get_id(), $product_id, $quantity);
    } else {
        // 兼容旧版本插件的钩子触发方案
        do_action('woocommerce_lottery_order_created', $order->get_id(), $product_id, $quantity);
    }

    $order->save();

    // 返回包含彩票号码的响应
    return new WP_REST_Response(array(
        'order_id' => $order->get_id(),
        'lottery_numbers' => get_post_meta($order->get_id(), '_lottery_numbers', true)
    ), 200);
}

2. 自定义端点调用示例(cURL)

curl -X POST https://你的站点域名/wp-json/lottery/v1/create-order \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer 你的WordPress API密钥" \
  -d '{
    "product_id": 123,
    "quantity": 2,
    "user_id": 45
  }'

3. 备选方案:拦截标准API的订单创建流程

如果不想新增端点,可通过钩子拦截WooCommerce REST API的订单创建事件,自动触发号码分配:

add_action('woocommerce_rest_insert_shop_order', function ($order, $request, $creating) {
    if (!$creating) return;

    // 遍历订单商品,处理彩票类型产品
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if ($product && $product->get_type() === 'lottery') {
            $quantity = $item->get_quantity();
            if (function_exists('woocommerce_lottery_assign_numbers')) {
                woocommerce_lottery_assign_numbers($order->get_id(), $product->get_id(), $quantity);
            }
        }
    }
    $order->save();
}, 10, 3);

关键注意事项

  • 不同版本的WooCommerce Lottery插件可能使用不同的函数或钩子,建议查看插件源码确认核心分配函数名称。
  • 必须做好权限验证,防止未授权请求滥用API。
  • 测试前请在 staging 环境验证逻辑,避免影响生产站点。

内容的提问来源于stack exchange,提问作者Anthony Sackey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:17:30