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

WordPress站点PHP代码测试服正常、生产服运行报错问题咨询

问题根因排查

报错核心是调用is_on_sale()方法时全局变量$product为null,结合你的环境差异和代码逻辑,常见原因有以下几点:

  • 生产服务器上WooCommerce插件的加载优先级低于你当前自定义模板的执行优先级:DirectAdmin和Plesk的默认PHP配置、WordPress插件加载顺序可能存在差异,测试环境WooCommerce先加载完成,全局$product能正常被初始化赋值,生产环境执行到你的模板代码时WooCommerce还没完成$product的全局赋值
  • FacetWP自定义模板的全局变量作用域问题:从堆栈 trace 可以看到你的模板是被FacetWP通过eval加载的,不同服务器的PHP配置对eval上下文的全局变量继承规则可能有细微差异,global $product 没有正确拿到全局的商品对象
  • 商品循环异常:生产环境的查询结果里混入了非product类型的文章,the_post()执行后没有对应的WooCommerce商品对象,导致全局$product没有被赋值
修复方案

首先修改你的代码,增加变量合法性校验,替换原有全局$product声明和后续调用逻辑:

<ul class="products columns-4 glassbyhan-products">
<?php
while ( have_posts() ): the_post();
// 替换原global $product,手动获取商品对象,避免全局变量失效问题
$product = wc_get_product( get_the_ID() );
// 增加校验,不是合法商品对象直接跳过本条循环
if ( ! $product instanceof WC_Product ) {
    continue;
}
?>
    <li class="glassbyhan-product">
        <a href="<?php echo get_permalink(); ?>">
            <span class="et_shop_image" style="background-image: url('<?php  echo the_post_thumbnail_url('woocommerce_thumbnail'); ?>')">
                <?php   if ( $product->is_on_sale() ) : ?>
                    <?php echo apply_filters( 'woocommerce_sale_flash', '<span class="onsale">' . esc_html__( 'Sale!', 'woocommerce' ) . '</span>',  $product ); ?>
                <?php endif;?>
            </span>
            <strong><?php echo the_title(); ?></strong><br/>
            <?php echo $product->get_price_html();?>
        </a>
    </li>
<?php
endwhile;
wp_reset_query();
?>

如果修改代码后还是出现异常,可进一步排查生产服务器的以下配置:

  • 检查WooCommerce插件是否正常激活,且版本和测试环境一致
  • 检查FacetWP的自定义模板配置,确认模板关联的查询结果都是product类型的文章
  • 对比两台服务器的wp-config.php配置,确认生产环境没有修改WooCommerce相关的全局变量初始化逻辑

内容的提问来源于stack exchange,提问作者Sjoerd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:45:03