programing

Woocommerce에서 선택한 "일" 사용자 정의 필드를 기반으로 카트 항목 가격 계산

powerit 2023. 10. 20. 14:52
반응형

Woocommerce에서 선택한 "일" 사용자 정의 필드를 기반으로 카트 항목 가격 계산

Woocommerce에서는 다음 스레드 코드를 기반으로 사용자 지정 필드를 사용하여 제품의 가격을 계산합니다.Woocommerce 3에서 주문 항목으로 상품 사용자 정의 필드를 표시합니다.

// Add a custom field before single add to cart
add_action('woocommerce_before_add_to_cart_button', 'custom_product_price_field', 5);

function custom_product_price_field() {
echo '<div class="custom-text text">
<h3>Rental</h3>
<label>Start Date:</label>
<input type="date" name="rental_date" value="" class="rental_date" />
<label>Period Rental:</label>
<select name="custom_price" class="custom_price">
    <option value="" selected="selected">choosen period</option>
    <option value="2">2 days</option>
    <option value="4">4 days</option>
</select>
</div>';
}

// Get custom field value, calculate new item price, save it as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_field_data', 20, 3);

function add_custom_field_data($cart_item_data, $product_id, $variation_id) {
if (isset($_POST['rental_date']) && !empty($_POST['rental_date'])) {
        $cart_item_data['custom_data']['date'] = $_POST['rental_date'];
}
if (isset($_POST['custom_price']) && !empty($_POST['custom_price'])) {
        $_product_id = $variation_id > 0 ? $variation_id : $product_id;
        $product = wc_get_product($_product_id); // The WC_Product Object
        $base_price = (float) $product - > get_regular_price(); // Product reg price
        $custom_price = (float) sanitize_text_field($_POST['custom_price']);

        $cart_item_data['custom_data']['base_price'] = $base_price;
        $cart_item_data['custom_data']['new_price'] = $base_price/100 * 15 * $custom_price;
        $cart_item_data['custom_data']['rental'] = $custom_price;
}
if (isset($cart_item_data['custom_data']['new_price']) || isset($cart_item_data['custom_data']['date'])) {
        $cart_item_data['custom_data']['unique_key'] = md5(microtime().rand()); // Make each item unique
}
return $cart_item_data;
}

// Set the new calculated cart item price
add_action('woocommerce_before_calculate_totals', 'extra_price_add_custom_price', 20, 1);

function extra_price_add_custom_price($cart) {
if (is_admin() && !defined('DOING_AJAX'))
        return;

foreach($cart - > get_cart() as $cart_item) {
        if (isset($cart_item['custom_data']['new_price']))
                $cart_item['data'] - > set_price((float) $cart_item['custom_data']['new_price']);
}
}

// Display cart item custom price details
add_filter('woocommerce_cart_item_price', 'display_cart_items_custom_price_details', 20, 3);

function display_cart_items_custom_price_details($product_price, $cart_item, $cart_item_key) {
if (isset($cart_item['custom_data']['base_price'])) {
        $product = $cart_item['data'];
        $base_price = $cart_item['custom_data']['base_price'];
        $product_price = wc_price(wc_get_price_to_display($product, array('price' => $base_price))).
        '<br>';
        if (isset($cart_item['custom_data']['rental'])) {
                $product_price. = $cart_item['custom_data']['rental'] == '2' ? __("2 days") : __("4 days");
        }
}
return $product_price;
}

// Display in cart item the selected date
add_filter('woocommerce_get_item_data', 'display_custom_item_data', 10, 2);

function display_custom_item_data($cart_item_data, $cart_item) {
if (isset($cart_item['custom_data']['date'])) {

        $cart_item_data[] = array(
                'name' => __("Chosen date", "woocommerce"),
                'value' => date('d.m.Y', strtotime($cart_item['custom_data']['date'])),
        );
}
if (isset($cart_item['custom_data']['rental'])) {
        $cart_item_data[] = array(
                'name' => __("Period Rental", "woocommerce"),
                'value' => $cart_item['custom_data']['rental'] == '2' ? __("2 days") : __("4 days"),
        );
}
return $cart_item_data;
}

새로운 가격을 산정하기 위한 조건을 변경할 필요가 있습니다.현재 새로운 가격의 계산은 일수를 고려하지 않습니다.이것은 꼭 필요한 조건입니다.

사용자가 "2일"을 선택하면 계산은...$base_price/100 * 15 * value=2

사용자가 "4일"을 선택하면 계산은...$base_price/100 * 15 * value=4

내가 어떻게 그럴 수 있을까?

업데이트: 죄송합니다. 마지막으로 주신 코드를 추가하는 것을 잊었습니다.어떻게 그와 함께 할 수 있을까요?

// Save and display custom field in orders and email notifications (everywhere)
add_action( 'woocommerce_checkout_create_order_line_item', 'custom_fields_update_order_item_meta', 20, 4 );
function custom_fields_update_order_item_meta( $item, $cart_item_key, $values, $order ) {
if ( isset( $values['custom_data']['date'] ) ){
    $date = date( 'd.m.Y', strtotime( $values['custom_data']['date'] ) );
    $item->update_meta_data( __( 'Choosen Date', 'woocommerce' ), $date );
}
if ( isset( $values['custom_data']['rental'] ) ){
    $rental = $values['custom_data']['rental'] == '2' ? __("2 days") : __("4 days");
    $item->update_meta_data( __( 'Period Rental', 'woocommerce' ), $rental );
}
}

