Klient zgłosił takie zapotrzebowanie, żeby na stronie zamówienia pod produktem wyświetlał się brand produktu. Wynika to z tego, że ma wiele towarów o podobnych nazwach ale od innych producentów i osobie obsługującej zamówienia i magazyn ułatwi to życie.
Oto gotowy kod z uwzględnieniem, że produkty mogą być wariantami.
add_action('woocommerce_before_order_itemmeta', 'add_brand_above_variation_admin', 10, 3);
function add_brand_above_variation_admin($item_id, $item, $order) {
// Sprawdź, czy to produkt (WC_Order_Item_Product)
if (!is_a($item, 'WC_Order_Item_Product')) {
return;
}
// Only in admin
if (!is_admin()) return;
$product = $item->get_product();
if (!$product) return;
// Get brand terms from variation first
$brand_terms = wp_get_post_terms($product->get_id(), 'product_brand');
// Fallback to parent product if needed
if (empty($brand_terms) && $product->is_type('variation')) {
$brand_terms = wp_get_post_terms($product->get_parent_id(), 'product_brand');
}
if (!empty($brand_terms) && !is_wp_error($brand_terms)) {
$brand_names = wp_list_pluck($brand_terms, 'name');
$brand_label = implode(', ', $brand_names);
echo '<div class="woocommerce-brand-info" style="margin-bottom: 5px;">';
echo '<strong>Brand:</strong> ' . esc_html($brand_label);
echo '</div>';
}
}
Ten kod umieści nam nazwę brandu pod nazwą produktu. W kodzie strony powinno wyglądać to tak:
<tr class="woocommerce-table__line-item">
<td class="woocommerce-table__product-name product">
Awesome Product Name
<div class="woocommerce-brand-info">Brand: Nike</div> 👈 Appears here!
<div class="wc-order-item-variation">Size: L</div>
</td>
</tr>
Wywołując funkcję musimy sprawdzić czy będziemy działać tylko na produkcie bo dostaniemy błąd krytyczny!!
🧠 Dlaczego tak się dzieje?
Hook woocommerce_before_order_itemmeta jest wywoływany dla każdego typu elementu zamówienia:
- Produkt (
WC_Order_Item_Product) ✅ - Wysyłka (
WC_Order_Item_Shipping) ❌ - Podatek, kupon itp.
Dlatego musimy sprawdzić typ $item, zanim użyjemy get_product().