2016-03-18 4 views
0

Das Geschäft bietet physische Produkte und Workshop-Klassen. Es gibt viele Produktkategorien für physische Produkte. Es gibt eine Produktkategorie für Workshop-Klassen, genannt "Ticket". Ich möchte, dass die E-Mail-Rechnung "Workshop-Anweisungen/Richtlinien" (Ort des Veranstaltungsorts, Stornierungsbedingungen usw.) anzeigt, wenn die Bestellung eine Workshop-Klasse und "Rückgaberichtlinien" enthält, wenn sie physische Produkte enthält.WooCommerce Email Rechnung: Bedingte "Richtlinien" basierend auf Produktkategorie

Mit anderen Worten, wenn ein Produkt in der Bestellung eine Produktkategorie-ID hat, die "Ticket" entspricht, muss ich Workshop Anweisungen/Richtlinien anzeigen. Und wenn ein Produkt in der Bestellung eine Produktkategorie-ID hat, die ALLEN ANDEREN ALS "Ticket" entspricht, muss ich "Rückgaberichtlinien" anzeigen.

Ich "Art" habe das funktioniert.

Das Problem ist, dass ich das nur funktionieren kann, indem ich die Richtlinien ÜBER der Order Items Tabelle in der E-Mail anzeigen. Der Kunde möchte die Richtlinien bei BOTTOM, was sinnvoll ist.

Der Code, der funktioniert, befindet sich am Ende der Vorlage email-order-items.php. Innerhalb der foreach-Schleife in dieser Datei, habe ich dies:

$nwb_product_cat_ids[] = wc_get_product_cat_ids($item['product_id']);

Nach Abschluss der foreach-Schleife ist, wo ich einige Optimierungen (das mehrdimensionale Array auf eine einfache Anordnung zu reduzieren und Entfernen von Duplikaten) und dann der Bewertung Welche Richtlinien müssen angezeigt werden?

Ich habe in der Variablen $ nwb_ticket_cat_id den Produkttyp Werkstatt ("ticket") definiert. Hier sind die beiden, wenn Schleifen:

if (in_array($nwb_ticket_cat_id, $nwb_product_cat_ids_reduced)) { 
    $nwb_show_policy_class = true; 
} 

if (count($nwb_product_cat_ids_reduced) > 1 
|| 
!in_array($nwb_ticket_cat_id, $nwb_product_cat_ids_reduced)) { 
    $nwb_show_policy_return = true; 
} 

Dann habe ich dies:

<?php if ($nwb_show_policy_return) : ?> 
    <p>Here is our return policy:</p> 
<?php endif; ?> 

<?php if ($nwb_show_policy_class) : ?> 
    <p>Here is our class policy:</p> 
<?php endif; ?> 

Wie gesagt, das funktioniert, sondern nur durch den Gehalt über der Tabelle Bestelldetails angezeigt werden.

Ich habe versucht (eher blind, ich muss zugeben), Aktionshaken zu nutzen, vergeblich.

Hilfe gesucht. Ich bin mir sicher, dass ich mehr Informationen bereitstellen muss und werde dies gerne tun.

Antwort

0

Ich löste es. Hier ist der Code:

function nwb_show_policies_under_items_table($order, $sent_to_admin) { 
    if ($sent_to_admin) { 
     return; // Not showing on the admin notice. 
    } 
    $nwb_ticket_cat_id = NWB_TICKET_CAT_ID; // The product_cat ID corresponding to "Ticikets" 
    $nwb_product_cat_ids = array(); // init Array of product IDs for this order 
    $nwb_show_policy_class = false; // init 
    $nwb_show_policy_return = false; // init 
    $items = $order->get_items(); // Get the items for this order 
    // Populate the array of product category IDs for this order: 
    foreach ($items as $key => $item) { 
     $nwb_product_cat_ids[] = wc_get_product_cat_ids($item['product_id']); 
    } 
    // Reduce the multidimensional array to a flat one: 
    $nwb_product_cat_ids_reduced = call_user_func_array('array_merge', $nwb_product_cat_ids); 
    // Get rid of ducplicate product_cat IDS: 
    $nwb_product_cat_ids_reduced = array_unique($nwb_product_cat_ids_reduced); 

    // If our ticket product_cat_id is in there, then we need to show the Class Instructions/Policies 
    if (in_array($nwb_ticket_cat_id, $nwb_product_cat_ids_reduced)) { 
     $nwb_show_policy_class = true; 
    } 
    // And here's how we determine whether the order includes a product OTHER THAN "ticket" 
    if (count($nwb_product_cat_ids_reduced) > 1 || !in_array($nwb_ticket_cat_id, $nwb_product_cat_ids_reduced)) { 
     $nwb_show_policy_return = true; 
    } 

    // And now we show the policies if applicable: 
    if ($nwb_show_policy_class) { 
     echo nwb_woo_policy('class'); 
    } 
    if ($nwb_show_policy_return) { 
     echo nwb_woo_policy('other'); 
    } 
} 
add_action('woocommerce_email_after_order_table', 'nwb_show_policies_under_items_table', 10, 2); 

Die nwb_woo_policy() -Funktion einfach montiert und liefert den verbiage für jeden Fall (Klasse oder „Ticket“, und andere) mit einem Schalter zu konstruieren.

Verwandte Themen