为什么重新连接到 save_post

问题描述

比如说,我希望每个帖子都有草稿状态,所以我使用下面的代码

<?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