문제의 코드는 코드 포맷으로 인해 오류가 발생하며, 복사해서 붙여넣을 때 반드시 오류가 발생합니다.
예를들면- >될 필요가 있거나 또는$product_price. =있어야 할$product_price .=
이해하려면 PHP 연산자에 대해 참조하십시오.

아래에서는 대여 "기간"(일)을 기준으로 계산하는 올바른 방법을 찾을 수 있습니다.

// HERE your rental days settings
function get_rental_days_options() {
    return array(
        '2' => __("2 Days", "woocommerce"),
        '4' => __("4 Days", "woocommerce"),
    );
}

// Add a custom field before single add to cart
add_action('woocommerce_before_add_to_cart_button', 'display_single_product_custom_fields', 5);

function display_single_product_custom_fields() {
    // Get the rental days data options
    $options = array(''  => __("Choosen period", "woocommerce")) + get_rental_days_options();

    echo '<div class="custom-text text">
    <h3>'.__("Rental", "woocommerce").'</h3>
    <label>'.__("Start Date", "woocommerce").': </label>
    <input type="date" name="rental_date" value="" class="rental_date" />
    <label>Period:</label>
    <select class="rental-days" id="rental-days" name="rental_days">';

    foreach( $options as $key => $option ){
        echo '<option value="'.$key.'">'.$option.'</option>';
    }

    echo '</select>
    </div>';
}

// Get custom field value, calculate new item price, save it as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_custom_field_data', 20, 3);

function add_custom_field_data($cart_item_data, $product_id, $variation_id) {
    // HERE set the percentage rate to be applied to get the new price
    $percentage  = 2;

    if (isset($_POST['rental_date']) && !empty($_POST['rental_date'])) {
        $cart_item_data['custom_data']['start_date'] = $_POST['rental_date'];
    }

    if (isset($_POST['rental_days']) && !empty($_POST['rental_days'])) {
        $cart_item_data['custom_data']['rental_days'] = esc_attr($_POST['rental_days']);

        $_product_id = $variation_id > 0 ? $variation_id : $product_id;

        $product     = wc_get_product($_product_id); // The WC_Product Object
        $base_price  = (float) $product->get_regular_price(); // Get the product regular price

        $price_rate  = $cart_item_data['custom_data']['rental_days'] * $percentage / 100;

        $cart_item_data['custom_data']['base_price']  = $base_price;
        $cart_item_data['custom_data']['new_price']   = $base_price * $price_rate;
    }

    // Make each cart item unique
    if (isset($cart_item_data['custom_data']['rental_days']) || isset($cart_item_data['custom_data']['start_date'])) {
        $cart_item_data['custom_data']['unique_key'] = md5(microtime().rand());
    }

    return $cart_item_data;
}

// Set the new calculated cart item price
add_action('woocommerce_before_calculate_totals', 'extra_price_add_custom_price', 20, 1);
function extra_price_add_custom_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) {
        if (isset($cart_item['custom_data']['new_price']))
            $cart_item['data']->set_price((float) $cart_item['custom_data']['new_price']);
    }
}

// Display cart item custom price details
add_filter('woocommerce_cart_item_price', 'display_cart_items_custom_price_details', 20, 3);

function display_cart_items_custom_price_details($product_price, $cart_item, $cart_item_key) {
    if (isset($cart_item['custom_data']['base_price'])) {
        $product = $cart_item['data'];
        $base_price = $cart_item['custom_data']['base_price'];
        $product_price = wc_price(wc_get_price_to_display($product, array('price' => $base_price))). '<br>';

        if (isset($cart_item['custom_data']['rental_days'])) {
            $rental_days    = get_rental_days_options();
            $product_price .= $rental_days[$cart_item['custom_data']['rental_days']];
        }
    }
    return $product_price;
}

// Display in cart item the selected date
add_filter('woocommerce_get_item_data', 'display_custom_item_data', 10, 2);

function display_custom_item_data($cart_item_data, $cart_item) {
    if (isset($cart_item['custom_data']['start_date'])) {
        $cart_item_data[] = array(
            'name'  => __("Rental start date", "woocommerce"),
            'value' => date('d.m.Y', strtotime($cart_item['custom_data']['start_date'])),
        );
    }

    if (isset($cart_item['custom_data']['rental_days'])) {
        $rental_days    = get_rental_days_options();
        $cart_item_data[] = array(
            'name'  => __("Rental period", "woocommerce"),
            'value' => $rental_days[$cart_item['custom_data']['rental_days']],
        );
    }

    return $cart_item_data;
}

// Save and display custom field in orders and email notifications (everywhere)
add_action( 'woocommerce_checkout_create_order_line_item', 'custom_fields_update_order_item_meta', 20, 4 );

function custom_fields_update_order_item_meta( $item, $cart_item_key, $values, $order ) {
    if ( isset( $values['custom_data']['date'] ) ){
        $date = date( 'd.m.Y', strtotime( $values['custom_data']['date'] ) );
        $item->update_meta_data( __( 'Start date', 'woocommerce' ), $date );
    }
    if ( isset( $values['custom_data']['rental_days'] ) ){
        $rental_days = get_rental_days_options();
        $item->update_meta_data( __( 'Rental period', 'woocommerce' ), $rental_days[$values['custom_data']['rental_days']] );
    }
}

코드가 작동합니다.활성 하위 테마(또는 활성 테마)의 php 파일입니다.테스트를 거쳐 작동합니다.

enter image description here

언급URL : https://stackoverflow.com/questions/52023258/cart-item-price-calculation-based-on-chosen-days-custom-field-in-woocommerce

반응형