将某项操作推迟到当前操作完成

时间:2019-02-08 作者:Harv

我有两个在更新帖子时运行的操作。问题是,第二个函数在第一个函数完成之前运行。

add_action(\'save_post\', \'postUpdate\', 10);

add_action(\'post_updated\', ‘deleteCacheOnCloudfront ’, 1000, 3);
让第一个函数在第二个操作开始之前完成的最佳方法是什么?有没有另一个更晚开始的钩子?同时,我设置了一个一次性cron,使其在5秒后激活,我认为这不是一个优雅的解决方案。

谢谢

1 个回复
SO网友:birgire

请注意third input argument 对于save_post 回调,告诉我们是否是update or not. 我想这可能会有帮助。

以您的实际情况为例,一个建议可能是:

add_action( \'save_post\', function(  $post_ID, $post, $update ) {

   postUpdate( $post_ID );

   if ( $update ) {
       deleteCacheOnCloudfront( $post_ID, $post, $update );
   }

}, 10, 3 );
运行deleteCacheOnCloudfront() 函数之后postUpdate() 仅用于发布更新。

这个save_post 是一个非常通用的钩子,还有更具体的钩子,比如save_post_{post_type} 或者其他基于post状态转换的,如果您想避免在运行代码时。不需要了。

这个postUpdate() 函数名非常通用,因此您应该考虑使用命名空间或函数前缀,以避免可能的名称冲突。

希望deleteCacheOnCloudfront() 运行速度快(超时时间短),不会让用户在每次后期保存期间等待太长时间。

希望有帮助!

Update:

如果deleteCacheOnCloudfront() 取决于$post_before$post_after 我们可以考虑:

/**
 * Run postUpdate() on save_post with priority 10.
 */
add_action( \'save_post\', function(  $post_ID, $post, $update ) {
   postUpdate( $post_ID );
}, 10, 3 );

/**
 * Run deleteCacheOnCloudfront() on save_post with priority 11 when post is updated.
 */
add_action( \'post_updated\', function(  $post_ID, $post_before, $post_after ) {
    add_action( \'save_post\', 
        function(  $post_ID, $post, $update ) use ( $post_before, $post_after ) {
            deleteCacheOnCloudfront( $post_ID, $post_before, $post_after );
        }, 11, 3 );
}, 10, 3 );
其中,我们使用use 关键字并使用不同的优先级以确保deleteCacheOnCloudfront() (优先级11)在postUpdate() (优先级10),在save_post 行动

我们也可以将其编写为类,以便跨不同的挂钩移动数据。

相关推荐

自定义发布类型的POST_ROW_ACTIONS

我正在使用this 在WordPress Admin中具有重复post函数的代码。但是,当我为自定义帖子类型添加过滤器时,如下所示:add_filter( \'directory_row_actions\', \'rd_duplicate_post_link\', 10, 2 ); (自定义帖子类型的注册名称为directory) - 它不会将其添加到条目标题下的操作行中。当我为帖子或页面执行此操作时,如下所示:add_filter( \'post_row_actions\', \'rd_dup