1

我正在使用 WooCommerce 预订,客户可以在其中请求需要管理员确认的预订。如果管理员未确认预订,我希望在 24 小时后自动取消订单。

X 时间通过答案代码后更改 WooCommerce 订单状态,我正在寻找任何帮助来满足我的要求,使用 WP cron。

4

1 回答 1

1

我带着一个可行的解决方案来满足我的要求。我希望它可以帮助某人。

计划每 30 分钟运行一次事件,检查超过 24 小时的挂单并取消它们。

* 创建自定义预定钩子
 *
 * @param $schedules
 * @return 混合
 */
功能 custom_cron_schedule( $schedules ) {
    if ( !isset( $schedules["30min"] ) ) {
        $schedules["30min"] = array(
            '间隔' => 30 * 60,
            'display' => __( '每 30 分钟一次' )
        );
    }
    返回 $schedules;
}
add_filter('cron_schedules','custom_cron_schedule');

//如果还没有调度,则调度一个动作
如果(!wp_next_scheduled('custom_pending_orders_hook')){
    wp_schedule_event(时间(),'30分钟','custom_pending_orders_hook');
}

add_action('custom_pending_orders_hook', 'custom_cancel_pending_orders');

/**
 * 在预定事件上运行的功能,检查超过 24 小时的订单
 *
 */
功能 custom_cancel_pending_orders() {
    // 获取超过 24 小时且处于待处理状态的预订
    $args = 数组(
        'post_type' => 'wc_booking',
        'posts_per_page' => -1,
        'post_status' => '待确认',
        'date_query' => 数组(
            大批(
                '之前' => '24 小时前' // 小时前
            )
        )
    );

    // 做查询
    $查询 = 新 \WP_Query( $args );

    // 循环
    if ( $query->have_posts() ) {
        // 获取帖子
        $bookings = $查询->帖子;

        // 遍历帖子
        foreach ( $bookings 作为 $booking ) {
            if ( class_exists('WC_Booking') ) {
                // 使用帖子的 id 获取预订对象
                $wc_booking = 新 \WC_Booking( $booking->ID );

                // 改变状态
                如果($wc_booking){
                    $wc_booking->update_status('取消');
                }
            }
        }
    } 别的 {
        // 没有找到帖子,继续
    }

    // 恢复原始 Post 数据
    wp_reset_postdata();
}
于 2020-06-25T21:31:53.330 回答