首页 > 解决方案 > WooCommerce get_name 进入 ACF 中继器字段

问题描述

我现在正面临以下挑战,如果有人能帮助我,我将不胜感激。

我的目标是将 WooCommerce 订单数据保存在 ACF 中继器字段中。我使用的代码如下:

function create_post_after_order( $order_id ) {
  if (  $order_id instanceof WC_Order ){
    return;
  }
    
  $order = wc_get_order( $order_id );
  $order_items = $order->get_items(); 
    
    foreach ( $order_items as $item_id => $item_data ) {
    $product_name.= $item_data->get_name();
    $product_id.= $item_data->get_product_id();
    $product_quantity.= $item_data->get_quantity();
}
    
    $new_post = array(
    'post_title' => "Order {$order_id}",
    'post_date' => date('Y-m-d H:i:s'),
    'post_author' => $user_ID,
    'post_type' => 'groeiproces',
    'post_status' => 'publish',
  );    
  $post_id = wp_insert_post($new_post);

// repeater field with one subfield
$classs_field_key = 'field_61645b866cbd6';
$classs_subfield_key = 'field_61645b916cbd7';
$classs_items = array($product_name, $product_name);

foreach ($classs_items as $classs_items_value) {
    $classs_value[] = array(
    $classs_subfield_key => $classs_items_value);
    update_field($classs_field_key, $classs_value, $post_id);
}
    
}
add_action( 'woocommerce_thankyou', 'create_post_after_order', 10, 1 );

问题是这结合了订单数据并将其保存到转发器字段。 当前的

我想要的是每个产品名称都保存在一个新的转发器字段中。 理想的

谁能指出我正确的方向?提前致谢。

在 Naveen 的帮助下,我能够将我的代码升级到以下内容:

//Creër post met orderdetails na bestelling

function create_post_after_order( $order_id ) {
  if (  $order_id instanceof WC_Order ){
    return;
  }

//Zoek de order ID's met bijbehorende items
     
  $order = wc_get_order( $order_id );
  $order_items = $order->get_items(); 

//Loop door alle orders voor de onderstaande orderdata
    
    foreach ( $order_items as $item_id => $item_data ) {
    $product_ids[]       = $item_data->get_product_id(); // ID's van de producten
    $product_names[]     = $item_data->get_name(); // Namen van de producten
    $product_quantities[] = $item_data->get_quantity(); // Aantal van de producten
    $product_prices[] = $product->get_price(); //Prijs per product
    $ordeline_subtotals[]     = $item_data->get_subtotal(); //Subtotaal van de orderregels

}

//Maak een nieuwe post aan
    
    $new_post = array(
    'post_title' => "Order {$order_id}", // Definieer titel van de post
    'post_date' => date('Y-m-d H:i:s'), // Voeg publicatiedatum toe
    'post_author' => $user_ID, // Definieer de klant als auteur
    'post_type' => 'groeiproces', // Definieer CPT
    'post_status' => 'publish', // Publiceer post
  );    
  $post_id = wp_insert_post($new_post);
    
//Verbind de ACF velden

    $orderdetails_key = 'field_61645b866cbd6';
    $product_id_key = 'field_6166a67234fa3';
    $product_name_key = 'field_61645b916cbd7';
    $product_quantity_key = 'field_6165bd2101987';
    $product_price_key = 'field_6166a68134fa4';
    $ordeline_subtotal_key = 'field_6166a68934fa5';
    $product_id = $product_ids;
    $product_name = $product_names;
    $product_quantity = $product_quantities;
    $product_price = $product_prices;
    $ordeline_subtotal = $ordeline_subtotals;

//Save de orderdata in het ACF repeater field

foreach ($product_id as $index => $product_id) {
    $orderdetails_value[] = array(
    $product_id_key => $product_id, 
    $product_name_key => $product_name[$index],
    $product_quantity_key => $product_quantity[$index],
    $product_price_key => $product_price[$index],
    $ordeline_subtotal_key => $ordeline_subtotal[$index],
);
    update_field( $orderdetails_key, $orderdetails_value, $post_id );
}
    
}
add_action( 'woocommerce_thankyou', 'create_post_after_order', 10, 1 );

这给了我以下很好的情况。

现在的情况

我唯一仍在寻找的是订单中的产品价格。我不完全确定它是否能够得到这个,因为我只在网上找到了主动价格选项。也许可以将 $ordeline_subtotals 除以 $product_quantities。

有人知道如何设置吗?

提前致谢!

标签: woocommerceadvanced-custom-fields

解决方案


我在您的代码中发现了两个问题:

  1. 您正在连接 $product_name 而不是将它们放入数组中。
  2. 您正在更新 for 循环内的字段,而不是循环外。

这两个问题在下面的代码中得到了修复......记下 $product_names 作为数组,然后我们在最后循环这个数组以为您的转发器字段创建值。

function create_post_after_order( $order_id ) {
  if (  $order_id instanceof WC_Order ){
    return;
  }
    
  $order = wc_get_order( $order_id );
  $order_items = $order->get_items(); 
    
    
    foreach ( $order_items as $item_id => $item_data ) {
    $product_names[]     = $item_data->get_name();
    $product_ids[]       = $item_data->get_product_id();
    $product_quantities[] = $item_data->get_quantity();
}
    
    $new_post = array(
    'post_title' => "Order {$order_id}",
    'post_date' => date('Y-m-d H:i:s'),
    'post_author' => $user_ID,
    'post_type' => 'groeiproces',
    'post_status' => 'publish',
  );    
  $post_id = wp_insert_post($new_post);

// repeater field with one subfield
$classs_field_key = 'field_61645b866cbd6';
$classs_subfield_key = 'field_61645b916cbd7';
$classs_items = $product_names;

foreach ($classs_items as $classs_items_value) {
    $classs_value[] = array(
    $classs_subfield_key => $classs_items_value);
}

update_field($classs_field_key, $classs_value, $post_id);

    
}
add_action( 'woocommerce_thankyou', 'create_post_after_order', 10, 1 );

请注意,我稍微更改了数组变量名称(例如 $product_name 现在是 $product_names,其中包含 's',并且同样适用于其他变量)。

编辑(回答 OP 提出的其他问题):

要获取商品的价格,我们首先需要从订单中获取对应商品对象的实例。这在 foreach 循环中按如下方式完成:


$product_details = $item_data->get_product();

// Get the product price that customer paid
$product_price          = $product_details->get_price(); 

//Get sale price (i.e discounted price, if it exists)
$product_regular_price  = $product_details->get_sale_price(); 

//Regular price.
$product_sale_price     = $product_details->get_regular_price(); 

假设您可能只需要产品价格,那么您的 foreach 循环可能如下所示:

foreach ( $order_items as $item_id => $item_data ) {
    $product_ids[]       = $item_data->get_product_id(); // ID's van de producten
    $product_names[]     = $item_data->get_name(); // Namen van de producten
    $product_quantities[] = $item_data->get_quantity(); // Aantal van de producten

    $product_details = $item_data->get_product();

    // Get the product price that customer paid
    $product_prices[]          = $product_details->get_price(); 

    $ordeline_subtotals[]     = $item_data->get_subtotal(); //Subtotaal van de orderregels

}

然后,您可以$product_price在转发器字段的 foreach 循环中使用。


推荐阅读