WooCommerce get_name 进入 ACF Repeater 字段
WooCommerce get_name into ACF Repeater Field
我现在面临以下挑战,如果有人能帮助解决,我将不胜感激。
我的目标是将 WooCommerce 订单数据保存在 ACF Repeater 字段中。我使用的代码如下:
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 );
问题在于,这结合了订单数据并将其保存到转发器字段中。
Current
我想要的是每个产品名称都保存在一个新的转发器字段中。
Ideal
谁能指出我正确的方向?提前致谢。
在 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 );
这给了我以下很棒的情况。
current situation
我唯一还在寻找的是订单中的产品价格。我不确定它是否能够得到这个,因为我只在网上找到了有效的价格选项。也许可以将 $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
}
然后您可以在转发器字段的 foreach 循环中使用 $product_price
。
我现在面临以下挑战,如果有人能帮助解决,我将不胜感激。
我的目标是将 WooCommerce 订单数据保存在 ACF Repeater 字段中。我使用的代码如下:
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 );
问题在于,这结合了订单数据并将其保存到转发器字段中。 Current
我想要的是每个产品名称都保存在一个新的转发器字段中。 Ideal
谁能指出我正确的方向?提前致谢。
在 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 );
这给了我以下很棒的情况。
current situation
我唯一还在寻找的是订单中的产品价格。我不确定它是否能够得到这个,因为我只在网上找到了有效的价格选项。也许可以将 $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
}
然后您可以在转发器字段的 foreach 循环中使用 $product_price
。