Ich habe einige Produkte in WooCommerce und zwei Kategorien sind:
Name: ORG Test
Slug: org-test
Name: ORG Prod
Slug: org-prod
Ich möchte die Versandkosten pro Menge (15 USD pro Menge) berechnen, wenn das Produkt übereinstimmt org-prod
Kategorie:
Mein Codeversuch:
add_action('woocommerce_cart_calculate_fees', 'add_fees_on_ids');
function add_fees_on_ids() {
$total_act_fee = 0;
$business_plan_exist = false;
if (is_admin() && !defined('DOING_AJAX')) {return;}
foreach( WC()->cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
$quantity = $cart_item['quantity'];
$categories = wc_get_product_category_list( $product->get_id() );
if (strstr($categories, 'org-prod')) {
$business_plan_exist = true;
$total_act_fee = $total_act_fee + 15;
}
if ($business_plan_exist) {
WC()->cart->add_fee(__('Shipping Fees '), $total_act_fee);
}
}
}
Dies führt jedoch nicht zum gewünschten Ergebnis. Die Gebühr wird erhoben, aber die Summe ist falsch? Können Sie helfen, herauszufinden, warum nicht?
Ihr Code enthält einige Fehler und/oder könnte optimiert werden:
- Bei der Berechnung der Summen berücksichtigen Sie die Menge nicht
- Ihre if-Bedingung zum Hinzufügen der Gebühr befindet sich in Ihrer foreach-Schleife, sodass sie bei jeder Schleife überschrieben wird
- Die Verwendung von
WC()->cart
ist nicht notwendig, da $cart
bereits an die Callback-Funktion übergeben
- Verwenden
has_term()
gegen wc_get_product_category_list()
und strstr()
Sie erhalten also:
function action_woocommerce_cart_calculate_fees( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Specific categories: the term name/term_id/slug. Several could be added, separated by a comma
$categories = array( 'org-prod', 'categorie-1', 83 );
// Initialize
$total_act_fee = 0;
$amount = 15;
// Gets cart contents
foreach ( $cart->get_cart_contents() as $cart_item ) {
// Has certain category
if ( has_term( $categories, 'product_cat', $cart_item['product_id'] ) ) {
// Get quantity
$quantity = $cart_item['quantity'];
// Addition to the total
$total_act_fee += $amount * $quantity;
}
}
// Greater than
if ( $total_act_fee > 0 ) {
// Add fee
$cart->add_fee( __( 'Shipping Fees', 'woocommerce' ), $total_act_fee, true );
}
}
add_action( 'woocommerce_cart_calculate_fees', 'action_woocommerce_cart_calculate_fees', 10, 1 );