我尝试在更新帖子时进行钩子,但除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回显,或者这消息已经回显,但由于发送了重定向标头而从未呈现。

评论

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

@Milo抱歉打错,但不是原始代码

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

#1 楼

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



'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(对象)

'post_updated'传递3个参数:$post_ID$post_after(更新后的发布对象),$post_before (更新之前的发布对象)
另一个动态挂钩:"save_post_{$post->post_type}",取决于发布类型,例如对于标准帖子是'save_post_post',对于页面是'save_post_page',此钩子传递3个参数:$post_ID$post(对象)和$update是布尔值(true或false),在执行更新时为true,实际上也会触发此钩子第一次保存帖子时。

'save_post'会在更新和首次保存时触发,并传递上一个挂钩的相同3个参数。

在更新和首次保存时均触发的“ save_post_{$post_type}”,并传递与上一个挂钩相同的前两个参数。
最后,您在更新和首次保存时均触发了“ wp_insert_post”,并通过

每次更新帖子时,都会通过后端的管理页面以及使用wp_update_postwp_insert_post函数“手动”更新时更新这些钩子。 />
使用管理页面更新帖子时,还会触发其他挂钩,例如'update_post_redirect''post_updated_messages'。 (请参阅此和此WPSE答案以获取用法示例。)请注意,如果要使用某些hooks参数(不是第一个钩子参数),则必须在add_action调用中显式声明它。

例如如果要使用'$update'钩子的'save_post'参数(即第3个参数),则需要在3上将$accepted_args作为add_action参数添加(请参阅文档):

// 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”操作钩。要查看自己,只需运行以下代码。函数save_post_test($ post_id,$ post,$ update){print'post_id:'; var_export($ post_id);打印'post:'; var_export($ post);打印'update:'; var_export($ update); wp_die('save_post挂钩在您单击Add New ..时运行。'); } add_action('save_post','save_post_test',10,3);为什么“ save_post”操作在“添加新”而不是“发布”上运行?我想发布自动草稿帖子。

–lowtechsun
18年11月12日在17:52

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

– gmazzap♦
18年11月13日在9:14

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

–lowtechsun
18年11月13日在9:18

#2 楼

为什么不挂在post_updated_messages。这样,您可以显示此消息,就像更新默认的wordpress帖子一样。

add_filter('post_updated_messages', 'your_message');

function your_message(){
}


在此处查找示例:

http:// codex.wordpress.org/Function_Reference/register_post_type

post_updated_messages