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
相关产品推荐
相关产品推荐

