Получите и используйте тип продукта в woocommerce

Я работаю над проектом и застрял в получении типов продуктов 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');

Но это будет лишь отражением заявления Else.

Что-то я делаю не так?

@LoicTheAztec Большое спасибо за ваш ответ ... просто взглянув на него, я уверен, что он сработает (чему я очень рад) ... Основная причина, по которой я разместил этот вопрос, - это найти способ на самом деле получить тип продукта, чтобы я мог использовать if ( $product->is_type('simple') ) { Do this } . Я хочу использовать его на всем веб-сайте, а не только на странице благодарности. есть ли способ написать это без использования add_filter или add_action (это может быть add_shortcode (), т.е. я могу встроить код в шорткод и использовать его где захочу). Огромное спасибо

Kolawole Emmanuel Izzy 10.09.2018 14:08
2
1
5 034
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено:

Для типа продукта вы можете использовать следующий 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;
}

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

$order

Связанный: Получить элементы заказа и WC_Order_Item_Product в WooCommerce 3


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

Sometimes you can't get the product type globally… as it depends on the WC_Product object.

1) From a dynamic product id variable (when you doesn't have the $product object:

$product = wc_get_product( $product_id );

or

$product = wc_get_product( get_the_id() );

2) From $product global variable on single product pages (and on product archive pages inside the loop):

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

3) In cart items:

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

3) In order items:

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

Работают отлично. Мне просто нужно выяснить, как получить тип продукта глобально, чтобы я мог использовать его в любом шаблоне для любой страницы. Это видно? потому что я пытаюсь сделать то же самое для шаблона «Заказать снова» (снова показать топ-ап для простого продукта и снова заказать для других типов продуктов, но я продолжал получать «Неперехваченная ошибка: вызов функции-члена get_items () в строке» в строке foreach ( $order->get_items() as $item ) {

Kolawole Emmanuel Izzy 10.09.2018 22:47

@KolawoleEmmanuelIzzy Я добавил дополнение в конце своего ответа.

LoicTheAztec 10.09.2018 23:12

Я просмотрел обновленный контент и справочную ссылку, я заметил, что в справочной ссылке указан идентификатор заказа, но в моем случае идентификатор заказа не указан, так как я хочу, чтобы это повлияло на все идентификаторы заказов. Я попытался использовать обновленный контент в шаблоне woocommerce для повторного заказа, но все же получил Fatal error: Uncaught Error: Call to a member function get_items() on null in. Извини, если я тебя напрягаю

Kolawole Emmanuel Izzy 11.09.2018 01:08

Другие вопросы по теме