在 WooCommerce 中获取和使用产品类型

Kol*_*zzy 2 php wordpress product orders woocommerce

我正在做一个项目,但我一直坚持将 Woocommerce 产品类型定义为“简单”、“可变”、“分组”或“外部”……

我想要实现的目标:
在“谢谢”页面上,上面写着“谢谢。您的订单已收到。 ”。
如果产品是“简单的”,而另一个文本是产品是可变的、分组的或外部的,我想在那里显示一个特定的文本,例如:

if (product->get_type() == 'simple') {// (for simple product)
      //show a text
}else {// (for variable, grouped and external product) 
      //show another text
}
Run Code Online (Sandbox Code Playgroud)

我已经能够使用这个:

function custome_tank_you_text($order_id) {
    $order = new WC_Order( $order_id );
    $items = $order->get_items();

    foreach ( $items as $item ) {
        $product = wc_get_product( $item['product_id'] );

        $product->get_type();
    }

    if( $product == 'simple'){ ?>
        <p class="woocommerce-notice woocommerce-notice--success woocommerce-thankyou-order-received"><?php echo apply_filters( 'woocommerce_thankyou_order_received_text', __( 'Thank you for topping up your wallet. It has been updated!', 'woocommerce' ), $order ); ?></p>
    <?php
    } else {?>
    <p class="woocommerce-notice woocommerce-notice--success woocommerce-thankyou-order-received"><?php echo apply_filters( 'woocommerce_thankyou_order_received_text', __( 'Thank you. Your order has been received!', 'woocommerce' ), $order ); ?></p>
    <?php
    }
}
add_shortcode('thank-u-msg', 'custome_tank_you_text');
Run Code Online (Sandbox Code Playgroud)

但这只会呼应 Else 语句。

有什么我做错了吗?

Loi*_*tec 6

更新:

对于产品类型,您可以使用以下WC_Product方法

  • 要获取产品类型,您将使用get_type()方法
  • 检查IF 语句中的产品类型,您将使用is_type()方法

请参阅本答案末尾的如何获取WC_Product对象实例。

现在,由于 WooCommerce 3 您的代码有点过时并且有一些错误……另外请记住,一个订单可以有很多项目,因此需要打破循环(保留第一个项目)。您可以通过woocommerce_thankyou_order_received_text这种方式直接使用专用过滤器钩子:

add_filter( 'woocommerce_thankyou_order_received_text', 'custom_thankyou_order_received_text', 20, 2 );
function custom_thankyou_order_received_text( $thankyou_text, $order ){
    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        // Get an instance of the WC_Product Object from the WC_Order_Item_Product
        $product = $item->get_product();

        if( $product->is_type('simple') ){
            $thankyou_text = __( 'Thank you for topping up your wallet. It has been updated!', 'woocommerce' );
        } else {
            $thankyou_text = __( 'Thank you. Your order has been received!', 'woocommerce' );
        }
        break; // We stop the loop and keep the first item
    }
    return $thankyou_text;
}
Run Code Online (Sandbox Code Playgroud)

代码位于活动子主题(或活动主题)的 function.php 文件中。测试和工作。

$订单

相关:在 WooCommerce 3 中获取订单项目和 WC_Order_Item_Product


ADDITION - 如何获取WC_Product对象 (使用 方法)is_type() get_type()

有时您无法全局获取产品类型……因为它取决于WC_Product对象。

1)从动态产品 id变量(当您没有 $product 对象时:

$product = wc_get_product( $product_id );
Run Code Online (Sandbox Code Playgroud)

或者

$product = wc_get_product( get_the_id() );
Run Code Online (Sandbox Code Playgroud)

2)来自$product单个产品页面上的全局变量(以及循环内的产品存档页面

global $product;

// Check that WC_Product instance $product variable is defined and accessible
if ( ! is_a( $product, 'WC_Product' ) ) {
    $product = wc_get_product( get_the_id() );
Run Code Online (Sandbox Code Playgroud)

3) 在购物车项目中:

// Loop throught cart items
foreach( WC()->cart->get_cart() as $cart_item ){
    $product = $cart_item['data'];
}
Run Code Online (Sandbox Code Playgroud)

3)订购商品:

// Loop through order items
foreach ( $order->get_items() as $item ) {
    $product = $item->get_product();
}
Run Code Online (Sandbox Code Playgroud)