WooCommerce商品页:如何根据配送类显示短代码及调用get_shipping_class方法
解决WooCommerce商品页根据配送类显示短代码的问题
嘿,我来帮你搞定这个问题!作为PHP新手踩这些坑太正常了,咱们先拆解你之前代码里的问题,再给你正确的实现方案:
你之前代码的问题分析
第一段代码:
WC_Product::get_shipping_class()是实例方法,不能直接用类名静态调用,必须先获取当前商品的实例对象才行。- 条件判断后面多了个分号
;,这会让if的逻辑失效,不管条件是否成立,后面的代码都会执行。
第二段代码:
wc_get_product()在某些场景下(比如商品页加载的早期阶段)可能无法自动获取当前商品对象,直接调用->get_shipping_class()会因为对象不存在而触发致命错误,导致网站崩溃。
正确的实现代码
把这段代码放到你的主题functions.php文件里,或者自定义插件中:
// 根据商品配送类显示指定短代码 add_action( 'woocommerce_before_add_to_cart_form', 'display_shipping_class_specific_shortcode', 100 ); function display_shipping_class_specific_shortcode() { // 获取当前商品对象,先确保对象存在 global $product; if ( ! is_a( $product, 'WC_Product' ) ) { return; } // 指定要匹配的配送类slug $target_shipping_class = 'furniture-oversized'; // 获取当前商品的配送类slug $product_shipping_class = $product->get_shipping_class(); // 对比配送类,匹配则显示短代码 if ( $product_shipping_class === $target_shipping_class ) { echo do_shortcode('[phoeniixx-pincode-check]'); } }
代码说明
- 我们用
global $product直接获取商品页的全局商品对象,这是WooCommerce商品页中最可靠的获取方式之一。 - 先判断
$product是否是有效的WC_Product实例,避免出现对象不存在的错误。 get_shipping_class()方法返回的是配送类的slug(就是你设置的furniture-oversized这个值),所以直接对比即可。- 把逻辑都封装到动作钩子的回调函数里,避免全局变量的问题,也符合WooCommerce的开发规范。
额外提示
如果你不确定商品的配送类slug是不是furniture-oversized,可以去WooCommerce后台的设置→配送→配送类里查看,每个配送类的slug会显示在名称下方。
内容的提问来源于stack exchange,提问作者littleguySimon
相关产品推荐
相关产品推荐

