从 woocommerce 中的变量(客户余额)添加购物车费用
Add cart fee from a variable (customer balance) in 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);
}
}
似乎在计算运费时信用费用被覆盖/重置,但即使我禁用运费,我也会遇到同样的行为。
传给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 );
我正在尝试根据用户帐户余额在结帐时添加费用(折扣)。我们最终几乎每笔订单都会退款,而且创建优惠券非常繁琐。我创建了一个自定义用户字段,我可以在其中快速将退款金额设置为信用值,然后在下一个订单的结帐时应用该信用值。
到目前为止一切正常,除了费用在结帐加载时出现然后又消失。如果我设置一个静态金额,它会起作用,但是当从一个变量设置费用时,我会得到上面的行为。
添加用户自定义字段
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);
}
}
似乎在计算运费时信用费用被覆盖/重置,但即使我禁用运费,我也会遇到同样的行为。
传给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 );