有没有一种方法可以知道页面何时更新,并只执行一次操作?

时间:2021-07-21 作者:Sunil Chaudhary

在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 statuspost.

下面是代码的外观:

此代码添加到函数中。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-draftpublish 因此,在发布过程中调用call\\u api一次。但同样的情况不知道如何更新。

甚至,我在多个地方读到,一次更新可以多次触发钩子,因此在这一点上卡住了。

如果需要任何其他信息,请告诉我。

Update 1: A sample scenario here for more clarity

对于每次发布和更新,我必须调用另一个服务并提交wordpress页面数据。

假设我想创建一个页面P。我将打开我的wordpress,写入我的内容,然后单击发布按钮。此时,update_data_be 函数被多次激发(因为挂钩可以多次激发),但是call_apiRef 1 在上面的代码段中,由于新旧状态检查,只执行一次。在我的后端日志中,我看到一个API调用正在发生这正如预期的那样工作正常。

同样,我想更新页面。我将打开我的wordpress,更新内容并单击更新按钮。此时,update_data_be 函数被多次激发。而且call_apiRef 2 是发布旧状态和新状态的两倍。在我的后端日志中,我看到发生了两个API调用。我无法阻止两个API调用的发生。-这没有按预期工作,因为我只需要调用一次API。

希望上述情景能够澄清问题。

Update 2:

已在以下位置找到可能的解决方案:https://wordpress.org/support/topic/publish_post-hook-trigger-twice-when-i-publish-post/ 但这似乎是特定于编辑器的,可能会失败,所以不一定要使用它。

1 个回复
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
    }
}
这将在页面处于发布状态时创建或更新页面时触发。

如果需要在其他状态和其他条件下运行代码,请告诉我=]

相关推荐

Hiding menu on specific pages

我在某些页面上隐藏顶部菜单时遇到问题。以下是我试图隐藏菜单的网站https://domain.com/cookies-statement/ https://domain.com/privacy-policy/ 看来,来自其他线程的解决方案对我不起作用(或者我做错了什么),请告诉我这是否可能与我的主题一起实现谢谢