WordPress在更新时发送了多个请求

时间:2021-08-26 作者:Borje

当我在帖子上按update(本例中的第页)时,我遇到了多次触发挂钩的问题

我尝试了这里的一切:Unable to prevent function using save_post firing twice

但由于看起来我收到了多个请求,我开始检查访问日志。

当我点击更新时,这些是发送的帖子:

[ip_number] - - [26/Aug/2021:15:31:00 +0000] "POST /wp-json/wp/v2/pages/1373?_locale=user HTTP/2.0" 200 3805 "https://example.com/wp-admin/post.php?post=1373&action=edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
[ip_number] - - [26/Aug/2021:15:31:00 +0000] "POST /wp-admin/post.php?post=1373&action=edit&meta-box-loader=1&meta-box-loader-nonce=[nonce]&_locale=user HTTP/2.0" 302 0 "https://example.com/wp-admin/post.php?post=1373&action=edit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
所以我开始做一些日志记录:

add_action("publish_page", "my_publish_page", 10, 2);
function my_publish_page($postId, $post) {
    error_log("Debug for my_publish_page");
    error_log("postId: " . $postId);
    error_log("GET: ". var_export($_GET, true));
}
日志文件显示:

[26-Aug-2021 15:41:59 UTC] Debug for my_publish_page
[26-Aug-2021 15:41:59 UTC] postId: 1373
[26-Aug-2021 15:41:59 UTC] GET: array (
  \'_locale\' => \'user\',
)
[26-Aug-2021 15:41:59 UTC] Debug for my_publish_page
[26-Aug-2021 15:41:59 UTC] postId: 1373
[26-Aug-2021 15:41:59 UTC] GET: array (
  \'post\' => \'1373\',
  \'action\' => \'edit\',
  \'meta-box-loader\' => \'1\',
  \'meta-box-loader-nonce\' => \'[nonce]\',
  \'_locale\' => \'user\',
)
因此,发送两个请求,都会触发publish\\u page操作挂钩(以及save\\u post或任何您喜欢的类似挂钩)。两者都具有帖子的发布状态,对于wp\\u is\\u post\\u autosave(或do\\u autosave),它们都不是真的。

例如,我可以查看$\\u GET变量,仅在$\\u GET[\'post]=$posid时触发我的代码,但这似乎有点粗糙。为什么会发生这种情况,是否有一个干净的解决方案来防止这种情况的发生;“双重射击”;?

1 个回复
最合适的回答,由SO网友:Borje 整理而成

我找到了一个解决方案:

function myAction() {
    if(defined("REST_REQUEST") && REST_REQUEST) {
        return;
    }

    // Do action stuff
}
对的请求/wp-json/wp/v2/pages/1373 是对定义常量的API的请求REST_REQUEST 并将其设置为真。

如果有人知道为什么会发送额外的API请求,请随时添加您的答案。

相关推荐

Adding custom Bulk Actions

我一直在寻找将自定义批量操作添加到类别页面的方法。他们中的大多数人说,不可能用干净的方式来做这件事,因为这件事没有挂钩。大多数解决方案包括在客户端使用JS通过DOM操作添加选项。虽然这是可行的,但它仍然是一个相当丑陋的解决方案。我读过的大多数文章都是2年前的,所以我一直在想,从那时起到现在,这个问题已经添加了一个新的挂钩或解决方案,以便对这个问题有一个更及时的解决方案。