我运行一个站点,在那里我进行外部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));
}
}
如何解决此问题?
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 ) );
}
}
?>
我没有测试代码,我希望您测试并通知我发生了什么。
笔记
如果您只需要在特定的时间间隔内始终运行代码,那么不需要使用标志。