Reputation: 71
In WooCommerce I have enabled Perfect Brands Woocommerce plugin to display product Brands. I would like the Brand to appear before the product name throughout the whole cycle (single product page, cart, checkout, mini cart, order and emails).
I am able to display the related brand before the product name in cart and checkout pages, using "Adding Woocommerce Brands names to cart item product names" answer code lightly changed (using pbw-brand
plugin custom taxonomy):
// Display product brand in Cart and checkout pages
add_filter( 'woocommerce_cart_item_name', 'customizing_cart_item_name', 10, 3 );
function customizing_cart_item_name( $product_name, $cart_item, $cart_item_key ) {
$product = $cart_item['data']; // The product
$product_id = $cart_item['product_id']; // The product id
// Loop through the product brand names
foreach( wp_get_post_terms( $product_id, 'pwb-brand' ) as $wp_term )
$brand_names[] = $wp_term->name; // Set the brand names in an array
$brand_names_str = implode( ', ', $brand_names); // Set the brand names in a comma separated string array
$brand = $brand_names_str;
$product_permalink = $product->get_permalink( $cart_item );
if ( is_cart() && count( $brand_names ) > 0 )
return sprintf( '<a href="%s">%s %s</a>', esc_url( $product_permalink ), $brand, $product->get_name() );
elseif ( count( $brand_names ) > 0 )
return $brand . ' ' . $product_name;
else return $product_name;
}
But I don't know how to implement that for the Order and Email notifications.
Upvotes: 1
Views: 3966
Reputation: 253919
I have revisited your question code and added some additional functions to display the product brand on Order pages and on email notifications:
// Utility: Get the product brand term names (from the product ID)
function wc_get_product_brand( $product_id ) {
return implode(', ', wp_get_post_terms($product_id, 'pwb-brand', ['fields' => 'names']));
}
// Display product brand in Cart and checkout pages
add_filter( 'woocommerce_cart_item_name', 'customizing_cart_item_name', 10, 3 );
function customizing_cart_item_name( $product_name, $cart_item, $cart_item_key ) {
$product = $cart_item['data']; // The WC_Product Object
$permalink = $product->get_permalink(); // The product permalink
if( $brand = wc_get_product_brand( $cart_item['product_id'] ) ) {
if ( is_cart() )
return sprintf('<a href="%s">%s %s</a>', esc_url($permalink), $brand, $product->get_name());
else
return $brand . ' ' . $product_name;
}
return $product_name;
}
// Display product brand in order pages and email notification
add_filter( 'woocommerce_order_item_name', 'customizing_order_item_name', 10, 2 );
function customizing_order_item_name( $product_name, $item ) {
$product = $item->get_product(); // The WC_Product Object
$permalink = $product->get_permalink(); // The product permalink
if( $brand = wc_get_product_brand( $item->get_product_id() ) ) {
if ( is_wc_endpoint_url() )
return sprintf('<a href="%s">%s %s</a>', esc_url($permalink), $brand, $product->get_name());
else
return $brand . ' ' . $product_name;
}
return $product_name;
}
Code goes in function.php file of your active child theme (or active theme). Tested and works.
Upvotes: 3