woocommerce - 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。
有人知道如何设置吗?
提前致谢!
解决方案
我在您的代码中发现了两个问题:
- 您正在连接 $product_name 而不是将它们放入数组中。
- 您正在更新 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 循环中使用。
推荐阅读
- rust - Rust:迭代 ASCII 字符串字符的最有效方法
- makefile - Makefile- 来自各种组件的文件 .c
- python - Python VLC 行为 - 播放后如何从 media_list 中删除以及我如何知道现在正在播放什么
- c# - 如何确保我的 POST 请求成功?有人可以在下面批准我的代码吗?
- api - 环回 4 中的哪里是创建用户表和 userCredentials 的脚本?
- java - Java 应用程序可以直接连接到 EnterpriseDB Advanced Server 吗?
- php - ErrorException flock() 期望参数 1 是资源
- android - Kotlin Glide 在暗模式下不显示图像
- java - Eclipse Collections - Sets 是否有 containsAny() 方法?
- javascript - 给定的还原器正在覆盖其他还原器在本机反应中设置的状态