我要实现的目标是根据客户添加到购物车中的物品向客户收取定金。仅特定项目需要支付押金。对于这些项目中的每一项,都会添加1x保证金。例如:Item1,Item2和Item3都需要支付10.00的押金,而Item4,Item5和Item6则不需要支付押金。因此,如果我的购物车中有以下物品
Product Qty Unit Price Subtotal
Item1 x1 £50.00 £50.00
Item2 x2 £30.00 £60.00
Item4 x1 £5.00 £5.00
Item6 x1 £2.99 £2.99
---------------------------------------------
Total: £117.99
Deposit: £30.00
Balance: £87.99
我需要收取30英镑的押金,因为这里有3项押金。然后,剩下的余额由客户在收货时支付。
我尝试了各种插件(WooCommerce存款,Yith存款/部分付款),但没有一个插件可以满足我的需求。
我已经通过在我的子主题的functions.php文件中添加了Hooks来解决问题,但是我对如何使其完全发挥作用感到困惑。
当前代码
add_action( 'woocommerce_cart_calculate_fees', 'tcg_calculate_deposit' );
function tcg_calculate_deposit( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Check if these products are in the cart
$deposit_items = array( '4359', '4336', '4331', '4320' );
$deposit = 10.00;
$matching = false;
foreach ( $cart_object->get_cart() as $item_values ) {
if( in_array( $item_values['product_id'], $deposit_items )) {
// for each item in array deposit + 1
// so if 3 deposit items deposit = 30.00
// set cart total to be the deposit amount so I can process this amount as payment through woocommerce
$cart_subtotal = $cart_object->subtotal_ex_tax;
$balance = $cart_subtotal - $deposit;
$cart_object->add_fee( __( 'Balance', 'woocommerce'), $balance, true );
break;
}
}
}
在这一刻,总和等于小计+余额的总和。我需要它作为定金。我不确定是否需要创建单独的函数来实现?
答案 0 :(得分:1)
这是一种实现方法:
首先:在产品的“常规”标签中为存款价格添加一个自定义字段。
function add_custom_fields() {
global $woocommerce, $post;
woocommerce_wp_text_input(
array(
'id' => '_deposit_price',
'label' => __( 'Deposit price(€)', 'woocommerce' ),
'placeholder' => '10.20',
'desc_tip' => 'true',
'description' => __( 'Enter the custom deposit price here.', 'woocommerce' )
)
);
}
add_action( 'woocommerce_product_options_general_product_data', 'add_custom_fields');
第二:将自定义字段的值作为元数据保存到产品中。
function custom_fields_save( $post_id ){
$woocommerce_text_field = sanitize_text_field( $_POST['_deposit_price'] );
if( is_numeric( $woocommerce_text_field ) || empty( $woocommerce_text_field ) ){
update_post_meta( $post_id, '_deposit_price', esc_attr( $woocommerce_text_field ) );
}
}
add_action( 'woocommerce_process_product_meta', 'custom_fields_save' );
第三次::过滤woocommerce_get_price,如果产品设置了定金,我们将退回定金而不是正常的产品价格。如果未设置存款价格,则返回0。
function filter_woocommerce_get_price( $price, $product ){
$product_id = $product->get_id();
$deposit_price = get_post_meta( $product_id, '_deposit_price', true );
if( ! empty( $deposit_price ) ) {
return $deposit_price;
}
return 0;
}
add_filter( 'woocommerce_get_price', 'filter_woocommerce_get_price', 10, 2 );
最后:
过滤多个值,以便在产品页面和结帐页面上像这样€34.50 Deposit: €10.00
设置价格。
function filter_woocommerce_get_price_html( $price, $product ){
$product_id = $product->get_id();
$deposit_price = get_post_meta( $product_id, '_deposit_price', true );
$product_price = get_post_meta( $product_id, '_price', true );
if( ! empty( $deposit_price ) ) {
return wc_price($product_price) . ' <i>Deposit: ' . wc_price($deposit_price) . '</i>';
}
return wc_price( $product_price );
}
add_filter( 'woocommerce_get_price_html', 'filter_woocommerce_get_price_html', 10, 2 );
add_filter( 'woocommerce_cart_product_price', 'filter_woocommerce_get_price_html', 10, 2 );
function filter_woocommerce_cart_product_subtotal( $product_subtotal, $product, $quantity ){
$product_id = $product->get_id();
$deposit_price = get_post_meta( $product_id, '_deposit_price', true );
$product_price = get_post_meta( $product_id, '_price', true );
if( ! empty( $deposit_price ) ) {
return wc_price( $product_price * $quantity ) . ' <i>Deposit: ' . wc_price( $deposit_price * $quantity ) . '</i>';
}
return wc_price( $product_price * $quantity );
}
add_filter( 'woocommerce_cart_product_subtotal', 'filter_woocommerce_cart_product_subtotal', 10, 3 );
现在,您只需要将剩余余额作为元数据添加到订单中,或将其作为费用添加到购物车中。
P.S。请记住在“产品”的“常规”标签中设置入金价格。