WooCommerce single-product模板致命错误:is_on_sale()调用对象为null
问题说明
启用WooCommerce后网站直接崩溃,停用插件则恢复正常,具体错误详情:
致命错误:未捕获的Error:在/home/brga7543/smatchcard.com/wp-content/plugins/woocommerce/templates/single-product/sale-flash.php:25行对null调用成员函数is_on_sale()
堆栈跟踪:
#0 /home/brga7543/smatchcard.com/wp-content/plugins/woocommerce/includes/wc-core-functions.php(345): include()
#1 /home/brga7543/smatchcard.com/wp-content/plugins/woocommerce/includes/wc-template-functions.php(1676): wc_get_template('single-product/...')
#2 /home/brga7543/smatchcard.com/wp-includes/class-wp-hook.php(307): woocommerce_show_product_sale_flash('')
#3 /home/brga7543/smatchcard.com/wp-includes/class-wp-hook.php(331): WP_Hook->apply_filters('', Array)
#4 /home/brga7543/smatchcard.com/wp-includes/plugin.php(476): WP_Hook->do_action(Array)
#5 /home/brga7543/smatchcard.com/wp-content/plugins/woocommerce/templates/content-single-product.php(43): do_action('woocommerce_bef...')
#6 /home/brga7543/smatchcard.com/wp-includes/template.php(772): require('/home/brga7543/...')
#7 /home/brga7543/smatchcard.com/wp-content/plugins/wo in /home/brga7543/smatchcard.com/wp-content/plugins/woocommerce/templates/single-product/sale-flash.php on line 25
核心问题:渲染商品促销标签时,程序无法获取有效的商品对象($product为null),直接调用is_on_sale()方法导致报错。
解决步骤
检查并修复模板文件:
- 若主题未重写WooCommerce促销标签模板,直接下载对应版本的官方WooCommerce插件,将其中的
single-product/sale-flash.php文件替换网站同路径下的文件。 - 若主题已重写该模板(路径:
/wp-content/themes/你的主题名/woocommerce/single-product/sale-flash.php),打开文件后在调用$product->is_on_sale()前添加判断:global $product; if ( ! $product ) return; // 确保商品对象存在再执行后续逻辑 if ( $product->is_on_sale() ) { // 保留原促销标签渲染代码 }
- 若主题未重写WooCommerce促销标签模板,直接下载对应版本的官方WooCommerce插件,将其中的
排查插件冲突:
仅启用WooCommerce,逐个禁用其他插件,每次禁用后刷新网站,定位到引发冲突的插件,可尝试更新该插件或更换替代插件。测试主题兼容性:
临时切换至WordPress默认主题(如Twenty Twenty-Four),若网站恢复正常,说明当前主题的WooCommerce适配代码存在问题,可联系主题开发者修复或自行调整主题内相关代码。重置WooCommerce模板:
进入WooCommerce设置→高级→模板,点击「恢复默认模板」按钮,重置所有自定义修改的模板文件。更新WooCommerce版本:
若当前使用的WooCommerce不是最新版,升级至官方最新版本,修复已知的模板相关bug。
内容的提问来源于stack exchange,提问作者Bruno Bros

