Search code examples
phpwordpresswoocommerceadvanced-custom-fieldsacfpro

ACF custom fields in WooCommerce E-Mail template


I'm wanting to display custom ACF fields in a product within the order complete e-mail, I have this hook which works great for none-variable products:

add_filter( 'woocommerce_order_item_name', 'custom_order_item_name', 10, 2 );
function custom_order_item_name( $item_name, $item ) {
  // Targeting email notifications only
  if( is_wc_endpoint_url() )
      return $item_name;

  // Get the WC_Product object (from order item)
  $product = $item->get_product();
  if( $date = get_field('date', $product->get_id()) ) {
    $item_name .= '<br /><strong>' . __( 'Date', 'woocommerce' ) . ': </strong>' . $date;
  }
  if( $location = get_field('location', $product->get_id()) ) {
    $item_name .= '<br /><strong>' . __( 'Location', 'woocommerce' ) . ': </strong>' . $location;
  }
  return $item_name;
}

However, while it displays my custom fields (date and location) fine for simple products within the e-mail, it does not for variable products.

I can't seem to understand why?


Solution

  • I found the solution.

    When it is a simple product, the product ID is the post ID. However when it is a variable product, they then use a variable product ID, not the post ID. Which means the ACF fields are not looking at the post ID of the product, so won't display.

    To fix this for variable products you must get the parent ID from the array:

     $parent_id=$product->get_parent_id();
      // If it is a variable product, get the parent ID
      if($parent_id){
        $product_id = $parent_id;
      // else, it is a simple product, get the product ID
      }else{
        $product_id = $product->get_id();
      }
    

    Full code is:

    // Display Items Shipping ACF custom field value in email notification
    add_filter( 'woocommerce_order_item_name', 'custom_order_item_name', 10, 2 );
    function custom_order_item_name( $item_name, $item ) {
      // Targeting email notifications only
      if( is_wc_endpoint_url() )
          return $item_name;
    
      // Get the WC_Product object (from order item)
      $product = $item->get_product();
    
     $parent_id=$product->get_parent_id();
      // If it is a variable product, get the parent ID
      if($parent_id){
        $product_id = $parent_id;
      // else, it is a simple product, get the product ID
      }else{
        $product_id = $product->get_id();
      }
    
      if( $date = get_field('date', $product_id) ) {
        $item_name .= '<br /><strong>' . __( 'Date', 'woocommerce' ) . ': </strong>' . $date;
      }
      if( $location = get_field('location', $product_id) ) {
        $item_name .= '<br /><strong>' . __( 'Location', 'woocommerce' ) . ': </strong>' . $location;
      }
      return $item_name;
    }