1

我想在订单完成电子邮件中的产品中显示自定义 ACF 字段,我有这个钩子非常适用于非可变产品:

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

但是,虽然它对于电子邮件中的简单产品可以很好地显示我的自定义字段(日期和位置),但它不适用于可变产品。

我似乎无法理解为什么?

4

1 回答 1

1

我找到了解决方案。

当它是一个简单的产品时,产品 ID 是帖子 ID。但是,当它是可变产品时,他们会使用可变产品 ID,而不是帖子 ID。这意味着 ACF 字段不查看产品的帖子 ID,因此不会显示。

要为可变产品修复此问题,您必须从数组中获取父 ID:

 $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();
  }

完整代码是:

// 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;
}
于 2020-02-10T09:58:30.887 回答