Магазин предлагает физические продукты и классы мастерских. Существует множество категорий продуктов для физических продуктов. Существует одна категория продуктов для классов мастерских, называемых «билет». Я хочу, чтобы на счете-фактуре отображались «Инструкции / политики семинара» (место проведения, политика отмены и т. Д.), Если в заказе включен класс семинара и «Политика возврата», если он включает физические продукты.
Другими словами, если какой-либо продукт в заказе имеет идентификатор категории продуктов, соответствующий «билет», мне нужно показать инструкции / политики семинара. И если какой-либо продукт в заказе имеет идентификатор категории продукта, соответствующий НИЧЕГО ДРУГОГО, ЧЕМ «билет», мне нужно отобразить «Return Policies».
Я «вроде» делаю это.
Проблема заключается в том, что я могу заставить это работать, отображая политики выше ВЫБОР таблицы ордеров в письме. Клиент хочет политики в BOTTOM, что имеет смысл.
Код, который работает, находится внизу шаблона email-order-items.php. Внутри цикла foreach в этом файле у меня есть следующее:
$nwb_product_cat_ids[] = wc_get_product_cat_ids( $item['product_id'] );
После закрытия цикла foreach я делаю некоторую настройку (уменьшая многомерный массив до простого массива и удаляя дубликаты), а затем оценивая, какие политики должны отображаться.
Я определил категорию продукта семинара («билет») в переменной $ nwb_ticket_cat_id. Вот два цикла 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; }
Тогда у меня есть следующее:
<?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; ?>
Как я уже сказал, это работает, но только путем отображения содержимого ВЫШЕ таблицы данных о заказах.
Я пытался (скорее, слепо, я должен признать) использовать крючки действия, но безуспешно.
Требуется помощь. Я уверен, что мне нужно предоставить дополнительную информацию и с радостью сделаю это.
Я решил это. Вот код:
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 );
Функция nwb_woo_policy () просто собирает и возвращает словосочетание для каждого случая (класс, или «билет» и т. Д.), Используя конструкцию переключателя.