Я пробовал какое-то время, чтобы получить эту работу, но я не нашел решения, которое делает именно то, что нам нужно, и я далек от эксперта по PHP, поэтому я немного потерян.
Мы используем WooCommerce и WooTickets. Цель состоит в том, чтобы добавить 5% комиссию за «плату за обслуживание» только для продуктов в категории «Билеты» (ID: 34).
Мы нашли эту шутку кода, которая добавляет фиксированную стоимость на основе категории продукта:
// Add Service Fee to Category function woo_add_cart_fee() { $category_ID = '23'; global $woocommerce; foreach ($woocommerce->cart->cart_contents as $key => $values ) { // Get the terms, ie category list using the ID of the product $terms = get_the_terms( $values['product_id'], 'product_cat' ); // Because a product can have multiple categories, we need to iterate through the list of the products category for a match foreach ($terms as $term) { // 23 is the ID of the category for which we want to remove the payment gateway if($term->term_id == $category_ID){ $excost = 6; } } $woocommerce->cart->add_fee('Service Fee', $excost, $taxable = false, $tax_class = ''); } } add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
Основная проблема с этим решением заключается в том, что он добавляет фиксированную стоимость, тогда как нам требуется процентная стоимость.
Мы также нашли этот фрагмент кода из самих WooThemes:
/** * Add a 1% surcharge to your cart / checkout * change the $percentage to set the surcharge to a value to suit * Uses the WooCommerce fees API * * Add to theme functions.php */ add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' ); function woocommerce_custom_surcharge() { global $woocommerce; if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; $percentage = 0.05; $surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage; $woocommerce->cart->add_fee( 'Service Fee', $surcharge, true, 'standard' ); }
Но еще раз, есть несколько проблем с этим решением …
1) Категория продукта не учитывается. 2) Он добавляет плату, основанную на всей стоимости корзины, но она должна добавлять только 5% -ную плату за продукты в категории продуктов «Билеты», а не за всю корзину
У меня была такая же проблема, и я нашел фрагмент кода, который установил меня на правильный путь. Для жизни меня я не могу найти оригинальный сайт, на котором размещен фрагмент, но вот моя переработанная версия.
function df_add_ticket_surcharge( $cart_object ) { global $woocommerce; $specialfeecat = 86; // category id for the special fee $spfee = 0.00; // initialize special fee $spfeeperprod = 0.05; //special fee per product foreach ( $cart_object->cart_contents as $key => $value ) { $proid = $value['product_id']; //get the product id from cart $quantiy = $value['quantity']; //get quantity from cart $itmprice = $value['data']->price; //get product price $terms = get_the_terms( $proid, 'product_cat' ); //get taxonamy of the prducts if ( $terms && ! is_wp_error( $terms ) ) : foreach ( $terms as $term ) { $catid = $term->term_id; if($specialfeecat == $catid ) { $spfee = $spfee + $itmprice * $quantiy * $spfeeperprod; } } endif; } if($spfee > 0 ) { $woocommerce->cart->add_fee( 'Ticket Concierge Charge', $spfee, true, 'standard' ); } } add_action( 'woocommerce_cart_calculate_fees', 'df_add_ticket_surcharge' );
Это добавит 5% доплаты каждому элементу в корзине с категорией билета (id: 86). Надеюсь, это поможет вам, если вы еще не нашли решения.
спасибо за публикацию этого выше кода. Мне нужно было именно это, но для меня были проблемы. Я не хотел, чтобы эта категория была ее частью, я хотел, чтобы она распространялась на все продукты, и я также требовал фиксированную плату за продукт.
Другая проблема, с которой я столкнулся, заключалась в том, что если бы у меня было 2 разных продукта в корзине, это вычислило бы только 1 продукт. поэтому я провел некоторое исследование и нашел способ рассчитать общее количество продуктов в корзине. Итак, вот последний код, с которым я вышел. Думал, что это может помочь кому-то, кто ищет аналогичный ответ
/** add handling fee **/ function df_add_handling_fee( $cart_object ) { global $woocommerce; // $specialfeecat = 3711; // category id for the special fee $spfee = 0.00; // initialize special fee $spfeeperprod = 10; //special fee per product //Getting Cart Contents. $cart = $woocommerce->cart->get_cart(); //Calculating Quantity foreach($cart as $cart_val => $cid){ $qty += $cid['quantity']; } foreach ( $cart_object->cart_contents as $key => $value ) { $proid = $value['product_id']; //get the product id from cart //$quantiy = $value['quantity']; //get quantity from cart $itmprice = $value['data']->price; //get product price $terms = get_the_terms( $proid, 'product_cat' ); //get taxonamy of the prducts if ( $terms && ! is_wp_error( $terms ) ) : foreach ( $terms as $term ) { //$catid = $term->term_id; //if($specialfeecat == $catid ) { $spfee = $qty * $spfeeperprod; //} } endif; } if($spfee > 0 ) { $woocommerce->cart->add_fee( 'Handling Fee', $spfee, true, 'standard' ); } } add_action( 'woocommerce_cart_calculate_fees', 'df_add_handling_fee' );
Как вы можете видеть, я только что прокомментировал детали из исходного кода. Надеюсь, кто-то может извлечь из этого пользу 🙂