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
相关产品推荐
相关产品推荐

