我正在创建一个Cron,以使用wp_schedule_event触发克隆订单. 当我创建一个每分钟发送邮箱测试的函数时,它就起作用了.但是,当我将该函数切换到克隆函数时,没有任何react .会出什么问题呢?

一百零二

/* create a scheduled event: every minute */
function cron_add_minute( $schedules ) {
    // Adds once every minute to the existing schedules.
    $schedules['everyminute'] = array(
        'interval' => 60,
        'display' => __( 'Once Every Minute' )
    );
    return $schedules;
}
add_filter( 'cron_schedules', 'cron_add_minute' );

function cronstarter_activation_weekly() {
    if( !wp_next_scheduled( 'clone_order_weekly' ) ) {  
        wp_schedule_event(time(), 'everyminute', 'clone_order_weekly' );  
    }
}
add_action('woocommerce_order_action_clone_order_weekly', 'cronstarter_activation_weekly');

// unscheduled event upon plugin deactivation
function cronstarter_deactivate_weekly() {  
    // find out when the last event was scheduled
    $timestamp = wp_next_scheduled('clone_order_weekly');
    // unschedule previous event if any
    wp_unschedule_event($timestamp, 'clone_order_weekly');
} 
add_action('woocommerce_order_action_clone_order_stop', 'cronstarter_deactivate_weekly');

function my_repeat_function() { 
    // components for our email
    $recepients = 'xxx@yyy.zzz';
    $subject = 'Hello from your Cron Job';
    $message = 'This is a test mail sent by WordPress automatically as per your schedule.';
    
    // Send email test
    mail($recepients, $subject, $message);
}

/*
* This function works well. I got an email every minute
*/
add_action ('clone_order_weekly', 'my_repeat_function');

因此,使用上面的代码,cronjob似乎工作得很好.但是,当我像这样调用克隆函数时:

/**
 * Trigger Clone action from  Order page
 *
 * @param $order
 */
function m_trigger_action_clone_order( $order ) {
    $order_id = $order->get_id();
    mutiara_woocommerce_order_clone($order_id);
}

add_action ('clone_order_weekly', 'm_trigger_action_clone_order', 20, 1); 

什么都不会发生..未触发任何订单...我知道m_trigger_action_clone_order是有效的,因为我把它连接到一个普通的克隆按钮上,当我点击并触发该功能时,就会创建一个新的克隆:

add_action( 'woocommerce_order_action_clone_order', 'm_trigger_action_clone_order', 20, 1 );

我错过了什么?

推荐答案

当你使用'woocommerce_order_action_' . sanitize_title( $action ) composite hook的时候,你忘了把$order (the WC_Order object)钩子参数传递给钩子函数.

然后,您将能够将其作为参数传递给wp_schedule_event()wp_unschedule_event()函数.
那么它应该在m_trigger_action_clone_order()功能中可用.

try 以下操作:

add_filter( 'cron_schedules', 'cron_add_minute' );
function cron_add_minute( $schedules ) {
    $schedules['everyminute'] = array(
        'interval' => 60,
        'display' => __( 'Once Every Minute' )
    );
    return $schedules;
}


add_action('woocommerce_order_action_clone_order_weekly', 'cronstarter_activation_weekly');
function cronstarter_activation_weekly( $order ) {
    if ( ! is_a($order, 'WC_Order') ) {
        return;
    }

    $args  = array( $order );

    if( ! wp_next_scheduled( 'clone_order_weekly', $args ) ) {  
        wp_schedule_event(time(), 'everyminute', 'clone_order_weekly', $args );  
    }
}


add_action('woocommerce_order_action_clone_order_stop', 'cronstarter_deactivate_weekly');
function cronstarter_deactivate_weekly( $order ) {  
    if ( ! is_a($order, 'WC_Order') ) {
        return;
    }

    $args  = array( $order );

    // find out when the last event was scheduled
    $timestamp = wp_next_scheduled('clone_order_weekly', $args );
    // unschedule previous event if any
    wp_unschedule_event($timestamp, 'clone_order_weekly', $args );
} 

add_action ('clone_order_weekly', 'trigger_action_clone_order');
function trigger_action_clone_order( $order ) {  
    if ( ! is_a($order, 'WC_Order') ) {
        return;
    }

    // For testing (Send email with the order ID)
    $recipients = 'thename@domain.tld';
    $subject = 'Scheduled Cron Job from Order number #'.$order->get_order_number();
    $message = 'This is a test mail from a scheduled Cron Job on Order number #'.$order->get_order_number();
    wp_mail($recipients, $subject, $message);

    // Your function to be triggered
    mutiara_woocommerce_order_clone( $order->get_id() );
}

代码位于您的子主题的unctions.php文件中(或在插件中).经过测试,效果良好.


For other readers:我们需要此代码来启动/停止来自WooCommerce"订单操作"元数据的cron作业(job):

add_filter( 'woocommerce_order_actions', 'filter_woocommerce_order_actions', 20, 1 );
function filter_woocommerce_order_actions( $actions ) {
    $actions['clone_order_weekly'] = __( 'Clone order weekly', 'woocommerce' );
    $actions['clone_order_stop'] = __( 'Clone order stop', 'woocommerce' );

    return $actions;
}

然后,您将用您自己的…替换mutiara_woocommerce_order_clone( $order->get_id() );函数

Php相关问答推荐

419注册期间Laravel 11中的错误

Postgrid Webhook不叫laravel

在PHP中替换数组中的文本并同时使用其他函数

根据特定运输类别增加WooCommerce购物车总重量

通过注册在Laravel中分配角色

如何在PHP中出现弃用警告时触发错误?

我必须对所有的SQL查询使用预准备语句吗?

针对给定产品类别的WooCommerce计数审核

基于自定义域的每个购物车项目的WooCommerce定制数量输入步骤

基于服务器的不同地平线配置

Select 本地提货时隐藏WooCommerce显示的发货成本

HTTPPost请求在从php脚本调用时返回404,但在从node.js脚本调用时有效.终结点有效

使用简码在 WooCommerce 我的帐户中显示一些用户数据

如果所有请求都通过index.php路由,如何使用htaccess文件强制使用HTTPS?

PHP 8.2 弃用日志(log)存储在 Laravel 10.22.0 中的哪里?

WooCommerce 相关产品(按 children 类别)作为排名数学主要类别的后备

无法读取某些 WordPress 主机上的 cookie

Woocommerce单个添加到购物车页面中的产品动态定价

Laravel 8:会话不适用

如何在 WooCommerce 中显示每个自定义选项卡的内容