在wordpress cms中有很少的页面。无论何时发布或更新任何页面,都需要执行一些操作(基本上调用API来更新另一个后端服务中的一些数据)。
对于发布,我能够识别该点并能够触发一次操作。对于更新,我无法识别该点,因此,即使我更新一次页面,操作也会触发多次
Is there a way to know if an already published post was updated and call some function only one time?
Here are the details:
要获取操作的触发点,我使用
transition_post_status
行动我正在添加一个回调
old status
,
new status
和
post
.
下面是代码的外观:
此代码添加到函数中。php
add_action(\'transition_post_status\', \'update_data_be\', 10, 3);
function update_data_be($new_status, $old_status, $post) {
if ($old_status === \'auto-draft\' && $new_status === \'publish\' && $post->post_type === \'page\') {
// Ref 1
call_api(); // Each time a page is published - this runs only one time
} else if ($new_status === \'publish\' && $post->post_type === \'page\') {
// Ref 2
call_api(); // Each time already published page is updated - this runs twice.
// Need to avoid this from running multiple times
}
}
function call_api() {
// Some code to do an API call
}
对于发布,由于旧的\\u状态和新的\\u状态不同;post从
auto-draft
到
publish
因此,在发布过程中调用call\\u api一次。但同样的情况不知道如何更新。
甚至,我在多个地方读到,一次更新可以多次触发钩子,因此在这一点上卡住了。
如果需要任何其他信息,请告诉我。
Update 1: A sample scenario here for more clarity
对于每次发布和更新,我必须调用另一个服务并提交wordpress页面数据。
假设我想创建一个页面P。我将打开我的wordpress,写入我的内容,然后单击发布按钮。此时,update_data_be
函数被多次激发(因为挂钩可以多次激发),但是call_api
在Ref 1
在上面的代码段中,由于新旧状态检查,只执行一次。在我的后端日志中,我看到一个API调用正在发生这正如预期的那样工作正常。
同样,我想更新页面。我将打开我的wordpress,更新内容并单击更新按钮。此时,update_data_be
函数被多次激发。而且call_api
在Ref 2
是发布旧状态和新状态的两倍。在我的后端日志中,我看到发生了两个API调用。我无法阻止两个API调用的发生。-这没有按预期工作,因为我只需要调用一次API。
希望上述情景能够澄清问题。
Update 2:
已在以下位置找到可能的解决方案:
https://wordpress.org/support/topic/publish_post-hook-trigger-twice-when-i-publish-post/ 但这似乎是特定于编辑器的,可能会失败,所以不一定要使用它。
SO网友:Buttered_Toast
你可以这样做。
add_action(\'publish_page\', \'bt_publish_post\', 10, 2);
function bt_publish_post ($post_id, $post) {
// our bt_page_status codes will indicate one of three thing
// if empty than we know that page is published
// if 1 we know that page was updated for the first time
// if 2 we know that page was updated for the second and so on time (2,3,4 stc... times)
$bt_page_status = get_post_meta($post_id, \'bt_page_status\', true);
if (empty($bt_page_status)) {
// page is published
// do some code here
// now we set bt_page_status to 1 so next time we know that page is being updated for the first time
update_post_meta($post_id, \'bt_page_status\', 1);
} elseif ($bt_page_status == 1) {
// page is updated for the first time
// do some code here
// now we set bt_page_status to 2 so next time we know that page is being updated for the second and so on time
update_post_meta($post_id, \'bt_page_status\', 2);
} elseif ($bt_page_status == 2) {
// page is updated for the second and so on time
// do some code here
// if you need more checks you can continue adding them accordingly
}
}
这将在页面处于发布状态时创建或更新页面时触发。
如果需要在其他状态和其他条件下运行代码,请告诉我=]