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

静态站表单对接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;
}

关键细节说明

  1. 权限与安全:代码中使用了admin_post系列钩子,WordPress会自动处理基础的安全验证;同时用absint()和sanitize_text_field()过滤用户输入,避免安全问题。
  2. 购物车清空:如果需要用户每次提交表单时清空原有购物车,取消代码中WC()->cart->empty_cart();的注释即可。
  3. 数量控制:示例中默认数量是1,你可以在表单中添加name="products[商品ID][quantity]"的字段,让用户选择数量,然后在代码中替换1为$product_data['quantity']。
  4. 错误处理:如果需要提示用户产品不存在/库存不足等信息,可以在添加购物车后检查WC()->cart->get_errors(),然后通过wc_add_notice()添加提示,再跳转到购物车页。

测试建议

  1. 先测试单个商品的添加逻辑,确认属性/变体能正确识别;
  2. 再测试多个商品同时选中的情况,检查购物车是否正确添加所有选中项;
  3. 测试未登录用户的提交流程,确保功能正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:22:54