静态站表单对接WooCommerce:提交商品选项跳转至结账页
解决方案:静态落地页表单一键添加多商品到WooCommerce购物车
当然可以!你完全不需要为每一种选项组合生成单独的「添加至购物车URL」,只需要一个统一的处理端点,配合少量自定义代码就能实现需求。下面是一步步的具体实现方案:
第一步:配置静态落地页的表单
首先,把你的落地页表单指向WooCommerce内置的admin-post.php端点(这是WordPress用来处理自定义POST请求的标准入口),同时通过隐藏字段指定一个自定义动作标识,方便后续钩子捕获请求。
示例表单代码(根据你的实际商品/选项调整字段):
<form method="POST" action="https://你的站点域名/wp-admin/admin-post.php"> <!-- 自定义动作标识,必须和后面的钩子对应 --> <input type="hidden" name="action" value="custom_add_to_cart"> <!-- 示例1:简单商品带属性选项 --> <label> <input type="checkbox" name="products[25][add]" value="1"> 基础套餐 - 颜色: <select name="products[25][attributes][pa_color]"> <option value="red">红色</option> <option value="blue">蓝色</option> </select> </label> <!-- 示例2:变体商品(直接选择变体ID) --> <label> <input type="radio" name="products[30][variation_id]" value="31"> 高级套餐 - 大尺寸(变体ID:31) </label> <label> <input type="radio" name="products[30][variation_id]" value="32"> 高级套餐 - 小尺寸(变体ID:32) </label> <!-- 购买按钮 --> <button type="submit">立即购买</button> </form>
字段命名规则说明:
products[商品ID]:用商品ID作为键,区分不同商品- 对于简单商品带属性:用
[attributes][pa_属性别名]传递属性值(属性别名在WooCommerce产品属性设置里查看) - 对于变体商品:直接传递
[variation_id](变体ID可以在WooCommerce产品编辑页的变体列表里找到) - 复选框的
[add]字段:用来标记用户是否选中该商品
第二步:在WooCommerce中添加自定义处理代码
接下来,在你的主题functions.php文件(或者自定义插件)中添加以下代码,用来捕获表单请求并处理商品添加逻辑:
// 处理登录用户的请求 add_action('admin_post_custom_add_to_cart', 'handle_custom_add_to_cart'); // 处理未登录用户的请求 add_action('admin_post_nopriv_custom_add_to_cart', 'handle_custom_add_to_cart'); function handle_custom_add_to_cart() { // 检查是否有产品数据提交 if (!isset($_POST['products']) || !is_array($_POST['products'])) { wp_redirect(wc_get_checkout_url()); exit; } // 清空原有购物车(可选,根据需求决定是否保留已有商品) // WC()->cart->empty_cart(); foreach ($_POST['products'] as $product_id => $product_data) { $product_id = absint($product_id); $product = wc_get_product($product_id); // 检查产品是否存在 if (!$product) continue; // 处理简单商品带属性的情况 if (isset($product_data['add']) && $product_data['add'] == '1' && isset($product_data['attributes'])) { $attributes = array_map('sanitize_text_field', $product_data['attributes']); // 添加到购物车 WC()->cart->add_to_cart( $product_id, 1, // 数量 0, // 变体ID(简单商品填0) $attributes ); } // 处理变体商品的情况 if (isset($product_data['variation_id']) && !empty($product_data['variation_id'])) { $variation_id = absint($product_data['variation_id']); $variation = wc_get_product($variation_id); if ($variation && $variation->get_parent_id() == $product_id) { WC()->cart->add_to_cart( $product_id, 1, // 数量 $variation_id ); } } } // 跳转到结账页 wp_redirect(wc_get_checkout_url()); exit; }
关键细节说明
- 权限与安全:代码中使用了
admin_post系列钩子,WordPress会自动处理基础的安全验证;同时用absint()和sanitize_text_field()过滤用户输入,避免安全问题。 - 购物车清空:如果需要用户每次提交表单时清空原有购物车,取消代码中
WC()->cart->empty_cart();的注释即可。 - 数量控制:示例中默认数量是1,你可以在表单中添加
name="products[商品ID][quantity]"的字段,让用户选择数量,然后在代码中替换1为$product_data['quantity']。 - 错误处理:如果需要提示用户产品不存在/库存不足等信息,可以在添加购物车后检查
WC()->cart->get_errors(),然后通过wc_add_notice()添加提示,再跳转到购物车页。
测试建议
- 先测试单个商品的添加逻辑,确认属性/变体能正确识别;
- 再测试多个商品同时选中的情况,检查购物车是否正确添加所有选中项;
- 测试未登录用户的提交流程,确保功能正常。
内容的提问来源于stack exchange,提问作者johnsmith20201912
相关产品推荐
相关产品推荐

