Добавить комиссию за корзину из переменной (баланс клиента) в woocommerce

Я пытаюсь добавить комиссию (скидку) при оформлении заказа на основе баланса учетной записи пользователя. Мы возвращаем деньги практически по каждому заказу, а создание купонов очень утомительно. Я создал настраиваемое пользовательское поле, в котором я могу быстро установить сумму возмещения в качестве кредитной стоимости, которая затем применяется при оформлении заказа в следующем порядке.

Пока все работает, за исключением того, что комиссия появляется при загрузке кассы, а затем снова исчезает. Он работает, если я устанавливаю статическую сумму, но при установке комиссии из переменной я получаю поведение, указанное выше.

Добавить настраиваемое поле пользователя

add_action( 'show_user_profile', 'extra_user_profile_fields' );
add_action( 'edit_user_profile', 'extra_user_profile_fields' );

function extra_user_profile_fields( $user ) { ?>
    <h3><?php _e("FoodBox Info", "blank"); ?></h3>
    <table class="form-table">
    <tr>
    <th><label for="account-balance"><?php _e("Account Balance"); ?></label></th>
        <td>
            <input type="number" name="account-balance" id="account-balance" value="<?php echo esc_attr( get_the_author_meta( 'account-balance', $user->ID ) ); ?>" class="number" /><br />
            <span class="description"><?php _e("Credit balance ie -30"); ?></span>
        </td>
    </tr>
    </table>
<?php }

//save in db
add_action( 'personal_options_update', 'save_extra_user_profile_fields' );
add_action( 'edit_user_profile_update', 'save_extra_user_profile_fields' );

function save_extra_user_profile_fields( $user_id ) {
    if ( !current_user_can( 'edit_user', $user_id ) ) { 
        return false; 
    }
    update_user_meta( $user_id, 'account-balance', $_POST['account-balance'] );
}

Получите и примените кредитный баланс при оформлении заказа, если он есть у пользователя

//load at checkout
add_action( 'woocommerce_cart_calculate_fees', 'custom_discount', 10, 1 );

function custom_discount( $user ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

        $discount =  esc_attr( get_the_author_meta( 'account-balance', $user->ID ) );

     if (get_the_author_meta( 'account-balance', $user->ID ) ){
        WC()->cart->add_fee('Credit', $discount, true);   
     }
}

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


person southafricanrob    schedule 01.05.2020    source источник


Ответы (1)


Параметр, переданный в woocommerce_cart_calculate_fees, не $user, а $cart_object

function custom_discount( $cart_object ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $user_id = get_current_user_id();

    $discount = get_user_meta( $user_id, 'account-balance', true );

    // True
    if ( $discount ) {
        $cart_object->add_fee( 'Credit', $discount );  
    }
}
add_action( 'woocommerce_cart_calculate_fees', 'custom_discount', 10, 1 );
person 7uc1f3r    schedule 01.05.2020