【问题标题】:Exclude specific products on auto-complete orders process in Woocommerce在 Woocommerce 中的自动完成订单流程中排除特定产品
【发布时间】:2019-01-19 20:33:31
【问题描述】:

我目前正在使用代码 from this answer thread 自动完成订单,以便将新的 WooCommerce 预订添加到日历中(只有在标记为完成后才会添加)。

这对预订非常有用,但是,我想从自动完成中排除一些其他产品。

你知道这是否可能吗?

【问题讨论】:

  • 您能否阐明“自动完成订单”、预订和日历的含义?您在哪里检查此代码中的产品?
  • 嗯,我使用的代码没有,这就是我想要做的。 @LoicTheAztec 的回答正是我所需要的!干杯!

标签: types woocommerce product orders payment-method


【解决方案1】:

遍历订单项是一个繁重的过程,而不是进行更轻松的 SQL 查询。

这是一个自定义条件函数,它将检查 Woocommerce 订单中的产品 ID(返回真或假):

function order_has_products( $order_id, $product_ids ){
    $product_ids = implode( "','", $product_ids );
    global $wpdb;
    $result = $wpdb->get_var( "
        SELECT COUNT(woim.meta_value) FROM {$wpdb->prefix}woocommerce_order_itemmeta as woim
        INNER JOIN {$wpdb->prefix}woocommerce_order_items as woi ON woi.order_item_id = woim.order_item_id
        WHERE woi.order_id = $order_id AND woim.meta_key IN ('_product_id','_variation_id')
        AND woim.meta_value IN ('$product_ids')
    " );
    return $result > 0 ? true : false;
}

那你就这样使用吧:

add_action('woocommerce_thankyou', 'wc_auto_complete_order', 20, 1);
function wc_auto_complete_order($order_id){
    if (!$order_id)  return;

    // HERE define your Product Ids to exclude in the array 
    $product_ids = array( 37, 53 );

    // Get an instance of the WC_Product object
    $order = wc_get_order($order_id);

    $found  = order_has_products( $order_id, $product_ids );

    if ( in_array( $order->get_payment_method(), array('cod', 'cheque', '') ) || $found ) {
        return;
    }
    else {
        $order->update_status('completed');
    }

}

代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试并且可以工作。


WooCommerce: Auto complete paid Orders (depending on Payment methods)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 2018-11-09
    • 2013-08-11
    • 2023-01-25
    • 2018-08-01
    相关资源
    最近更新 更多