递归调用wp_Schedule_Single_Event()时的问题

时间:2019-08-12 作者:Sam

我运行一个站点,在那里我进行外部API调用。我希望有一个失败案例,如果API调用失败,它将调用wp_schedule_single_event() 在4小时后重试API调用。

如果下一个API调用失败,它将安排在4小时后重试。

我的工作是这样的wp_schedule_single_event 持续4小时运行正常。但当它被递归调用时wp_schedule_single_event 呼叫wp_schedule_single_event 如果时间()超过4小时,则不会安排最新的事件。

我相信我理解为什么会这样。我相信是的because time() 正在返回运行初始事件的时间。它不是重新运行time() 调用以获取新的系统时间。因此,它实际上是在尝试调用wp_schedule_single_event 过去的一段时间,导致它失败。

以下是相关代码:

add_action(\'order_drip_followers_hook\',\'order_drip_followers\', 10, 2);
function order_drip_followers($workflow, $days)
{
    $link = \'https://www.instagram.com/\';
    $order = $workflow->data_layer()->get_order();
    $ig_user = clean($order->get_meta(\'ig_username\'));
    $forward_slash = \'/\';
    $profile_link = $link . $ig_user . $forward_slash;
    $customer = $workflow->data_layer()->get_customer();
    $customer_user_id = $customer->get_user_id();

        $postData = array(
        //removed for privacy
        );

        $request = curl_post_followers($postData);
        var_dump($request);

        $payload = json_decode($request,true);
        $order_status = $payload["status"];

        if($order_status == "ok") {
            //API Order Success
            $order_id = $payload["order"];
            update_user_meta($customer_user_id, "drip_followers_order_id", $order_id);
        } else {
            //API Order Failure
            //Schedule retry in 4 hours
            wp_schedule_single_event(time() + 3600*4, \'order_drip_followers_hook\', array($workflow, $days));
        }
    }
如何解决此问题?

1 个回复
SO网友:Makiomar

正如我从您的代码中所理解的,您只需要运行一次代码来获取数据,但如果失败,请再次运行一次,直到获取数据,然后停止。根据这种理解,我们可以这样想:

我们需要依靠wp_schedule_event 确保事件将继续激发,直到满足条件(将定义)。所以用它代替wp_schedule_single_event

创建一个标志,如果函数返回所需数据,该标志将设置为值。。

此标志应该是控制代码运行的条件。

如果不满足条件,则运行代码,否则将删除挂接事件

因此我们可以编写代码:

<?php
add_action(\'order_drip_followers_hook\',\'order_drip_followers\', 10, 2);
function order_drip_followers($workflow, $days)
{
if(!get_transient(\'user_meta_updated_\'.get_current_user_id( )){


$link = \'https://www.instagram.com/\';
$order = $workflow->data_layer()->get_order();
$ig_user = clean($order->get_meta(\'ig_username\'));
$forward_slash = \'/\';
$profile_link = $link . $ig_user . $forward_slash;
$customer = $workflow->data_layer()->get_customer();
$customer_user_id = $customer->get_user_id();

    $postData = array(
    //removed for privacy
    );

    $request = curl_post_followers($postData);
    var_dump($request);

    $payload = json_decode($request,true);
    $order_status = $payload["status"];

    if($order_status == "ok") {
        //API Order Success
        $order_id = $payload["order"];
        update_user_meta($customer_user_id, "drip_followers_order_id", $order_id);
        set_transient(\'user_meta_updated_\'.get_current_user_id( ), \'1\' );
   }
   }else{
    wp_clear_scheduled_hook( \'order_drip_followers_hook\', array( $workflow, $day ) );
   }
}
 ?>
我没有测试代码,我希望您测试并通知我发生了什么。

笔记

如果您只需要在特定的时间间隔内始终运行代码,那么不需要使用标志。

相关推荐

在WordPress cronjob内调用do_action()

我在WordPress中编写了一个cronjob,每5分钟执行一次get。在cronjob的函数中,我试图执行do_action:error_log(\'Send Email\'); do_action( \'trigger_new_subscription_notification_email\', $dv_id, $new_order->id ); 我的问题是现在可以在调试中看到error\\u日志。WordPress日志,但没有发送电子邮件。当我像在cronmanager,