WooCommerce Депозит и корзина Общие расчеты - PullRequest
0 голосов
/ 13 октября 2018

То, чего я пытаюсь добиться - это взимать с клиентов депозит в зависимости от товаров, которые они добавляют в корзину.Только определенные предметы требуют залога.За каждый из этих пунктов добавляется 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 моей дочерней темы, но я не знаю, как сделать его полностью функциональным.

Текущий код

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;
        }

    }

}

В тот момент, когда итоговая сумма составляет сумму промежуточного итога + сальдо.Мне нужно, чтобы это был депозит.Я не уверен, что мне нужно создавать отдельные функции для достижения?

1 Ответ

0 голосов
/ 14 октября 2018

Вот один из способов сделать это:

Во-первых: Добавить настраиваемое поле для цены депозита на общую вкладку продуктов.

    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 Не забудьте установить цену депозита в общей вкладке продуктов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...