Используйте тип продукта в заявлении if по полученному заказу Woocommerce (спасибо) - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю над проектом и застрял в получении типов продуктов Woocommerce как «простой», «переменный», «сгруппированный» или «внешний» ...

Чего я хочу достичь:
На странице Спасибо, где написано " Спасибо. Ваш заказ был получен. ".
Я хочу показать конкретный текст, если продукт «простой», а другой текст - «продукт» является переменным, сгруппированным или внешним, поэтому что-то вроде:

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

Я смог использовать это:

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');

Но это будет только повторять утверждение Остальное.

Есть ли что-то, что я делаю не так?

1 Ответ

0 голосов
/ 10 сентября 2018

Обновлено:

Начиная с 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;
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). проверено и работает.

$order

Похожие: Получить товары для заказа и WC_Order_Item_Product в Woocommerce 3


ДОПОЛНЕНИЕ - Как получить объект WC_Product (использовать метод is_type() )

Вы не можете получить тип продукта глобально ... так как это зависит от объекта WC_Product

1) Из переменной динамического идентификатора продукта (если у вас нет объекта $ product:

$product = wc_get_product( $product_id );

или

$product = wc_get_product( get_the_id() );

2) В корзине товаров:

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

3) В заказе:

// Loop through order items
foreach ( $order->get_items() as $item ) {
    $product = $item->get_product();
}
...