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

WooCommerce商品页:如何根据配送类显示短代码及调用get_shipping_class方法

解决WooCommerce商品页根据配送类显示短代码的问题

嘿,我来帮你搞定这个问题!作为PHP新手踩这些坑太正常了,咱们先拆解你之前代码里的问题,再给你正确的实现方案:

你之前代码的问题分析

  1. 第一段代码:

    • WC_Product::get_shipping_class()是实例方法,不能直接用类名静态调用,必须先获取当前商品的实例对象才行。
    • 条件判断后面多了个分号;,这会让if的逻辑失效,不管条件是否成立,后面的代码都会执行。
  2. 第二段代码:

    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:27:24