【问题标题】:WooCommerce: Change order status based on custom Meta ValueWooCommerce:根据自定义元值更改订单状态
【发布时间】:2021-05-25 14:04:42
【问题描述】:

我正在尝试每天运行以下功能,以自动完成所有超过 10 天且具有特定自定义元值的处理订单。

我正在使用以下 sn-p,但这根本行不通。知道为什么吗?

function autoComplete(){
    $orders = wc_get_orders( array(
            'status' => 'wc-processing',
            'date_created' => '<' . ( time() - 10 * DAY_IN_SECONDS ),
            'meta_key'     => 'status_us',
            'meta_compare' => '=',
            'meta_value'   => 'Sent to USA',
    ) );

    foreach ($orders as $order){
        $order->update_status( 'completed' );
    }
}

if ( ! wp_next_scheduled( 'autoComplete' ) ) {
    wp_schedule_event( time(), 'daily', 'autoComplete' );
} 

我错过了什么错误吗?感谢您的帮助!

【问题讨论】:

    标签: php wordpress woocommerce hook-woocommerce


    【解决方案1】:

    你做了一个很好的尝试,但你犯了一些错误。

    以下代码进入您的functions.php

    add_action( 'wp_loaded','start_custom_code' );
    
    // Once everything theme and plugins are loaded we register our cron job.
    function start_custom_code() {
        if ( ! wp_next_scheduled( 'bks_mark_processing_order_complete_if_sent_to_usa' ) ) {
            wp_schedule_event( time(), 'daily', 'bks_mark_processing_order_complete_if_sent_to_usa' );
        }
    }
    
    add_action( 'bks_mark_processing_order_complete_if_sent_to_usa', 'bks_mark_processing_order_complete_if_sent_to_usa' );
    

    你的函数有小错误bks_mark_processing_order_complete_if_sent_to_usa()

    function bks_mark_processing_order_complete_if_sent_to_usa(){
        $args = array(
            'status' => array( 'wc-processing'),
            'limit'  => -1,
            'date_created' => '>' . ( time() - 864000 ), // your mistake 1
            'status_us' => 'Sent to USA', // your mistake 2
        );
    
    
        $orders = wc_get_orders( $args );
    
        foreach ($orders as $order){
            $order->update_status( 'completed' );
            $order->save(); // your mistake 3
        }
    };
    

    错误说明

    1. 虽然您的尝试方向正确,但 'date_created' =&gt; '&lt;' . ( time() - 10 * DAY_IN_SECONDS ), 您必须使用 &gt; 而不是 &lt; 并且您没有实际设置 DAY_IN_SECONDS 您必须将其替换为 86400。所以正确的值是'&gt;' . ( time() - 864000 )。 10 天10 * 86400 = 864000。您可以在 WooCommerce 文档中阅读此说明 here

    2. 在这里,我为您创建了新的自定义变量,该变量使用woocommerce_order_data_store_cpt_get_orders_query 设置,然后进行查询。需要添加的代码。

    function handle_custom_query_var( $query, $query_vars ) {
        if ( ! empty( $query_vars['status_us'] ) ) {
            $query['meta_query'][] = array(
                'key' => 'status_us',
                'value' => esc_attr( $query_vars['status_us'] ),
            );
        }
    
        return $query;
    }
    
    add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'handle_custom_query_var', 10, 2 );
    
    1. 您更新了状态,但忘记保存了。 $order-&gt;save();

    所以总结一下,你必须在你的functions.php中添加以下代码

    add_action( 'wp_loaded','start_custom_code' );
    add_action( 'bks_mark_processing_order_complete_if_sent_to_usa', 'bks_mark_processing_order_complete_if_sent_to_usa' );
    
    
    function start_custom_code() {
        if ( ! wp_next_scheduled( 'bks_mark_processing_order_complete_if_sent_to_usa' ) ) {
            wp_schedule_event( time(), 'daily', 'bks_mark_processing_order_complete_if_sent_to_usa' );
        }
    }
    
    function bks_mark_processing_order_complete_if_sent_to_usa(){
        $args = array(
            'status' => array( 'wc-processing'),
            'limit'  => -1,
            'date_created' => '>' . ( time() - 864000 ),
            'status_us' => 'Sent to USA',
        );
    
    
        $orders = wc_get_orders( $args );
    
        foreach ($orders as $order){
            $order->update_status( 'completed' );
            $order->save();
        }
    };
    
    function handle_custom_query_var( $query, $query_vars ) {
        if ( ! empty( $query_vars['status_us'] ) ) {
            $query['meta_query'][] = array(
                'key' => 'status_us',
                'value' => esc_attr( $query_vars['status_us'] ),
            );
        }
    
        return $query;
    }
    
    add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'handle_custom_query_var', 10, 2 );
    

    上面的代码已经过测试并且可以工作。

    证明:

    安装 WP CRON plugin 来检查你的 cron。见上面的截图。您可以点击Run Now 进行测试。

    警告:
    当有人访问您的网站时,WP Cron 就会运行。因此,如果没有人访问,?>cron 永远不会运行。

    阅读:https://wordpress.stackexchange.com/a/179774/204925

    【讨论】:

    • 非常感谢您的精彩解释。但是,由于某种原因,该功能正在做任何事情。我还可以看到列出的 cron-job,但是当我运行该作业时,什么也没有发生。我已经测试过很多次了...您能否确认您已经测试过代码,而不仅仅是 cron-job?
    • 嘿@JohnSmith,我忘了添加一个挂钩来绑定 cron 和它必须运行的函数。我已经更新了我的答案,并再次检查了它。请重试。
    • 这一行没有意义:add_action( 'bks_mark_processing_order_complete_if_sent_to_usa', 'bks_mark_processing_order_complete_if_sent_to_usa' );
    • 好的,我看到代码(函数)正在运行,但是 cron 任务却没有。你知道为什么它不起作用吗?
    • 你说 cron 不工作是什么意思?
    【解决方案2】:

    这是我根据 CRON 任务验证订单的方法。

    $order->payment_complete('transaction ID string'); //validate payment
    wc_reduce_stock_levels($order->get_id()); //reduce stock
    $woocommerce->cart->empty_cart(); //empty cart
    $order->update_status('completed', 'A order note string'); //change order statyus
    

    我相信你不需要“wc-”前缀。

    您确定您安排的活动正常吗? $orders 被填满了吗?请先在没有时间表的情况下测试您的方法。

    【讨论】:

      猜你喜欢
      • 2022-12-15
      • 2018-08-30
      • 1970-01-01
      • 2021-04-08
      • 2022-10-05
      • 2021-08-16
      • 1970-01-01
      • 2019-08-27
      • 2017-05-24
      相关资源
      最近更新 更多