Решил
Сначала через фильтр проверяем данные, которые посылает форма. Названия атрибутов прописаны вручную.
add_filter( 'woocommerce_add_cart_item_data', 'add_cart_item_data', 10, 3 );
function add_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
$product = wc_get_product( $variation_id );
$price = $product->get_price(); // variation price
$variant = $_POST['attribute_pa_variant-izgotovleniya']; // option name
$razmer = $_POST['attribute_pa_razmer']; // option name
if( $variant == 'bumazhnyj-poster' && $razmer == '30x40' ) {
$cart_item_data['new_price'] = 600;
}
if( $variant == 'bumazhnyj-poster' && $razmer == '40x60' ) {
$cart_item_data['new_price'] = 700;
}
if( $variant == 'bumazhnyj-poster' && $razmer == '50x70' ) {
$cart_item_data['new_price'] = 800;
}
if( $variant == 'bumazhnyj-poster' && $razmer == '60x90' ) {
$cart_item_data['new_price'] = 900;
}
return $cart_item_data;
}
Потом обновляем данные в корзине
add_action( 'woocommerce_before_calculate_totals', 'before_calculate_totals', 10, 1 );
function before_calculate_totals( $cart_obj ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
// Iterate through each cart item
foreach( $cart_obj->get_cart() as $key=>$value ) {
if( isset( $value['new_price'] ) ) {
$price = $value['new_price'];
$value['data']->set_price( ( $price ) );
}
}
}