Установить цены на основе продолжительности бронирования WooCommerce - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть сценарий, в котором мне нужно изменить общую стоимость аренды, отрегулировав стоимость блока бронирования в зависимости от его продолжительности.Продолжительность бронирования определяется заказчиком по 4 дня.

В течение 4 дней (минимальная продолжительность) = базовая стоимость + стоимость блока. В течение 8 дней (максимальная продолжительность) = базовая стоимость + стоимость блока + (стоимость блока * 0,75).

На основе Измените цену товара в корзине WooCommerce и оформите код ответа, где я внес некоторые изменения.Вот мой код:

add_action( 'woocommerce_before_calculate_totals', 'custom_cart_item_price', 10, 1 );
function custom_cart_item_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item ){
        $booking_id = $cart_item['booking']['_booking_id'];
        $booking = get_wc_booking( $booking_id );
        $base_cost  = get_post_meta( $cart_item['product_id'], '_wc_booking_cost', true );
        $block_cost = get_post_meta( $cart_item['product_id'], '_wc_booking_block_cost', true );
        if ( $booking ) {
            $duration   = $cart_item['booking']['duration'];        
            if ($duration == 8) {
                $new_price = $base_cost +$block_cost + ($block_cost * 0.75);    //Calculate the new price           
                $cart_item['data']->set_price( $new_price ); // Set the new price
            }
        }       
    }
}

Это прекрасно работает, но мне интересно, есть ли способ, которым я могу установить это постоянно, используя такое действие, как woocommerce_bookings_pricing_fields, чтобы скидочная цена отображалась на самой странице продукта.

1 Ответ

0 голосов
/ 22 декабря 2018

Мне удалось добиться этого, программно добавив диапазон цен к бронируемым продуктам:

add_action( 'woocommerce_process_product_meta_booking', 'modify_product_costs', 100, 1 );

function modify_product_costs( $product_id ){
  $product = wc_get_product( $product_id );

  // We check that we have a block cost before
  if ( $product->get_block_cost() > 0 ){
    // Set base cost
    $new_booking_cost = ( $product->get_block_cost() * 0.5 ) + 100;

    $product->set_cost( $new_booking_cost ); 
    $product->save(); // Save the product data

    //Adjust cost for 8 days
    $pricing = array(
    array(
    'type' => 'blocks',
    'cost' => 0.875,
    'modifier' => 'times',
    'base_cost' => $new_booking_cost,
    'base_modifier' => 'equals',
    'from' => 2,
    'to' => 2
    )
    );

    update_post_meta( $product_id, '_wc_booking_pricing', $pricing );
 }
}

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

enter image description here

Вдохновение пришло от здесь , здесь , здесь и здесь

...