检测POST状态转换的类型

时间:2013-02-22 作者:Matanya

我的网站上有一个功能,它应该在发布新帖子时运行(电子邮件推送通知),但同一篇文章更新时除外(即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);
或者有没有更优雅的方式-比如通过阵列?

2 个回复
最合适的回答,由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 );

结束

相关推荐

Log Author Actions

是否有保存后期创建/删除、页面创建/删除、修改等操作的位置?这是否存储在Apache日志中?如果没有保存,有没有办法(插件?)这样做?