使用woocommerce_product_add_to_cart_text过滤器钩子引发页面崩溃问题
崩溃原因
- 没有正确接收钩子传入的参数,错误依赖全局
$product变量。woocommerce_product_add_to_cart_text钩子会默认传入两个参数:当前默认的按钮文本、当前商品对象,不需要调用全局变量。全局变量在商品列表、分类页等循环场景下大概率不会指向当前正在渲染的商品,甚至可能是其他类型的对象(比如分类项),你在非商品对象上调用get_stock_quantity()等WooCommerce商品方法自然会触发错误,也就是你日志里看到的class-wp-term.php相关报错。 - 代码触发了无限递归。你在回调函数里调用了
$product->add_to_cart_text()方法,这个方法本身就会再次触发woocommerce_product_add_to_cart_text钩子,等于你的函数自己不停调用自己,直到内存耗尽页面崩溃。 - 函数没有保证所有场景都有返回值。你只在非后台场景下返回了文本,若钩子在后台场景触发时没有返回值,会导致原有文本被清空,也可能引发连锁错误。
修复方案
调整函数接收钩子传入的默认参数、删除会触发递归的调用、增加商品对象类型校验即可,修复后的代码如下:
function change_button_text_on_backorder( $button_text, $product ) { // 后台场景直接返回原文本 if ( is_admin() ) { return $button_text; } // 校验传入的是不是合法的商品对象 if ( ! is_a( $product, 'WC_Product' ) ) { return $button_text; } $qty = $product->get_stock_quantity(); // 满足预售条件修改文本,否则返回原有文本 if ( $qty < 1 && $product->backorders_allowed() ) { $button_text = 'BACKORDER'; } return $button_text; } // 注册钩子时声明要接收2个参数 add_filter('woocommerce_product_single_add_to_cart_text', 'change_button_text_on_backorder', 10, 2); add_filter('woocommerce_product_add_to_cart_text', 'change_button_text_on_backorder', 10, 2);
内容的提问来源于stack exchange,提问作者Demuri Celidze
相关产品推荐
相关产品推荐

