#php #wordpress #woocommerce #shipping-method #product-variations
#php #wordpress #woocommerce #метод доставки #варианты продукта
Вопрос:
У меня есть несколько продуктов с атрибутом Size и 3 вариантами (маленький, средний, большой). У меня также есть 3 класса доставки, по одному для каждого размера.
Для любого небольшого варианта продукта будет использоваться класс доставки Small Product, и то же самое относится к Medium и Large.
Я могу назначить каждый класс доставки каждому варианту вручную, но в этом случае это отнимает много времени, подвержено ошибкам и является избыточным (создайте большой вариант, затем назначьте большой класс доставки)
Есть ли какой-либо способ подключить класс доставки к определенному варианту, чтобы при создании варианта он имел уже назначенный соответствующий класс доставки?
Ответ №1:
Следующий код должен выполнить трюк, автоматически добавляя к вариантам продукта идентификатор класса доставки на основе значения термина атрибута продукта «Size», присвоенного варианту.
Для этого требуются одинаковые термины для атрибута продукта Size и для классов доставки («Маленький», «Средний» и «Большой» в вашем случае)
Код:
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 файл активной дочерней темы (или активной темы). Протестировано и работает.