Factura de correo electrónico de WooCommerce: “Políticas” condicionales basadas en la categoría del producto

La tienda ofrece productos físicos y clases de talleres. Hay muchas categorías de productos para productos físicos. Hay UNA categoría de producto para clases de taller, llamada “boleto”. Deseo que la factura del correo electrónico muestre “Instrucciones / políticas del taller” (ubicación del lugar, política de cancelación, etc.) si el pedido incluye una clase de taller y “Políticas de devolución” si incluye productos físicos.

En otras palabras, si algún producto en la orden tiene un id. De categoría de producto correspondiente a “boleto”, necesito mostrar las Instrucciones / Políticas del Taller. Y si algún producto en la orden tiene un id. De categoría de producto que corresponde a CUALQUIER COSA QUE NO sea “boleto”, necesito mostrar “Políticas de devolución”.

Yo “en cierto modo” tengo esto funcionando.

El problema es que solo puedo hacer que esto funcione al mostrar las políticas ARRIBA de la tabla de artículos pedidos en el correo electrónico. El cliente quiere las políticas en el FONDO, lo cual tiene sentido.

El código que funciona se encuentra en la parte inferior de la plantilla email-order-items.php. Dentro del ciclo foreach en ese archivo, tengo esto:

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

Después del cierre del ciclo foreach es donde realizo algunos ajustes (reduciendo la matriz multidimensional a una matriz simple y eliminando los duplicados) y luego evaluando qué políticas deben mostrarse.

Definí la categoría de producto del taller (“ticket”) en la variable $ nwb_ticket_cat_id. Aquí están los dos bucles if:

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

Entonces tengo esto:

  

Here is our return policy:

Here is our class policy:

Como dije, esto funciona, pero solo mostrando el contenido ARRIBA de la tabla de detalles de la orden.

He intentado (bastante ciegamente, debo admitir) utilizar anzuelos de acción, sin éxito.

Se busca ayudante. Estoy seguro de que necesito brindar más información y lo haré con mucho gusto.

Lo solucioné Aquí está el código:

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

La función nwb_woo_policy () simplemente ensambla y devuelve la verborrea para cada caso (clase o “boleto” y otro) usando una construcción de interruptor.