我的网站上有一个功能,它应该在发布新帖子时运行(电子邮件推送通知),但同一篇文章更新时除外(即publish_to_publish
转换,我不想发送不必要的推送通知)
我知道我可以使用{old\\u status}到{new\\u status}操作挂钩,但这意味着我必须指定到publish
(new_to_publish
, draft_to_publish
, 等等)。
我的问题是:
我可以用publish_post
钩住并检测是否publish_to_publish
所以我可以明确地否定它?类似于:
function send_email() {
if ($transition == \'publish_to_publish\') return;
//(else) send email
}
add_action(\'publish_post\', \'send_email\', 10, 1);
如果没有,如何将多个挂钩绑定到同一动作?我是否只是这样列出他们:
add_action(\'new_to_publish\', \'send_mail\', 10, 1);
add_action(\'future_to_publish\', \'send_mail\', 10, 1);
add_action(\'draft_to_publish\', \'send_mail\', 10, 1);
或者有没有更优雅的方式-比如通过阵列?
最合适的回答,由SO网友:Chip Bennett 整理而成
如果没有,如何将多个挂钩绑定到同一个动作?我是否只是这样列出他们:
add_action(\'new_to_publish\', \'save_new_post\', 10, 1);
add_action(\'future_to_publish\', \'save_new_post\', 10, 1);
add_action(\'draft_to_publish\', \'save_new_post\', 10, 1);
这正是要走的路。只需将相同的回调挂接到每个状态转换挂钩中,您希望在这些挂钩上触发回调。
SO网友:Pieter Goosen
我们可以通过使用transition_post_status
. 我们需要做的就是检查旧状态是否publish
. 我们还可以通过创建这些状态的数组并对照$old_status
注意,这需要PHP 5.4+且未经测试
add_action( \'transition_post_status\', function ( $new_status, $old_status, $post )
{
// First check if our new status is publish before we do any work
if ( \'publish\' !== $new_status )
return;
// Create the array of post statuses to check against
$statuses = [\'publish\', \'pending\', \'private\', \'trash\'];
// If the old status is an the $statuses array, bail
if ( in_array( $old_status, $statuses ) )
return;
// Everything checked out, lets do what we are suppose to do
// send email
}, 10, 3 );