回调也挂接到更新后的新帖子的触发

时间:2021-02-03 作者:Renato S. Bispo

Context: 我使用的插件允许我在整个网站中添加作者框(Simple Author Box), 同时为任何用户提供一种简单的方式来更新其社交媒体链接和个人资料图片。我想我也可以利用这个插件在网站的about部分动态显示团队成员。

然而,我不想为将来不会发布任何帖子的团队成员(设计师、我自己等)提供作者档案,所以我使用了this question 作为禁用特定用户的作者存档的起点,我在那里创建了一些额外的功能,以自动化该功能(作者存档现在根据每个用户发布的帖子数量自动禁用/启用)。

其中一个函数连接到post_updated, 根据the docs: "E;每年发射一次existing 帖子已更新"E;[增加强调]

下面是函数的代码(请原谅我缺乏良好的实践,我是PHP新手,不是一个有经验的程序员):

/* 
* This function does the checks and the actual value update, if needed.
* It\'s called from inside the callback.
*/
function maybe_update_author_archive_status($user_id, $published_posts, $author_archive_disabled) {
    if ($published_posts == 0 && $author_archive_disabled != \'on\') {
        update_user_meta($user_id, \'_author_archive_disabled\', \'on\');
    } elseif ($published_posts != 0 && $author_archive_disabled != \'off\') {
        update_user_meta($user_id, \'_author_archive_disabled\', \'off\');
    }
}

/* 
* The callback itself.
*/
function maybe_update_author_archive_status_on_post_update($post_id, $post_after, $post_before) {
    if($post_before->post_status != \'publish\' && $post_after->post_status != \'publish\') {
        return;
    }
    
    $old_author = $post_before->post_author;
    $new_author = $post_after->post_author;
    $authors = array($old_author);
    
    /* If the post author has changed, I might need to update both author archive status */
    if($new_author != $old_author) {
        $authors[] = $new_author;
    }

    foreach($authors as $author) {
        $user_id = intval($author, 10);
        $author_archive_disabled = get_user_meta($user_id, \'_author_archive_disabled\', true);
        $published_posts = count_user_posts($user_id);

        maybe_update_author_archive_status($user_id, $published_posts, $author_archive_disabled);
    }
}
add_action(\'post_updated\', \'maybe_update_author_archive_status_on_post_update\', 10, 3);
然而,令我惊讶的是(事实上也很高兴),当我创建并发布一篇新文章时,它也会被激活。谁能解释一下为什么?在什么情况下不会触发此函数?尽管这是我想要的行为,并且一切都按照我想要的方式工作,但这并不是我在阅读文档后所期望的。

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

在我创建和发布新帖子时也会触发

如果您是指类似的内容,请单击;添加新的“;按钮(该按钮可将您带到位于/wp-admin/post.php), 然后你写了一篇文章,最后点击了;“发布”;按钮,那么对于post_updated 钩子可以被射击两次或更多次。

为什么会这样或发生了什么:

单击;添加新的“;按钮,WordPress将自动创建带有auto-draft 状态(post_status = auto-draft).

撰写帖子时,WordPress会自动保存帖子,这样你就不会丢失到目前为止所撰写的内容,每次自动保存时post_updated 吊钩将被引爆。请注意,在自动保存期间,post状态设置为draft.

在您点击;“发布”;按钮,WordPress更新帖子(状态从auto-draft draftpublish), 然后post_updated 钩子将再次开火。

正如您所见,当您手动创建和发布帖子时,钩子可能会被触发至少两次。

但如果您以编程方式执行此操作,例如使用wp_insert_post(), 那么钩子就不会被发射了。但请注意,如果您的主题中有插件或自定义代码,则可能会触发挂钩,例如通过save_post 并修改post slug,然后调用wp_update_post():

// In a default WordPress setup/installation:

// This will not fire the post_updated hook.
$id = wp_insert_post( array(
    \'post_title\'  => \'Just testing\',
    \'post_status\' => \'publish\',
) );

// And this will fire it, but just once.
wp_update_post( array(
    \'ID\'           => $id,
    \'post_content\' => \'Sample content\',
) );
我认为您可能只想在帖子没有自动保存的情况下执行代码,无论是自动草稿还是revision.

因此,您可以检查DOING_AUTOSAVE 是定义的,并且是真实的:

// In your function (maybe_update_author_archive_status_on_post_update()), at the top:
if ( defined( \'DOING_AUTOSAVE\' ) && DOING_AUTOSAVE ) {
    return;
}

相关推荐

Wodpress XML Import hooks

要将来自给定远程站点的帖子合并到给定类别下的一个站点中,我如何挂接导入插件以保存给定类别的帖子:给出的示例:接收方站点具有类别auto 我想从(例如)导入所有帖子auto.com 在下面this category. 如果远程帖子有另一个类别auto 添加为子级。应该下载内部帖子图片,更新帖子内的所有链接,因此我已经找到了一个核心方法,下面是我尝试的方法,但我认为这可以变得更简单<?php if (!class_exists(\'Wp_Http\')) in