什么是正确的钩子时更新帖子


19

我尝试在更新帖子时挂机,但我尝试执行的所有挂机都从未执行过 updated_post_meta

add_action('updated_post_meta', 'my_function');

function my_function($post_id) {    
    echo 'This is my post ID : '.$post_id;
}

我已经尝试过了,add_action('save_post', 'my_function');但是没有回显任何id,或者也许此消息已经回显,但是由于发送了重定向标头而从不呈现。


2
您在之后有一个空格save_post,是这里的错字,还是您原始代码中的错字?另外,在开发时启用调试
米洛2014年

@Milo对不起打字错误,但不是原始代码
rusly 2014年

如果是这样,那么在创建新帖子时,您应该在屏幕的左上角看到您的输出。保存现有帖子的操作发生在重定向之前,因此除非启用了调试,否则您将看不到任何内容。
米洛

Answers:


55

更新帖子后,会触发一些挂钩:

  • 'pre_post_update'更新帖子之前触发的操作,传递的参数为2:$post_ID并且$data是帖子表的所有其他数据库列的数组
  • 'transition_post_status'是在更新时触发的钩子,并传递3个参数:$ new_post_status $old_post_status$post(对象)。
  • 然后,还有另外两个触发的转换挂钩,但是它们是动态命名的,这意味着触发的有效操作取决于新旧的发布状态。 "{$old_status}_to_{$new_status}""{$new_status}_{$post->post_type}"。首先传递唯一的post对象作为参数,第二次传递post id和post对象。在此处查找文档。
  • 'edit_post'传递2个参数:$post_ID$post(object)
  • 'post_updated'传递3个参数:$post_ID$post_after(更新后的发布对象),$post_before(更新前的发布对象)
  • 另一个动态挂钩:"save_post_{$post->post_type}"取决于帖子类型,例如对于标准帖子is 'save_post_post'和对于页面而言'save_post_page',此挂钩传递3个参数:$post_ID$post(对象),$update并且是布尔值(true或false),在执行更新时为true事实上,首次保存帖子时也会触发此钩子。
  • save_post在更新和首次保存时都触发的' ',并传递与上一个挂钩相同的3个参数。
  • save_post_{$post_type}在更新和首次保存时均会触发的' ',并传递与上一个挂钩相同的前两个参数。
  • 最后,您拥有' wp_insert_post',它在更新和首次保存时均被触发,并传递与前2个挂钩相同的3个参数。

每次更新帖子时都会触发这些钩子,既可以通过后台的管理页面,也可以通过使用wp_update_postwp_insert_post函数“手动”更新时触发。

当使用管理页面更新帖子时,还会触发其他挂钩,例如'update_post_redirect''post_updated_messages'。(见这个这个 用法示例WPSE答案)。

请注意,如果您不想使用某些hooks参数,则必须在add_action调用中显式声明它。

例如,如果要使用挂钩的'$update'参数(即第三个参数),则'save_post'需要将其添加3$accepted_args参数add_action请参阅docs):

// if you don't add 3 as as 4th argument, this will not work as expected
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) {
  $msg = 'Is this un update? ';
  $msg .= $update ? 'Yes.' : 'No.';
  wp_die( $msg );
}

最后要注意的是时间安排:您必须确保触发操作之前add_action已调用该方法,否则它将无效。

例如此代码:

wp_update_post( $post );
add_action( 'save_post', 'my_function', 10, 3 );

不会执行任何操作,因为在触发钩子之后添加了操作。这很容易识别,在现实世界中代码并非总是如此。


我认为在仪表板上点击“添加新内容(帖子,页面,CPT)”时也会触发“ save_post”操作钩。要查看自己,只需运行以下代码。function save_post_test( $post_id, $post, $update ) { print ' post_id : '; var_export( $post_id ); print ' post : '; var_export( $post ); print ' update : '; var_export( $update ); wp_die( 'save_post hook runs when you click Add New..' ); } add_action( 'save_post', 'save_post_test', 10, 3 );为什么“ save_post”操作在“添加新”而不是“发布”上运行?我想发布自动草稿帖子。
lowtechsun

@lowtechsun就像在A中所说的那样,每次更新帖子(即将其保存在DB中)时都会触发钩子。当您点击“添加新”时,接近页面加载,WP创建了一个存储在DB中的草稿帖子,因此他的钩子被解雇了。
gmazzap

谢谢您回复我。昨天才发现这个问题,并认为它的概念令人困惑。意思是首先我打开页面以添加新帖子。在这个阶段,我以为我还没有创建帖子。只有一次,我打我发布会认为创建了新的岗位。进一步讲,我希望WP 如果我单击“添加新项”,但在不单击“发布”的情况下离开该页面,则确实删除了自动起草的帖子?
lowtechsun

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.