问题描述
比如说,我希望每个帖子都有草稿状态,所以我使用下面的代码。
<?PHP
add_action('save_post','mytheme_save_post');
function mytheme_save_post($post_id) {
remove_action('save_post','mytheme_save_post');
wp_update_post( array("ID"=>$post_id,"post_status"=>'draft'));
add_action("save_post","mytheme_save_post");
}
我知道 wp_update_post()
本身会触发 save_post
钩子,因此为了避免无限循环,我们必须在使用该函数之前使用 remove_action('save_post','mytheme_save_post')
。我的问题是为什么我需要在完成后重新挂钩回调函数。如果不重新挂钩,它就不起作用。
解决方法
一开始这可能会令人困惑,但正如您所说,需要避免无限循环。
如果您正在调用包含 save_post 钩子的函数,例如 wp_update_post
,您的钩子函数将创建一个无限循环。为避免这种情况,请在调用您需要的函数之前先取消挂钩,然后再重新挂钩。
add_action
允许将函数挂钩到特定操作,此处为 init
。
在 WordPress 完成加载后但在发送任何标头之前触发。
add_action
本身不会触发任何事情。通过使用 remove_action
,您实际上是在将操作“拉”到 Wordpress firing sequence 之外,这就是为什么如果您不重新挂钩它就不起作用的原因。
粗略地说,这就像将文件放在文件夹中,如果在您尝试访问时该文件不存在,那么您会收到错误或您的请求被忽略。在你重新钩住它之前,它甚至不知道它存在。如果你不重新钩住它,你几乎只是在声明一个没有触发顺序的函数。
You can have a look at the short version of the Wordpress firing sequence here。