Автоматическое назначение класса доставки для WooCommerce Variation на основе атрибута

У меня есть товары с атрибутом «Размер» и 3 вариантами (маленький, средний, большой). У меня также есть 3 класса доставки, по одному для каждого размера.

Любой вариант Small продукта будет использовать Класс доставки Small Product, то же самое касается Medium и Large.

Я могу назначить каждый класс доставки каждому варианту вручную, но в этом случае это отнимает много времени, подвержено ошибкам и излишне (создайте большой вариант, затем назначьте большой класс доставки)

Есть ли способ связать класс доставки с конкретным вариантом, поэтому, когда я создаю вариант, он поставляется с уже назначенным соответствующим классом доставки?


person Lucas Bols    schedule 08.10.2020    source источник


Ответы (1)


Следующий код должен помочь, автоматически добавляя к вариантам продукта идентификатор класса доставки на основе значения термина «размер» атрибута продукта, присвоенного варианту.

Требуются одинаковые условия для атрибута товара "Размер", а также для условий классов доставки (в вашем случае "малый", "средний" и "большой").

Код:

add_action( 'woocommerce_save_product_variation', 'auto_add_shipping_method_based_on_size', 10, 2 );
function auto_add_shipping_method_based_on_size( $variation_id, $i ){
    // Get the WC_Product_Variation Object
    $variation = wc_get_product( $variation_id );

    // If the variation hasn't any shipping class Id set for it
    if( ! $variation->get_shipping_class_id() ) {
        // loop through product attributes
        foreach( $variation->get_attributes() as $taxonomy => $value ) {
            if( 'Size' === wc_attribute_label($taxonomy) ) {
                // Get the term name for Size set on this variation
                $term_name = $variation->get_attribute($taxonomy);

                // If the shipping class related term id exist
                if( term_exists( $term_name, 'product_shipping_class' ) ) {
                    // Get the shipping class Id from attribute "Size" term name
                    $shipping_class_id = get_term_by( 'name', $term_name, 'product_shipping_class' )->term_id;

                    // Set the shipping class Id for this variation
                    $variation->set_shipping_class_id( $shipping_class_id );
                    $variation->save();
                    break; // Stop the loop
                }
            }
        }
    }
}

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

person LoicTheAztec    schedule 08.10.2020