Скидка на основе пользовательских полей ввода продукта WooCommerce - PullRequest
2 голосов
/ 02 марта 2020

Я пытаюсь предоставить пользователю скидку на основе поля количества на странице отдельного продукта.

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

В админке продукта у меня есть ACF (расширенное настраиваемое поле) для "скидки для детей". ", поэтому в корзине я хочу дать эту скидку исходя из количества детей. Например, предположим, что для этого продукта пользователь покупает 5 билетов, 3 для взрослых и 2 для детей, я хочу рассчитать скидку для этих 2 детей.

Что я пробовал до сих пор:

add_action( 'woocommerce_before_add_to_cart_button', 'custom_product_price_field', 5 );

function custom_product_price_field(){

    echo '<div class="custom-text text">
              <p>Quantity of adults:</p>
              <input type="text" name="qtty_adults" value="" title="Quantity Adults" class="qtty-field">
          </div>
          <div class="custom-text text">
              <p>Quantity of children:</p>
              <input type="text" name="qtty_kids" value="" title="Quantity Kids" class="qtty-field">
          </div>';

}


add_action('woocommerce_cart_calculate_fees' , 'add_user_discounts');

function add_user_discounts( WC_Cart $cart ){

    global $product;

    $qtty_kids = (float) sanitize_text_field( $_POST['qtty_kids'] );
    $discount_per_kid = (float) get_field('children_discount', $product->id);


    $discount = $qtty_kids * $discount_per_kid;

    $cart->add_fee( 'Discount for children', -$discount);
}

При этом скидка всегда составляет $ 0

Кто-нибудь может мне помочь, как это сделать?

1 Ответ

2 голосов
/ 02 марта 2020

Ваш код немного устарел, с некоторыми ошибками, и много чего не хватает, чтобы получить то, что вы ожидаете ...

Попробуйте вместо этого следующее (обновлено) :

add_action( 'woocommerce_before_add_to_cart_button', 'custom_product_price_field', 5 );
function custom_product_price_field(){

    echo '<div class="custom-text text">
        <p>'.__("Quantity of adults:").'</p>
        <input type="text" name="qtty_adults" value="" title="'.__("Quantity Adults").'" class="qtty-field">
    </div>
    <div class="custom-text text">
        <p>'.__("Quantity of children:").'</p>
        <input type="text" name="qtty_kids" value="" title="'.__("Quantity Kids").'" class="qtty-field">
    </div>';
}

// Add selected add-on option as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data_callback', 10, 3 );
function filter_add_cart_item_data_callback( $cart_item_data, $product_id, $variation_id ) {
    if ( isset( $_POST['qtty_kids'] )  && $children_discount = get_field( 'children_discount', $product_id ) ) {
        $cart_item_data['children_discount'] = (float) $children_discount - (float) sanitize_text_field( $_POST['qtty_kids'] );
        $cart_item_data['unique_key']        = md5( microtime().rand() ); // Make each item unique
    }
    return $cart_item_data;
}

// Set a discount based a product custom field(s)
add_action('woocommerce_cart_calculate_fees' , 'add_children_discount', 10, 1 );
function add_children_discount( $cart ){
    if ( is_admin() && ! defined('DOING_AJAX') )
        return;

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

    $discount = 0; // Initialising

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        if( isset( $cart_item['children_discount'] ) ) {
            $discount += $cart_item['children_discount'];
        }
    }

    if ( $discount > 0 )
        $cart->add_fee( __("Discount for children", "woocommerce"), -$discount );
}

Протестировано и работает.


Связано:

Скидка на корзину в зависимости от количества в Woocommerce 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...