使用doing_action()限制WP Cron动作重复执行时代码无法运行的问题
问题原因
你这段代码的问题很明确:当WP Cron触发upload_file动作时,doing_action('upload_file')会返回true,所以你的判断条件!doing_action(...)就成了false,自然永远不会执行里面的代码。doing_action的作用是检查当前是否正在执行某个动作,而你的函数本身就是这个动作的回调,只要动作触发,这个判断就会把代码拦住。
正确的防重复执行方案
要防止WP Cron重复执行同一个动作,应该用WordPress的临时锁机制(比如set_transient),给正在执行的任务加一个有效期内的锁,这样即使Cron重复触发,也会因为锁存在而跳过执行。示例代码如下:
function upload_to_ipfs() { // 定义锁的名称,和动作名对应避免冲突 $lock_key = 'upload_to_ipfs_running'; // 检查锁是否存在,存在则直接返回(已有实例在运行) if (get_transient($lock_key)) { return; } // 设置锁,有效期设为任务预估执行时间的2倍(比如10分钟,单位秒) set_transient($lock_key, true, 600); try { // 这里写你的核心业务代码 // Code to run here } finally { // 无论任务成功失败,都删除锁 delete_transient($lock_key); } } add_action('upload_file', 'upload_to_ipfs');
补充说明
- 锁的有效期要根据任务实际执行时间调整,确保任务能在有效期内完成,同时避免锁过期后重复执行。
- 用
try...finally是为了保证即使代码执行出错,锁也会被删除,不会导致后续任务永远无法执行。
内容的提问来源于stack exchange,提问作者lsbtqba555
相关产品推荐
相关产品推荐

