我的客户可以通过商店积分(保存为用户数据)部分或全部支付订单。 如果商店信用足以支付整个订单,则客户只能选择商店信用付款方式,订单将被视为已付款(并调整客户的信用)。
但是对于部分付款,我会从订单总额中减去商店积分,这样客户就只剩下部分订单,可以通过他们选择的付款方式进行支付(此时商店积分方式不可用)。
为了实现此目的,我使用 $order->set_total 更改订单总计:
function update_customer_credit_and_display_payment_method($order) {
//Calculate new total
$order_total = (float) WC()->cart->total;
$customer_id = get_current_user_id();
if (!$customer_id ) { return; }
$customer_credit = get_deposit_credit($customer_id);
$applied_credit = 0;
if ($order_total > $customer_credit && $customer_credit > 0) {
$actual_payment_method = $order->get_payment_method_title();
$applied_credit = $customer_credit;
$payment_method = $actual_payment_method . ' & Deposit Credit (' . wc_price($applied_credit) . ')';
$order->set_payment_method_title($payment_method);
$order->set_total($order_total - $applied_credit);
$order->save();
}
}
add_action('woocommerce_checkout_create_order', 'update_customer_credit_and_display_payment_method', 10, 1);
问题是,当我将订单从“搁置”传递到“处理”时(如果有人通过支票或银行转帐付款),它会将订单总额恢复为其原始值(在应用押金之前)。当我将订单设置为完成时也会发生。 这是一个错误还是我没有使用正确的功能? 有没有办法永久改变订单总数? (不改变产品价格和税收)。 谢谢你。
您可以使用以下替代方案来避免此问题,将代码替换为:
// Add customer credit and update payment method title
add_action('woocommerce_checkout_create_order', 'add_customer_credit_and_update_payment_method_title', 10 );
function add_customer_credit_and_update_payment_method_title( $order ) {
if ( ! is_user_logged_in() ) return;
// Get customer deposit credit
$deposit_credit = (float) get_deposit_credit( get_current_user_id() );
if ( $deposit_credit > 0 && WC()->cart->get_total('edit') > $deposit_credit ) {
// Add deposit_credit as order custom meta data
$order->add_meta_data( 'deposit_credit', $deposit_credit, true );
// Update payment title
$order->set_payment_method_title( sprintf(
__('%s & Deposit Credit (%s)', 'woocommerce'),
$order->get_payment_method_title(),
wc_price( $deposit_credit, array( 'currency' => $order->get_currency() ) )
));
// The save() method is not needed as it's already included just after this hook;
}
}
// Remove dynamically the deposit credit from order total
add_filter( 'woocommerce_order_get_total', 'remove_deposit_credit_from_order_total', 10, 2 );
function remove_deposit_credit_from_order_total( $total, $order ) {
return $total - floatval($order->get_meta('deposit_credit'));
}
// Display in admin single order line totals, the deposit credit
add_filter( 'woocommerce_admin_order_totals_after_tax', 'display_admin_deposit_credit_line_total', 10 );
function display_admin_deposit_credit_line_total( $order_id ) {
$order = wc_get_order($order_id);
if ( $deposit_credit = floatval($order->get_meta('deposit_credit')) ) {
echo '<tr>
<td class="label">' .esc_html( 'Deposit Credit', 'woocommerce' ) . ':</td>
<td width="1%"></td>
<td class="total">' . wc_price( -$deposit_credit, array( 'currency' => $order->get_currency() ) ) . '</td>
</tr>';
}
}
代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。