Автоматическая установка определенного значения атрибута для купленных продуктов в Woocommerce

Я хочу автоматически добавлять определенное значение атрибута (которое было ранее настроено) к заказанным товарам, когда заказ размещен и находится в состоянии «приостановлен».

Я продаю уникальные товары, и я установил атрибут «НАЛИЧИЕ» и значение «Out Of Stock» (нет на складе).

Когда заказ размещен и находится в состоянии «отложен», я хочу автоматически изменить статус избранных заказанных продуктов, а также добавить к нему значение атрибута «нет в наличии».

Показанная часть готова и работает, но я не могу понять, как добавить конкретное значение атрибута к товарам.

Вот мой код:

add_action('woocommerce_order_status_on-hold', 'order_status_on_hold_update_products', 20, 2);

function order_status_on_hold_update_products( $order_id, $order ) {
  foreach ( $order->get_items() as $item_id => $item ) {
    $product = $item->get_product();
    $product->set_featured(true);
    $product->set_attributes(???); // I don't know if and how set_attributes() should be used
    $product->save();
}

person Rob    schedule 27.12.2018    source источник


Ответы (1)


Чтобы установить статус «Нет в наличии», вы будете использовать WC_Product метод set_stock_status() следующим образом:

 $product->set_stock_status('outofstock'); // Or "instock"
 $product->save();

Чтобы установить термин атрибута продукта в вашей подключенной функции (также работайте с переменными продуктами):

add_action('woocommerce_order_status_on-hold', 'order_status_on_hold_update_products', 20, 2);
function order_status_on_hold_update_products( $order_id, $order ) {
    foreach ( $order->get_items() as $item_id => $item ) {
        $product = $item->get_product();

        // Handling variable products
        $_product = $product->is_type('variation') ? wc_get_product( $item->get_product_id() ) : $product;

        $_product->set_featured( true );

        // Your product attribute settings
        $taxonomy   = 'pa_stock'; // The taxonomy
        $term_name  = "Out Of Stock"; // The term

        $attributes = (array) $_product->get_attributes();
        $term_id    = get_term_by( 'name', $term_name, $taxonomy )->term_id;

        // 1) If The product attribute is set for the product
        if( array_key_exists( $taxonomy, $attributes ) ) {
            foreach( $attributes as $key => $attribute ){
                if( $key == $taxonomy ){
                    $attribute->set_options( array( $term_id ) );
                    $attributes[$key] = $attribute;
                    break;
                }
            }
            $_product->set_attributes( $attributes );
        }
        // 2. The product attribute is not set for the product
        else {
            $attribute = new WC_Product_Attribute();

            $attribute->set_id( sizeof( $attributes) + 1 );
            $attribute->set_name( $taxonomy );
            $attribute->set_options( array( $term_id ) );
            $attribute->set_position( sizeof( $attributes) + 1 );
            $attribute->set_visible( true );
            $attribute->set_variation( false );
            $attributes[] = $attribute;

            $_product->set_attributes( $attributes );
        }

        $_product->save();

        // Append the new term in the product
        if( ! has_term( $term_name, $taxonomy, $_product->get_id() ) )
            wp_set_object_terms($_product->get_id(), $term_slug, $taxonomy, true );
    }
}

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

person LoicTheAztec    schedule 27.12.2018
comment
значение атрибута Out Of Stock было больше похоже на пример, хотя я использую его как атрибут для особой, другой цели. Таким образом, я хочу не просто установить статус запаса, а добавить к продукту определенное значение атрибута. Итак, вы говорите, что set_attributes () не работает в моем случае? По сути, я не устанавливаю новый настраиваемый атрибут, а просто хочу добавить уже существующее значение атрибута к товарам из отложенных заказов. - person Rob; 27.12.2018
comment
Например, если у меня есть атрибут «Цвет», а в качестве значений - красный, зеленый и синий, я хочу автоматически добавлять значение «Красный» к продуктам из отложенных заказов. - person Rob; 27.12.2018
comment
Спасибо. Я попробую сейчас и вернусь. Для ясности ... Мне нужна только часть 1) Если для продукта установлен атрибут product, верно? Потому что атрибут уже существует и имеет ТОЛЬКО ОДНО Значение. Я просто хочу, чтобы это единственное значение атрибута было добавлено к продукту после того, как продукт будет заказан. - person Rob; 27.12.2018
comment
@RobertPopescu Вы можете сохранить в коде то, что вам нужно… Вот как это сделать. - person LoicTheAztec; 27.12.2018
comment
Хорошо, я действительно не понимаю некоторые строки из вашего кода и то, что они делают, но я протестировал все как есть, и он работает, как задумано. Это именно то, что я хотел получить. Не могу вас отблагодарить, добрый сэр! - person Rob; 27.12.2018
comment
@RobertPopescu Атрибуты продукта - это нечто сложное ... Так что в следующий раз проще будет использовать настраиваемое мета-поле (метаданные публикации), которые можно очень легко установить и обновить. - person LoicTheAztec; 27.12.2018
comment
Не могли бы вы поделиться ссылкой или какой-нибудь статьей, где я мог бы узнать, как использовать настраиваемые мета-поля в соответствии с моей целью? - person Rob; 27.12.2018
comment
@RobertPopescu Самый простой пример: вы можете установить настраиваемое поле для продукта (из его идентификатора продукта), используя update_post_meta( $product_id, '_your_custom_meta_key', 'Out of Stock' );, а для получения значения из продукта iD вы будете использовать $value = get_post_meta( $product_id, '_your_custom_meta_key', true ); - person LoicTheAztec; 27.12.2018
comment
Вы сэкономили mw с термином в продукте ... - person Felipe Buccioni; 29.04.2021