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

如何获取WordPress自定义加购功能中选中的Variation ID

获取WordPress可变产品选中变体的variation_id

方法一:前端JavaScript实时匹配

1. 修正前端属性选择代码

先确保单选框的name属性和可用变体数组中的属性键格式一致(即attribute_pa_xxx),调整后代码如下:

<?php 
$variations = $product->get_variation_attributes();
$available_variations = $product->get_available_variations();
?>
<!-- 新增隐藏字段存储匹配到的variation_id -->
<input type="hidden" id="selected_variation_id" name="variation_id" value="">

<?php foreach ($variations as $key => $value): ?>
    <div class="d-flex">
        <div class="ms-2">
            <span><?php echo wc_attribute_label($key); // 显示友好的属性名称 ?></span>
        </div>
        <div class="d-flex">
            <?php foreach ($value as $var): ?>
                <div class="button-group">
                    <!-- 修正name为attribute_pa_xxx格式 -->
                    <input type="radio" name="attribute_<?php echo $key ?>" value="<?php echo $var; ?>" id="<?php echo $var; ?>">
                    <label class="artheme_var_id" id="<?php echo $var; ?>" for="<?php echo $var; ?>"><?php echo $var; ?></label>
                </div>
            <?php endforeach; ?>
        </div>
    </div>
    <br>
<?php endforeach; ?>

2. 添加JavaScript匹配逻辑

把可用变体数组转为JSON传给JS,监听属性选择事件实时匹配variation_id:

<script>
// 将PHP的可用变体数组转为JS对象
const availableVariations = <?php echo json_encode($available_variations); ?>;
const attributeInputs = document.querySelectorAll('input[name^="attribute_"]');
const variationIdField = document.getElementById('selected_variation_id');

// 定义匹配函数
function matchVariationId() {
    const selectedAttributes = {};
    // 收集所有选中的属性
    attributeInputs.forEach(input => {
        if (input.checked) {
            selectedAttributes[input.name] = input.value;
        }
    });

    // 遍历可用变体,找到属性完全匹配的项
    let matchedId = '';
    availableVariations.forEach(variation => {
        let isMatch = true;
        for (const attrKey in selectedAttributes) {
            if (variation.attributes[attrKey] !== selectedAttributes[attrKey]) {
                isMatch = false;
                break;
            }
        }
        if (isMatch) {
            matchedId = variation.variation_id;
        }
    });

    // 更新隐藏字段的值
    variationIdField.value = matchedId;
}

// 给所有属性单选框添加事件监听
attributeInputs.forEach(input => {
    input.addEventListener('change', matchVariationId);
});

// 页面加载时如果有默认选中项,执行一次匹配
matchVariationId();
</script>

用户选择属性后,selected_variation_id隐藏字段会自动填入对应variation_id,提交表单时直接获取该字段值即可。

方法二:后端PHP提交时匹配

若无需实时获取,可在表单提交到后端后,通过选中属性匹配variation_id:

// 获取表单提交的选中属性
$selected_attributes = [];
foreach ($product->get_variation_attributes() as $key => $values) {
    $attr_name = 'attribute_' . $key;
    if (isset($_POST[$attr_name])) {
        $selected_attributes[$attr_name] = sanitize_text_field($_POST[$attr_name]);
    }
}

// 遍历可用变体,找到匹配的variation_id
$matched_variation_id = 0;
$available_variations = $product->get_available_variations();
foreach ($available_variations as $variation) {
    $is_match = true;
    foreach ($selected_attributes as $attr_key => $attr_value) {
        if ($variation['attributes'][$attr_key] !== $attr_value) {
            $is_match = false;
            break;
        }
    }
    if ($is_match) {
        $matched_variation_id = $variation['variation_id'];
        break;
    }
}

// 示例:使用匹配到的ID加入购物车
if ($matched_variation_id) {
    WC()->cart->add_to_cart($product->get_id(), 1, $matched_variation_id);
}

注意事项

  • 必须选全所有属性才能匹配到唯一的variation_id,可添加逻辑在未选全时禁用加入购物车按钮
  • 确保属性值的大小写、格式和可用变体数组中的完全一致,避免匹配失败

内容的提问来源于stack exchange,提问作者Ahmad Reza Hajizadeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:52:32