WooCommerce添加自定义演示产品链接导致变体无法加入购物车问题求助
WooCommerce添加自定义演示产品链接导致变体无法加入购物车问题求助
各位WooCommerce开发者们,我遇到个头疼的问题,想请大家帮忙看看!
我在做一个WooCommerce项目,需求是在产品的加购按钮后面自动显示关联的演示产品链接,提示用户有演示款可用。我用了woocommerce_after_add_to_cart_button这个action钩子,位置显示得倒是很对,在简单产品页面完全正常——既能看到演示链接,也能正常加购产品。但到了变量产品页面就出问题了:不管选什么变体,点加购按钮都没反应,根本没法把变体加入购物车。
我写的代码是这样的:
add_action( 'woocommerce_after_add_to_cart_button', 'find_rf_link_products_function2' ); function find_rf_link_products_function2(){ global $product; $product_rf = $product->get_sku(); $product_rf = $product_rf."RF"; $product_id = wc_get_product_id_by_sku( ''.$product_rf.'' ); $linktorf = get_permalink($product_id); if( $product_id ) { $product = wc_get_product( $product_id ); $amountRF = $product->get_stock_quantity(); } if ( $amountRF > 0 ) { $box = "<span class='box'><a href='".$linktorf."'>EX-DEMO AVAILABLE</a></span>"; echo $box; } else { // do nothing } }
后来我排查了半天终于找到问题所在:我的函数里重新给全局的$product变量赋值了!当我获取到演示产品ID后,直接用$product = wc_get_product( $product_id );把原来的产品对象替换成了演示产品的对象。而在变量产品页面,WooCommerce的变体选择和加购逻辑是高度依赖这个全局$product变量的,我这么一改直接破坏了原有逻辑,导致变体加购完全失效。
知道问题后修复起来就很简单了:只要不覆盖全局的$product变量,改用其他变量名来存储演示产品对象就行。修复后的代码如下:
add_action( 'woocommerce_after_add_to_cart_button', 'find_rf_link_products_function2' ); function find_rf_link_products_function2(){ global $product; $product_rf = $product->get_sku(); $product_rf = $product_rf . "RF"; $product_id = wc_get_product_id_by_sku( $product_rf ); $linktorf = get_permalink($product_id); $amountRF = 0; if( $product_id ) { // 改用新变量名存储演示产品对象,避免覆盖全局$product $demo_product = wc_get_product( $product_id ); $amountRF = $demo_product->get_stock_quantity(); } if ( $amountRF > 0 ) { $box = "<span class='box'><a href='".$linktorf."'>EX-DEMO AVAILABLE</a></span>"; echo $box; } }
我还顺便优化了一点点细节:去掉了没必要的冗余字符串拼接''.$product_rf.'',直接用$product_rf就行;另外在开头初始化了$amountRF为0,避免出现变量未定义的PHP警告。
现在这个代码在简单产品和变量产品页面都能正常工作了——既能正确显示演示产品链接,变量产品也能正常选择变体并加入购物车。
内容来源于stack exchange
相关产品推荐
相关产品推荐

