WordPress 开发时,咱们常常会使用 save_post 或 create_post_tag 等钩子,以便在更新文章或分类时,增长一些附加数据,这些钩子触发的时机是发布或更新数据的时间,若是处理很差,就会出现死循环的状况,致使更新数据时出现死循环的状况。程序员
举个例子,咱们须要在保存文章的时候,挂在一个函数到 save_post 钩子上,这个函数的目的是修改文章标题,在文章标题前面加上做者名称,咱们经过调用wp_update_post 函数来显示这个修改。示例代码以下。wordpress
add_action('save_post', 'wprs_update_post'); function wprs_update_post($post_id) { $title = get_the_title($post_id); $title = "一刀:" . $title; $args = [ 'ID' => $post_id, 'post_title' => $title, ]; wp_update_post($args); }
上面的代码中,「save_post」这个钩子发生在 wp_update_post 函数的调用过程当中,经过「save_post」钩子,咱们又调用了 wp_update_post 这个函数,这个函数中,又运行了「save_post」钩子。因而,程序就这么不知疲倦的运行了下去。函数
有经验的程序员可能很容易就发现了这个问题,但是电脑并不知道这是个死循环,咱们不能去责怪电脑,毕竟那只是个没有思想的机器。咱们能够作的是在开发过程当中尽可能当心,避免死循环的出现。oop
那么,怎么解决 WordPress 中出现的这个死循环呢?其实方法很简单。post
仍是上面的代码,咱们稍做修改,就能够完美的避免这个死循环了。下面是修改后的代码,对比上面出现死循环的代码,咱们只添加了两行。code
add_action('save_post', 'wprs_update_post'); function wprs_update_post($post_id) { // 获取文章标题并在文章标题前面加上做者 $title = get_the_title($post_id); $title = "一刀:" . $title; $args = [ 'ID' => $post_id, 'post_title' => $title, ]; // 更新文章 remove_action('save_post', 'wprs_update_post'); wp_update_post($args); add_action('save_post', 'wprs_update_post'); }
原理很简单,在运行 「wp_update_post」函数以前,咱们先卸载掉挂在掉「save_post」钩子上致使死循环的函数,这样就不会出现重复执行 「wprs_update_post」函数了,更新完文章后,咱们再把这个钩子挂载上,以便后续使用。开发
若是您在 WordPress开发过程当中遇到了死循环问题,不妨参考上面的代码进行修改,这样既能实现咱们须要的功能,又不会致使死循环的问题。rem