如何通过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
相关产品推荐
相关产品推荐

