Вот один из способов сделать это:
Во-первых: Добавить настраиваемое поле для цены депозита на общую вкладку продуктов.
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 );
Теперь вам нужно всего лишь добавить остаток заказа в качестве метаданных или добавить его в корзину в качестве платы.
PS Не забудьте установить цену депозита в общей вкладке продуктов.