在创建订单后的4小时内,我需要在某些情况下取消保留的订单。
示例:2个客户
第一位客户在下午5:00发出订单,因此其保留状态(我希望订单创建后的4个小时后,如果他不付款,则取消订单,因此必须在9点取消: 00 PM)
第二个客户在5:37下订单,因此其保留状态(我也希望从订单创建之日起4小时后取消订单,如果他不付款,则必须在9时取消): 37)
我希望它在每个订单分别从订单创建日期起4小时后过期后立即取消订单,而不是作为cron作业每4小时工作一次,因此在上一个示例中,如果cron事件从6开始:下午00点,每4小时运行一次,因此第一个客户订单将在10:00 PM过期,第二个客户订单也将在10:00 PM过期。
我在这里Automatically cancel order after X days if no payment in WooCommerce
尝试过解决方案,但是无法使它在仅按天数定义的4小时后过期,也不知道哪个答案对我来说是最佳方案,对于创建后4小时后要分别取消的每个订单日期不是cron事件,
我使用了上面相关问题中提到的许多解决方案,但是只有当第一个答案起作用时,我才记得这是当管理员/商店经理访问订单页面时..我需要自动完成操作而无需人工干预
这是我在插件中取消订单的代码
<?php
function ash2osh_faw_get_unpaid_submitted() {
global $wpdb;
$options = get_option('woocommerce_' . ASH2OSH_FAW_PAYMENT_METHOD . '_settings');
$expire_hours = $options['unpaid_expire'];
if(!trim($expire_hours)){
$expire_hours='48';
}
$unpaid_submitted = $wpdb->get_col( $wpdb->prepare( "
SELECT posts.ID
FROM {$wpdb->posts} AS posts
WHERE posts.post_status = 'wc-on-hold'
AND posts.post_date < %s
", date( 'Y-m-d H:i:s', strtotime('-'.$expire_hours.' hours') ) ) );
return $unpaid_submitted;
}
function ash2osh_faw_wc_cancel_unpaid_submitted() {
$unpaid_submit = ash2osh_faw_get_unpaid_submitted();
if ( $unpaid_submit ) {
foreach ( $unpaid_submit as $unpaid_order ) {
$order = wc_get_order( $unpaid_order );
$cancel_order = True;
foreach ( $order->get_items() as $item_key => $item_values) {
$manage_stock = get_post_meta( $item_values['variation_id'], '_manage_stock', true );
if ( $manage_stock == "no" ) {
$payment_method = $order->get_payment_method();
if ( $payment_method == "cheque" ) {
$cancel_order = False;
}
}
}
if ( $cancel_order == True ) {
$order -> update_status( 'cancelled', __( 'Unpaid submission expired after hours set in payment plugin options.', 'woocommerce') );
}
}
}
}
add_action( 'woocommerce_cancel_unpaid_submitted', 'ash2osh_faw_wc_cancel_unpaid_submitted' );//for customization purposes
这里的第三个解决方案:Automatically cancel order after X days if no payment in WooCommerce经过测试,可以正常工作:但是,我希望在订单未处理/未处理的情况下取消订单,并且如果订单超过4个小时则取消订单在订单创建日期之后,并且计划在30天(而不是每天)运行该日期
答案 0 :(得分:0)
您尝试过这个吗? Woocommerce auto cancel On-Hold after X days。我和您有同样的问题(但取消时间为72小时),而且也没有付款网关的限制,所以这是我的代码:
int sum = 0;
List<String> sum_list = new ArrayList<>();
List<String> list21 = new ArrayList<>();
list21.add("1 tbsp olive oil plus a drizzle to serve (optional)");
list21.add("1 tbsp olive oil plus a drizzle to serve (optional)");
list21.add("2 tbsp pesto");
list21.add("2 tbsp pesto");
list21.add("2 tbsp pesto");
list21.add("2 tbsp pesto");
int i = 0;
while (i < list21.size()) {
String str1 = list21.get(i).trim().replaceAll("[0-9]", "");
String str2 = list21.get(i + 1).trim().replaceAll("[0-9]", "");
if (str1.equals(str2)) {
sum += Integer.valueOf(list21.get(i).replaceFirst(".*?(\\d+).*", "$1"))
+ Integer.valueOf(list21.get(i).replaceFirst(".*?(\\d+).*", "$1"));
// System.out.println("Sum=" + sum);
try {
if (!sum_list.isEmpty() && !sum_list.get(sum_list.size() - 1).trim().replaceAll("[0-9]", "").contains(str2)) {
sum_list.add(sum + " " + str1);
sum = 0;
} else sum_list.add(sum + " " + str1);
} catch (Exception e) {
}
}
i = i + 2;
}
System.out.println(sum_list.toString());