在 WooCommerce 特定订单状态更改上以编程方式添加免费产品
Add a free product programmatically on WooCommerce specific order status change
当我在后端更新订单时,我试图添加一个订单项,它与“查询”的状态更新相匹配,但没有添加任何项目。
我尝试了 get_status
和 has_status
但我无法让它工作。关于为什么这不起作用的任何想法?
代码:
add_action( 'woocommerce_order_status_changed', 'add_free_products', 20, 4 );
function add_free_products( $order_id, $order ){
if ( ! $order_id )
return;
// Getting an instance of the order object
$order = wc_get_order( $order_id );
if( $order->get_status() == 'enquiry' ) {
$product_id = '155185';
$product = wc_get_product( $product_id );
$order->add_product( $product);
$order->save();
}
}
对于自定义订单状态,您可以使用 woocommerce_order_status_' . $status_transition['to']
操作挂钩,您将在此处将 $status_transition[to]
替换为 enquiry
所以你得到:
function action_woocommerce_order_status_enquiry( $order_id, $order ) {
// Product ID
$product_id = 155185;
// Get product
$product = wc_get_product( $product_id );
// Add an order line item + quantity
$order->add_product( $product, 1 );
// Calculate totals and SAVE order data
$order->calculate_totals();
}
add_action( 'woocommerce_order_status_enquiry', 'action_woocommerce_order_status_enquiry', 10, 2 );
有一些错误和遗漏,请改用以下内容:
add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
if ( "enquiry" === $new_status ) {
$product_id = '155185';
$product = wc_get_product( $product_id );
$order->add_product( $product );
$order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
// $order->save();
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
加法 1
您还可以使用自定义元数据标记此操作,如果您使用以下:
add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
if ( "enquiry" === $new_status && ! $order->get_meta('_free_product_added') ) {
$product_id = '155185';
$product = wc_get_product( $product_id );
$order->add_product( $product );
$order->update_meta_data('_free_product_added', 'yes'); // Flag the order
$order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
添加2 - 检查产品是否已经添加到订单(避免多次添加产品):
function order_has_specific_product( $product_id, $order ) {
// Loop through order items to check if a product is on the current order
foreach ( $order->get_items() as $item ) {
if ( in_array( $product_id, array($item->get_product_id(), $item->get_variation_id()) ) ) {
return true;
}
}
return false;
}
add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
$product_id = '155185'; // Free product to be added only once
if ( "enquiry" === $new_status && ! order_has_specific_product( $product_id, $order ) ) {
$product = wc_get_product( $product_id );
$order->add_product( $product );
$order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
当我在后端更新订单时,我试图添加一个订单项,它与“查询”的状态更新相匹配,但没有添加任何项目。
我尝试了 get_status
和 has_status
但我无法让它工作。关于为什么这不起作用的任何想法?
代码:
add_action( 'woocommerce_order_status_changed', 'add_free_products', 20, 4 );
function add_free_products( $order_id, $order ){
if ( ! $order_id )
return;
// Getting an instance of the order object
$order = wc_get_order( $order_id );
if( $order->get_status() == 'enquiry' ) {
$product_id = '155185';
$product = wc_get_product( $product_id );
$order->add_product( $product);
$order->save();
}
}
对于自定义订单状态,您可以使用 woocommerce_order_status_' . $status_transition['to']
操作挂钩,您将在此处将 $status_transition[to]
替换为 enquiry
所以你得到:
function action_woocommerce_order_status_enquiry( $order_id, $order ) {
// Product ID
$product_id = 155185;
// Get product
$product = wc_get_product( $product_id );
// Add an order line item + quantity
$order->add_product( $product, 1 );
// Calculate totals and SAVE order data
$order->calculate_totals();
}
add_action( 'woocommerce_order_status_enquiry', 'action_woocommerce_order_status_enquiry', 10, 2 );
有一些错误和遗漏,请改用以下内容:
add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
if ( "enquiry" === $new_status ) {
$product_id = '155185';
$product = wc_get_product( $product_id );
$order->add_product( $product );
$order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
// $order->save();
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
加法 1
您还可以使用自定义元数据标记此操作,如果您使用以下:
add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
if ( "enquiry" === $new_status && ! $order->get_meta('_free_product_added') ) {
$product_id = '155185';
$product = wc_get_product( $product_id );
$order->add_product( $product );
$order->update_meta_data('_free_product_added', 'yes'); // Flag the order
$order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。
添加2 - 检查产品是否已经添加到订单(避免多次添加产品):
function order_has_specific_product( $product_id, $order ) {
// Loop through order items to check if a product is on the current order
foreach ( $order->get_items() as $item ) {
if ( in_array( $product_id, array($item->get_product_id(), $item->get_variation_id()) ) ) {
return true;
}
}
return false;
}
add_action( 'woocommerce_order_status_changed', 'add_free_product_on_order_enquiry_status', 20, 4 );
function add_free_product_on_order_enquiry_status( $order_id, $old_status, $new_status, $order ){
$product_id = '155185'; // Free product to be added only once
if ( "enquiry" === $new_status && ! order_has_specific_product( $product_id, $order ) ) {
$product = wc_get_product( $product_id );
$order->add_product( $product );
$order->calculate_totals(); // calculate taxes, totals and save (method includes save() method)
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。已测试并有效。