• Никакой политики на форуме. Иначе - бан!
  • Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Добавление товара в корзину с индивидуальной ценой

hennessy007

Новичок
Друзья! Имеется конструктор товара(костыльный хуже некуда). Соответсвенно от выборов разных атрибутов цена у него меняется. Атрибуты не те, который создаются в wc, а самапально записанные в бд.

Задача такая. Нужно, что бы в корзину добавился собранный товар с необходимой ценой и атрибутами.

Что я сделал:
1) Товар(например - имя: конструктор)
2) Сделал его вариативным
3) Создал все атрибуты и значения, которые используются в конструкторе
4) Создал ОДНУ вариацию, где в значениях по атрибутам указано "Любой атрибут"

При сборе товара в конструкторе я смогу передать поля, которые необходимы корзине. например есть атрибут type_construct со значением rect. Я передам как гет запрос при лобавлении attribute_pa_type_construct=rect. По сути всё хорошо, всё добавляется. Но цена остаётся стандартной.

Сделал ещё вот такой костыль:

PHP:
global $woocommerce;
$cart_object = $woocommerce->cart;
    foreach ( $cart_object->cart_contents as $key => $value ) {
        if ($value['product_id'] == 344) {
            $value['data']->set_price(100);
            echo $value['data']->get_price();
        }
    } 
$woocommerce->cart->calculate_totals();
$woocommerce->cart->set_session();
$woocommerce->cart->maybe_set_cart_cookies();

Цена меняется везде визуально, вроде бы всё хорошо, НО в админке цена берётся из товара. При оплате, когда клиент уходит на шлюз сбера тоже цена из товара, а не которую я поставил.

Подскажите, куда копать?
 

hennessy007

Новичок
Может кому пригодится

PHP:
add_filter( 'woocommerce_add_cart_item_data', 'add_pack_data_to_cart_item_data', 1, 2 );
function add_pack_data_to_cart_item_data( $cart_item_data, $product_id ){
    if( ! isset($_POST['amount']) )
        return $cart_item_data;
    $amount = esc_attr( $_POST['amount'] );
    if( empty($amount) )
        return $cart_item_data;
 
    $cart_item_data['custom_price'] = (float) $amount;
    $cart_item_data['unique_key'] = md5( microtime() . rand() );
    return $cart_item_data;
}

add_action( 'woocommerce_before_calculate_totals', 'change_conditionally_cart_item_price', 1, 1 );
function change_conditionally_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $targeted_product_id = 819;
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if($cart_item['data']->get_id() == $targeted_product_id && isset($cart_item['custom_price']) )
            $cart_item['data']->set_price($cart_item['custom_price']);
    }
}
 
Сверху Снизу