如果 meta_key = 交货日期且 meta_value = 这一天,则每天 23:00 在 WooCommerce 中将订单状态从自定义状态更新为已完成
Update order status from custom statuses to completed in WooCommerce everyday at 23.00 if meta_key = Delivery Date and meta_value = this day
我正在尝试创建一个函数,如果状态为 wc-ishoej-afhentning、wc-roskilde-afhent、wc-koege-afhentning、wc-soeborg,它会自动将 Post 状态更新为已完成-afhent 或 wc-birkeroed-afhent。但它只能改变状态,如果postmeta中的元键(交货日期)==交货日期的元值==当前日期。
这是数据库中每个订单的值的图像
我相信格式是 j F, Y
我真的希望有人能帮助我。我有一些不同的代码,我一直在寻找这些代码,试图自己弄清楚,但我似乎无处可去。
下面的第一个代码,这是我在 Whosebug 上找到的,但似乎可以弄清楚如何将其更改为我需要的代码。
add_action( 'admin_init', 'update_order_status_on_monday' );
function update_order_status_on_monday() {
if ( date( 'D', strtotime( 'now' ) ) === 'Mon' && !get_transient( '_updated_order_status_on_monday' ) ) {
$processing_orders = wc_get_orders( $args = array(
'numberposts' => -1,
'post_status' => 'wc-processing',
) );
if ( !empty( $processing_orders ) ) {
foreach ( $processing_orders as $order )
$order->update_status( 'completed' );
}
set_transient( '_updated_order_status_on_monday', true );
} elseif ( date( 'D', strtotime( 'now' ) ) !== 'Mon' ) {
delete_transient( '_updated_order_status_on_monday' );
}
}
第二个代码,我目前正在使用它来更改为自定义状态,我在下面添加了它
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_ishoej_order' );
function custom_woocommerce_auto_ishoej_order( $order_id ) {
if ( ! $order_id ) {
return;
}
if( get_post_meta($order_id, 'Pickup Location', true ) == "Ishøj" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-ishoej-afhentning' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Roskilde" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-roskilde-afhent' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Køge" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-koege-afhentning' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Søborg" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-soeborg-afhent' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Birkerød" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-birkeroed-afhent' );
}
}
这是应该做的。仔细检查代码。我添加了注释,以便您了解每个函数的作用。
/*
* Trigger the code when everything is loaded.
* */
add_action( 'wp_loaded','start_custom_code' );
/*
* Set a cron job for daily Midnight.
* */
function start_custom_code() {
if ( ! wp_next_scheduled( 'bks_delivery_to_complete' ) ) {
wp_schedule_event( (strtotime('midnight') + (3600 * 23)) , 'daily', 'bks_delivery_to_complete' );
}
}
// Plug the cron job with function 'bks_mark_order_complete_if_delivered_today'
add_action( 'bks_delivery_to_complete', 'bks_mark_order_complete_if_delivered_today' );
/*
* This function selects order with wc-processing status and with orders
* having meta key 'Delivery Date' set as current date.
* */
function bks_mark_order_complete_if_delivered_today(){
$args = array(
'status' => array( 'wc-processing'), // Add any other statuses order of which you want.
'limit' => -1,
'delivery_date' => date("d M, Y"), // Use Current date to fetch Orders.
);
$orders = wc_get_orders( $args );
foreach ($orders as $order){
$order->update_status( 'completed' );
$order->save();
}
};
/* This functions add a new key 'delivery_date'
* which enables user to pass date to check against
* Meta Data 'Delivery Date'.
* */
function bks_handle_custom_query_var( $query, $query_vars ) {
if ( ! empty( $query_vars['delivery_date'] ) ) {
$query['meta_query'][] = array(
'key' => 'Delivery Date',
'value' => esc_attr(date("d M, Y") ),
);
}
return $query;
}
add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'bks_handle_custom_query_var', 10, 2 );
注意事项:-
- 我们正在使用 wordpress cron job,并且根据文档
WP-Cron does not run constantly as the system cron does; it is only triggered on page load.
并且代码设置为 运行 每晚 11 点,如果有人不访问您的网站 cron 作业不会 运行。一旦日期过去,该代码将适用于其他日期。解决方案是使用系统 crons。 [ Google 设置系统 cron 而不是 wordpress cron,它们更可靠。]
- 根据你的问题,你的元标记是
Delivery Date
,应该严格遵守,否则因为错误不会 select 订单,它会被遗漏。所以 Deliver Date
❌(有两个空格)不会工作 Deliver date
❌(日期的小 d)。我想你明白我在说什么了。
- 日期必须严格遵循“d M, Y”格式。这意味着今天是
05 Jun, 2021
而不是 5 Jun, 2021
。这是一个字符串比较。如果使用代码设置元数据,我认为不会有问题。
- 我无法理解你建议的状态,所以我现在只是使用处理。您可以在
bks_mark_order_complete_if_delivered_today()
功能中添加其他人。
代码已经过测试并且有效。
安装 WP CRON plugin 以检查您的 cron。您可以立即点击 运行 进行测试。
在使用 wp_cron https://wordpress.stackexchange.com/a/179774/204925
时,这个问题值得一看
我正在尝试创建一个函数,如果状态为 wc-ishoej-afhentning、wc-roskilde-afhent、wc-koege-afhentning、wc-soeborg,它会自动将 Post 状态更新为已完成-afhent 或 wc-birkeroed-afhent。但它只能改变状态,如果postmeta中的元键(交货日期)==交货日期的元值==当前日期。
这是数据库中每个订单的值的图像
我真的希望有人能帮助我。我有一些不同的代码,我一直在寻找这些代码,试图自己弄清楚,但我似乎无处可去。
下面的第一个代码,这是我在 Whosebug 上找到的,但似乎可以弄清楚如何将其更改为我需要的代码。
add_action( 'admin_init', 'update_order_status_on_monday' );
function update_order_status_on_monday() {
if ( date( 'D', strtotime( 'now' ) ) === 'Mon' && !get_transient( '_updated_order_status_on_monday' ) ) {
$processing_orders = wc_get_orders( $args = array(
'numberposts' => -1,
'post_status' => 'wc-processing',
) );
if ( !empty( $processing_orders ) ) {
foreach ( $processing_orders as $order )
$order->update_status( 'completed' );
}
set_transient( '_updated_order_status_on_monday', true );
} elseif ( date( 'D', strtotime( 'now' ) ) !== 'Mon' ) {
delete_transient( '_updated_order_status_on_monday' );
}
}
第二个代码,我目前正在使用它来更改为自定义状态,我在下面添加了它
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_ishoej_order' );
function custom_woocommerce_auto_ishoej_order( $order_id ) {
if ( ! $order_id ) {
return;
}
if( get_post_meta($order_id, 'Pickup Location', true ) == "Ishøj" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-ishoej-afhentning' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Roskilde" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-roskilde-afhent' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Køge" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-koege-afhentning' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Søborg" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-soeborg-afhent' );
} elseif ( get_post_meta($order_id, 'Pickup Location', true ) == "Birkerød" ) {
$order = wc_get_order( $order_id );
$order->update_status( 'wc-birkeroed-afhent' );
}
}
这是应该做的。仔细检查代码。我添加了注释,以便您了解每个函数的作用。
/*
* Trigger the code when everything is loaded.
* */
add_action( 'wp_loaded','start_custom_code' );
/*
* Set a cron job for daily Midnight.
* */
function start_custom_code() {
if ( ! wp_next_scheduled( 'bks_delivery_to_complete' ) ) {
wp_schedule_event( (strtotime('midnight') + (3600 * 23)) , 'daily', 'bks_delivery_to_complete' );
}
}
// Plug the cron job with function 'bks_mark_order_complete_if_delivered_today'
add_action( 'bks_delivery_to_complete', 'bks_mark_order_complete_if_delivered_today' );
/*
* This function selects order with wc-processing status and with orders
* having meta key 'Delivery Date' set as current date.
* */
function bks_mark_order_complete_if_delivered_today(){
$args = array(
'status' => array( 'wc-processing'), // Add any other statuses order of which you want.
'limit' => -1,
'delivery_date' => date("d M, Y"), // Use Current date to fetch Orders.
);
$orders = wc_get_orders( $args );
foreach ($orders as $order){
$order->update_status( 'completed' );
$order->save();
}
};
/* This functions add a new key 'delivery_date'
* which enables user to pass date to check against
* Meta Data 'Delivery Date'.
* */
function bks_handle_custom_query_var( $query, $query_vars ) {
if ( ! empty( $query_vars['delivery_date'] ) ) {
$query['meta_query'][] = array(
'key' => 'Delivery Date',
'value' => esc_attr(date("d M, Y") ),
);
}
return $query;
}
add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', 'bks_handle_custom_query_var', 10, 2 );
注意事项:-
- 我们正在使用 wordpress cron job,并且根据文档
WP-Cron does not run constantly as the system cron does; it is only triggered on page load.
并且代码设置为 运行 每晚 11 点,如果有人不访问您的网站 cron 作业不会 运行。一旦日期过去,该代码将适用于其他日期。解决方案是使用系统 crons。 [ Google 设置系统 cron 而不是 wordpress cron,它们更可靠。] - 根据你的问题,你的元标记是
Delivery Date
,应该严格遵守,否则因为错误不会 select 订单,它会被遗漏。所以Deliver Date
❌(有两个空格)不会工作Deliver date
❌(日期的小 d)。我想你明白我在说什么了。 - 日期必须严格遵循“d M, Y”格式。这意味着今天是
05 Jun, 2021
而不是5 Jun, 2021
。这是一个字符串比较。如果使用代码设置元数据,我认为不会有问题。 - 我无法理解你建议的状态,所以我现在只是使用处理。您可以在
bks_mark_order_complete_if_delivered_today()
功能中添加其他人。
代码已经过测试并且有效。
安装 WP CRON plugin 以检查您的 cron。您可以立即点击 运行 进行测试。
在使用 wp_cron https://wordpress.stackexchange.com/a/179774/204925
时,这个问题值得一看