Исключить продукты по рассчитанному налогу в WooCommerce - PullRequest
0 голосов
/ 11 октября 2018

Налог - это чаевые, представляющие собой процент, который клиент выбирает из итогов корзины, но он должен рассчитывать только итоги по одной категории (продукты питания) и исключать другую (билеты на мероприятия).

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
   if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
    return;
   }

   if ( isset( $_POST['post_data'] ) ) {
       parse_str( $_POST['post_data'], $post_data );
   } else {
       $post_data = $_POST;
   }

   if (isset($post_data['propina'])) {
       global $woocommerce;
       $porcentaje = $post_data['propina']  / 100;
       $propina = ( $woocommerce->cart->cart_contents_total ) * $porcentaje;
       WC()->cart->add_fee( 'Propina Sugerida:', $propina );
   }
}

В нескольких словах ($ woocommerce-> cart-> cart_contents_total - общая стоимость билетов на мероприятия) * процент

РЕДАКТИРОВАТЬ: я думаю, что нашел решение, но у меня есть проблемы, когдапродукт является вариацией

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
    if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
    return;
    }

    if ( isset( $_POST['post_data'] ) ) {
    parse_str( $_POST['post_data'], $post_data );
    } else {
    $post_data = $_POST;
    }

    if (isset($post_data['propina'])) {
        global $woocommerce;

        $items = $woocommerce->cart->get_cart();
        $product_in_cart = false;
        $ticketpamount = 0;
        foreach($items as $item => $values) { 
            $_product =  $values['data'];
            $terms = get_the_terms( $_product->id, 'product_cat' );

        // second level loop search, in case some items have several categories
        foreach ($terms as $term) {
            $_categoryid = $term->term_id;
            if ( $_categoryid === 122 ) {
                //category is in cart!
                $price = get_post_meta($values['product_id'] , '_price', true);
                $ticketpamount += $price;
                $product_in_cart = true;
            }
        }
    } 

    $porcentaje = $post_data['propina']  / 100;
    if ( $product_in_cart ) {
         $propina = ( $woocommerce->cart->cart_contents_total - $ticketpamount ) * $porcentaje;
    } else {
        $propina = ( $woocommerce->cart->cart_contents_total ) * $porcentaje;
    }
    WC()->cart->add_fee( 'Propina Sugerida:', $propina );
   }
}

Ответы [ 2 ]

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

Нашли решение, добавили варианты и умножили на количество

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
    if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
    return;
    }

    if ( isset( $_POST['post_data'] ) ) {
    parse_str( $_POST['post_data'], $post_data );
    } else {
    $post_data = $_POST;
    }

    if (isset($post_data['propina'])) {
        global $woocommerce;

        $items = $woocommerce->cart->get_cart();
        $product_in_cart = false;
        $ticketpamount = 0;
        foreach($items as $item => $values) { 
            $_product =  $values['data'];
            $terms = get_the_terms( $_product->id, 'product_cat' );

        // second level loop search, in case some items have several categories
        foreach ($terms as $term) {
            $_categoryid = $term->term_id;
            if ( $_categoryid === 122 ) {
                //category is in cart!
                //check if product is a variation and * quantity
                 if ( $item['variation_id'] ) {
                    $price = get_post_meta($values['variation_id'] , '_price', true) * $values['quantity'];
                } else {
                    $price = get_post_meta($values['product_id'] , '_price', true);
                }
                $ticketpamount += $price;
                $product_in_cart = true;
            }
        }
    } 

    $porcentaje = $post_data['propina']  / 100;
    if ( $product_in_cart ) {
         $propina = ( $woocommerce->cart->cart_contents_total - $ticketpamount ) * $porcentaje;
    } else {
        $propina = ( $woocommerce->cart->cart_contents_total ) * $porcentaje;
    }
    WC()->cart->add_fee( 'Propina Sugerida:', $propina );
   }
}
0 голосов
/ 11 октября 2018

Вместо $woocommerce->cart->cart_contents_total вам нужно самостоятельно рассчитать промежуточные итоги:

$subtotal = 0;
foreach ( WC()->cart->get_cart() as $key => $i ) {
    $product_id = $i["product_id"];

    if ( your_product_should_be_included( $product_id ) ) {
        $subtotal += $i['line_subtotal'];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...