我有虚拟产品,我希望它们在购买时自动完成。
我发现下面粘贴的代码,将其添加到functions.php中,它确实有效,但有一个警告:
当人们选择通过银行转账付款时(是的,他们仍然这样做......),订单将被设置为暂停(或者可能是待付款,不确定,开发商用意大利语设置)。在这些情况下,应在收到付款后手动更新订单,然后才能完成订单。
然而,当用户登陆“感谢”页面时,下面的代码将每个订单设置为完整,这显然在这些情况下不起作用。
有什么想法吗? 我该如何解决这个问题?
我的代码:
add_action('woocommerce_thankyou', 'wpd_autocomplete_virtual_orders', 10, 1 );
function wpd_autocomplete_virtual_orders( $order_id ) {
if( ! $order_id ) return;
// Get order
$order = wc_get_order( $order_id );
// get order items = each product in the order
$items = $order->get_items();
// Set variable
$only_virtual = true;
foreach ( $items as $item ) {
// Get product object
if ( isset($item['variation_id']) && ! empty($item['variation_id']) ) {
$product = wc_get_product( $item['variation_id'] );
} else {
$product = wc_get_product( $item['product_id'] );
}
// Safety check
if ( ! is_object($product) ) {
return false;
}
// Is virtual
$is_virtual = $product->is_virtual();
// Is_downloadable
$is_downloadable = $product->is_downloadable();
if ( ! $is_virtual && ! $is_downloadable ) {
$only_virtual = false;
}
}
// true
if ( $only_virtual ) {
$order->update_status( 'completed' );
}
}
简而言之:我尝试使用一些代码,但它没有按预期工作。如果您能就如何修改代码提出建议,我将不胜感激。
基于 WooCommerce:自动完成付款订单,请尝试以下操作,如果所有商品都是虚拟的,将自动完成付款订单(但没有银行转帐订单):
// Conditional function that check if order items are all virtual
function only_virtual_order_items( $order ) {
$only_virtual_items = true; // Initializing
// Loop through order items
foreach( $order->get_items() as $item ) {
$product = $item->get_product();
// Check if there are items that are not virtual
if ( ! ( $product->is_virtual() || $product->is_downloadable() ) ) {
$only_virtual_items = false;
break;
}
}
return $only_virtual_items;
}
// Autocomplete paid orders
add_filter( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
// Check if all items are virtual
if ( only_virtual_order_items( $order ) ) {
$status = 'completed';
}
return $status;
}
如果您想自动完成 COD(货到付款订单),也请使用以下命令:
add_action( 'woocommerce_cod_process_payment_order_status', 'wc_auto_complete_cod_order', 10, 2 );
function wc_auto_complete_cod_order( $status, $order ) {
// Check if all items are virtual
if ( only_virtual_order_items( $order ) ) {
$status = 'completed';
}
return $status;
}
代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。