Php 如果meta_key=交货日期,meta_value=当天,则将订单状态从自定义状态更新为每天23:00在WooCommerce中完成

Php 如果meta_key=交货日期,meta_value=当天,则将订单状态从自定义状态更新为每天23:00在WooCommerce中完成,php,wordpress,woocommerce,cron,orders,Php,Wordpress,Woocommerce,Cron,Orders,我试图创建一个函数,如果状态为wc ishoej afhentning、wc roskilde afhent、wc koege afhentning、wc soeborg afhent或wc birkeroed afhent,则自动将Post状态更新为Completed。但它只能更改状态,如果postmeta中的元键(交货日期)为==交货日期的元值为==当前日期 这是数据库中每个订单的值的图像 我相信格式是jf,Y 我真希望有人能帮助我。。我有一些不同的代码,我一直在寻找,试图找出它自己,但我似

我试图创建一个函数,如果状态为wc ishoej afhentning、wc roskilde afhent、wc koege afhentning、wc soeborg afhent或wc birkeroed afhent,则自动将Post状态更新为Completed。但它只能更改状态,如果postmeta中的元键(交货日期)为==交货日期的元值为==当前日期

这是数据库中每个订单的值的图像 我相信格式是jf,Y

我真希望有人能帮助我。。我有一些不同的代码,我一直在寻找,试图找出它自己,但我似乎一无所获

下面的第一个代码,这是我在stackoverflow上找到的代码,但似乎可以找到如何将其更改为我需要的代码

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' );
    }
}


应该这样做。仔细检查代码。我为您添加了注释,以了解每个函数的功能

/*
*在加载所有内容时触发代码。
* */
添加操作('wp_loaded','start_custom_code');
/*
*为每日午夜设置cron作业。
* */
函数启动\自定义\代码(){
如果(!wp_next_scheduled('bks_delivery_to_complete')){
wp_计划_事件((标准时间('midnight')+(3600*23)),“每日”,“bks_交付_至_完成”);
}
}
//将cron作业插入函数“bks\u mark\u order\u complete\u if\u delivered\u day”
添加行动(“bks交货到完成”,“bks标记订单完成,如果今天交货”);
/*
*此功能用于选择具有wc处理状态和订单的订单
*将元键“交货日期”设置为当前日期。
* */
功能bks\u标记\u订单\u完成\u如果今天交付(){
$args=数组(
'status'=>array('wc processing'),//添加所需的任何其他状态顺序。
“限制”=>-1,
'delivery_date'=>date(“d M,Y”),//使用当前日期获取订单。
);
$orders=wc\u get\u订单($args);
foreach($orders作为$order){
$order->update_status('completed');
$order->save();
}
};
/*此函数添加一个新键“交货日期”
*它允许用户传递日期以进行检查
*元数据“交付日期”。
* */
函数bks\u handle\u custom\u query\u var($query,$query\u vars){
如果(!空($query_vars['delivery_date'])){
$query['meta_query'][]=数组(
'键'=>'交货日期',
“值”=>esc_属性(日期(“d M,Y”),
);
}
返回$query;
}
添加过滤器('woocommerce\u order\u data\u store\u cpt\u get\u orders\u query'、'bks\u handle\u custom\u query\u var',10,2);
要记住的事情:-

  • 我们正在使用,并且根据doc
    WP Cron不像系统Cron那样持续运行;它仅在页面加载时触发。
    并且由于代码设置为每晚11点运行,如果有人不访问您的网站,cron作业将不会运行。一旦日期过去,该准则将适用于其他日期。解决方案是使用系统cron。[谷歌将系统cron设置为wordpress cron的集成版,它们更可靠。]
  • 根据您的问题,您的元标记是
    交货日期
    ,应严格遵守,否则将无法选择订单,并且将丢失。因此
    交付日期
    ❌ (有两个空格)不起作用
    交付日期
    ❌ (日期用小d表示)。我想你明白我的意思了
  • 日期必须严格遵循“d M,Y”格式。这意味着今天是2021年6月5日,而不是2021年6月5日。这是一个字符串比较。如果元数据是使用代码设置的,我认为不会有问题
  • 我无法理解您建议的状态,因此我现在只使用处理。您可以在
    bks\u mark\u order\u complete\u if\u delivered\u today()功能中添加其他内容
该代码经过测试并正常工作

安装以检查您的cron。你现在可以通过点击Run进行测试


在使用wp_cron时,这个问题值得一看。

我最近回答了一些类似的问题:-这有帮助吗?@Bhanu它看起来有点像simaler,但不完全是这样,我必须获取一个post meta值,并检查它的日期是否是当前日期,如果是真的,则需要更改以完成例如,我下了一个订单,在数据库中,
meta key=Delivery Date
meta Value=9 Juni,2021
我需要的是,如果当前日期是9 Juni,晚上是11,它需要自动更新此订单状态以完成。我希望这会让senceOkay觉得验证是不同的。请用以下内容更新您的问题。什么是
meta_键
(不能是
交货日期
,这是标签)?该元键中的日期格式是什么?(需要进行比较)。在晚上11点搜索订单的限制是多少?理想情况下,它可以搜索所有订单,但速度可能会变慢。另外,请用英语添加状态名称,以供一般理解。您好,巴努,没有限制,如果日期是客户下订单的交货日期,则必须更改所有收货地点(afhentning)状态订单。如果我理解正确的话,我不是舒尔,但我添加了一张来自post meta中的图像,以及我认为的格式。如果今天是9点。juni 2021然后在晚上11点,订单状态将需要更改为“完成”。希望我说的很清楚,否则我会更进一步的解释:)你好,巴努,这是完美的工作,但午夜的设置,是在00点。我试图让系统cron在正确的时间调用该网站,但我不知道是在11/23还是12/24/00(不同的时间)运行它