Php 在特定于WooCommerce的订单状态更改时以编程方式添加免费产品
当我在后台更新订单时,我试图添加一个行项目,它与“查询”的状态更新相匹配,但没有添加任何项目 我尝试了Php 在特定于WooCommerce的订单状态更改时以编程方式添加免费产品,php,wordpress,woocommerce,hook-woocommerce,orders,Php,Wordpress,Woocommerce,Hook Woocommerce,Orders,当我在后台更新订单时,我试图添加一个行项目,它与“查询”的状态更新相匹配,但没有添加任何项目 我尝试了get\u status和has\u status两种方法,但我无法让它工作。你知道为什么这样不行吗 代码: 对于自定义订单状态,您可以使用woocommerce\u order\u status\u0$状态转换['to']操作挂钩,您将用查询 所以你得到: 功能操作\u商业\u订单\u状态\u查询($order\u id,$order){ //产品ID $product_id=155185;
get\u status
和has\u status
两种方法,但我无法让它工作。你知道为什么这样不行吗
代码:
对于自定义订单状态,您可以使用
woocommerce\u order\u status\u0$状态转换['to']
操作挂钩,您将用查询
所以你得到:
功能操作\u商业\u订单\u状态\u查询($order\u id,$order){
//产品ID
$product_id=155185;
//获得产品
$product=wc\U get\U product($product\U id);
//添加订单行项目+数量
$order->添加产品($product,1);
//计算总计并保存订单数据
$order->计算_总计();
}
添加行动('WOOMerce\u order\u status\u inquiry','action\u woomerce\u order\u status\u inquiry',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-检查产品是否已添加到订单中(避免多次添加产品):
代码进入活动子主题(或活动主题)的functions.php文件。经过测试,效果良好。谢谢,这非常好。问题:是否可以检查产品是否已经存在?我有一个表单,它以编程方式创建一个订单,相同的产品位处于“pre”状态,当我将其更改为查询状态时,它会再次广告免费产品。@user3344734我为此添加了一个附加项……试试看。应该行。是的,很好用-谢谢!
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)
}
}
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)
}
}