当前位置: 首页 > 知识库问答 >
问题:

在WooCommerce中将特定产品的订单状态自动更改为已完成

夹谷浩博
2023-03-14

我有一个虚拟产品,我希望它改变状态后付款完成。下面的代码将所有购买更改为“已完成”,但我只想更改我的一个产品,而不是全部。我的产品是一个可变产品,

add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order' );
    function custom_woocommerce_auto_complete_order( $order_id ) { 
        if ( ! $order_id ) {
            return;
        }

        $order = wc_get_order( $order_id );

        if( $order->has_status( 'processing' ) ) {
            $order->update_status( 'completed' );
        }
    }

我找了很多,但没有找到答案。请帮帮我.谢谢

共有1个答案

庄经国
2023-03-14

您可以针对订单项中的特定产品Id,使您的代码仅适用于它们,如下所示:

add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order' );
function custom_woocommerce_auto_complete_order( $order_id ) { 
    if ( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );
    
    $product_ids   = array('23'); // Here set your targeted product(s) Id(s)
    $product_found = false;
    
    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        if( array_intersect( $product_ids, array($item->get_product_id(), $item->get_variation_id()) ) ) {
            $product_found = true;
            break;
        }
    }

    if( $order->has_status( 'processing' ) && $product_found ) {
        $order->update_status( 'completed' );
    }
}

如果您希望专门针对这些产品,那么您将使用以下内容:

add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order' );
function custom_woocommerce_auto_complete_order( $order_id ) { 
    if ( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );
    
    $product_ids   = array('23'); // Here set your targeted product(s) Id(s)
    $product_found = true;
    
    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        if( ! array_intersect( $product_ids, array($item->get_product_id(), $item->get_variation_id()) ) ) {
            $product_found = false;
            break;
        }
    }

    if( $order->has_status( 'processing' ) && $product_found ) {
        $order->update_status( 'completed' );
    }
}

代码放在活动子主题(或活动主题)的functions.php文件中。应该管用。

您应该更好地使用woocommerce_payment_complete_order_status钩子,而不是像woocommerce:Auto complete payed orders应答那样,以避免多个通知。

所以代码将是:

add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    $product_ids   = array('23'); // Here set your targeted product(s) Id(s)
    $product_found = false;
    
    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        if( array_intersect( $product_ids, array($item->get_product_id(), $item->get_variation_id()) ) ) {
            $product_found = true;
            break;
        }
    }

    return $product_found ? 'completed' : $status;
}

或专门针对产品:

add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    $product_ids   = array('23'); // Here set your targeted product(s) Id(s)
    $product_found = true;
    
    // Loop through order items
    foreach ( $order->get_items() as $item ) {
        if( ! array_intersect( $product_ids, array($item->get_product_id(), $item->get_variation_id()) ) ) {
            $product_found = false;
            break;
        }
    }

    return $product_found ? 'completed' : $status;
}

应该能行...

 类似资料:
  • 如果‘处理’状态将自动更新为‘完成’,我想从woocommerce更改每个订单. 我尝试在functions.php文件中编写函数,但没有成功。 当我已经收到用户的付款时,如何在Woocommerce中自动将订单状态从“正在处理”更改为“已完成”? 我使用了这个代码,但它没有效果 感谢的

  • 我在我的WooCommerce安装中创建了一个自定义订单状态,称为Quote。 现在我想收到一封电子邮件,每当收到一个订单,已经给出了状态栏。我根据这篇有用的文章创建了一个插件:http://www.skyverge.com/blog/how-to-add-a-custom-woocommerce-email/ 我的插件基本上是从文章复制的,我只是更改了电子邮件的内容。我想改变的是什么触发了电子邮

  • 我想自动完成刚刚成功支付订单“完成”状态。我在Stack和Google上搜索了很多,找到了这个答案代码: Woocommerce:Auto complete Payed Orders(取决于支付方式) 但问题是,代码将所有下订单标记为“完成”状态,而不取决于订单是否成功下订单。 我需要在代码中更改什么,以便将只支付的订单自动转换为“已完成”状态?

  • 在WooCommerce中,当订单处于处理状态时,我希望在“我的帐户”页面上显示一个操作按钮,允许客户通过更改订单状态以完成来确认订单已经到达。 我已经看到允许客户通过电子邮件相关的问题代码改变订单的状态(没有答案),这并没有真正帮助实现我的目标。 客户是否可以通过将订单状态更改为“已完成”来确认订单是否已到达?

  • 我创建了一个自定义电子邮件类并将其添加到Woocommerce中。当我转到WooCommerce中的电子邮件设置时,我可以在那里看到我的模板,当我手动触发它时,电子邮件就会到达目标电子邮件帐户。现在我遇到的问题是,我在我的类中添加了一个动作,该动作应该检测订单状态更改,并在订单被设置为我的自定义状态时执行我的触发器功能: add_action('woocommerce_order_status_w

  • 当从管理员向订单添加产品时,我尝试将自定义产品元添加到订单项元。这是我的代码,它在后端什么都不做。。。