Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在特定于WooCommerce的订单状态更改时以编程方式添加免费产品_Php_Wordpress_Woocommerce_Hook Woocommerce_Orders - Fatal编程技术网

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)
    }
}