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

WooCommerce:缺货商品替换加入购物车按钮为联系表单——简单商品无法实现该功能求助

WooCommerce:缺货商品替换加入购物车按钮为联系表单——简单商品无法实现该功能求助

嘿,我太懂这种卡在半路上的憋屈感了!可变产品上明明已经把想要的库存状态逻辑跑通了,结果到简单产品这儿就直接“罢工”,确实闹心。我帮你捋捋问题出在哪,再给你补全能覆盖简单产品的解决方案~

先看你给出的代码片段,首先它是不完整的——函数没闭合,也没看到你把这个函数挂载到WooCommerce对应钩子上的代码,而且可变产品和简单产品的库存状态检测、钩子触发逻辑确实有细微差异,咱们一步步来修复:

第一步:补全并优化自定义库存状态函数(覆盖所有产品类型)

先把你写的可用性函数补全,同时确保它能同时作用于简单产品和可变产品,用WooCommerce推荐的getter方法来获取库存状态,兼容性更好:

function woocommerce_get_custom_availability( $data, $product ) {
    // 用官方推荐的方法获取库存状态,兼容所有产品类型
    $stock_status = $product->get_stock_status();

    switch( $stock_status ) {
        case 'readytoship':
            $data = array( 
                'availability' => __( 'In Stock','woocommerce' ), 
                'class' => 'ready-to-ship' 
            );
            break;
        // 顺便补上缺货状态的处理,和你替换按钮的需求对应
        case 'outofstock':
            $data = array( 
                'availability' => __( '暂时缺货,可联系我们预定','woocommerce' ), 
                'class' => 'out-of-stock' 
            );
            break;
        // 默认状态保持原逻辑不变
        default:
            break;
    }
    return $data;
}
// 挂载到官方钩子,设置优先级20确保覆盖默认逻辑
add_filter( 'woocommerce_get_availability', 'woocommerce_get_custom_availability', 20, 2 );

第二步:给缺货的简单产品替换加入购物车按钮为联系表单

你已经搞定了可变产品的按钮替换,简单产品这边需要单独针对它的加入购物车模板逻辑做调整,咱们直接通过钩子替换:

function replace_simple_outofstock_add_to_cart() {
    global $product;

    // 只对缺货的简单产品生效
    if ( $product->is_type('simple') && !$product->is_in_stock() ) {
        // 移除默认的加入购物车按钮
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );
        // 插入自定义联系表单,你可以根据自己的需求修改表单内容
        add_action( 'woocommerce_single_product_summary', function() {
            echo '<div class="out-of-stock-contact-block">
                    <h4>这款产品暂时缺货</h4>
                    <p>有需求请填写下方信息联系我们:</p>
                    <form method="post">
                        <p><label>你的姓名:<input type="text" name="contact_name" required></label></p>
                        <p><label>联系邮箱:<input type="email" name="contact_email" required></label></p>
                        <p><label>留言内容:<textarea name="contact_message" rows="4" required></textarea></p>
                        <p><button type="submit" class="button alt">发送留言</button></p>
                    </form>
                  </div>';
        }, 30 );
    }
}
add_action( 'woocommerce_before_single_product_summary', 'replace_simple_outofstock_add_to_cart' );

几个要注意的小细节

  • 一定要用$product->get_stock_status()而不是直接访问$product->stock_status,官方的getter方法能兼容所有产品类型,避免简单产品获取不到正确状态的问题;
  • 钩子的优先级要对应,比如替换按钮时,原加入购物车按钮的优先级是30,咱们的新内容也要用同样的优先级,这样布局不会乱;
  • 把这两段代码加到你主题的functions.php文件里,测试前记得清一下WooCommerce的缓存,避免旧逻辑残留。

你可以试试这个方案,应该就能解决简单产品的问题了!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 13:04:55