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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:18:01