Find Site ID From WP_Post

时间:2020-09-21 作者:XedinUnknown

我正在编写一个迁移工具,可以将多站点网络上的帖子从一个站点移动(复制,然后删除)到另一个站点。我想正确地区分关注点,从这个角度来看,为了将帖子从一个站点迁移到另一个站点,您需要两件事:

由一个WP_Post 对象

    问题

    我怎么能,因为我只有一个WP_Post 实例,是否获取其所属站点的ID?

    备注

    预见仅使用get_current_blog_id(): 这将获得当前站点的ID,不管是什么。我想要给定帖子所属站点的ID。

    对于那些说;如果您正在处理一篇帖子,您可能知道它来自哪里,因为您查询了它“quot;:

    function doSomethingWithPost(WP_Post $post)
    {
      // No, I do not know that
    }
    
    看来WP_Post 对象不包含将其跟踪到其站点所需的信息。票#51373 针对此问题提出。

1 个回复
SO网友:Tom J Nowell

No, post objects do not store this data. You need to store the site ID separately.

Post对象不存储创建它们的网站或当前承载它们的网站。这些信息在posts表中不存在,WordPress也不会在其他地方跟踪它。假设帖子总是来自当前站点。

您正在编写的代码需要以某种方式存储源站点ID。一些插件通过post-meta实现这一点。

但是,如果您已经有已迁移的帖子,则必须加载每个站点,并查询具有相同ID的帖子,然后比较它们,如果它们匹配,您就会找到它。这假设两端均未进行任何修改。

Q: How do we know this?

因为在WP_Post 存储站点ID或网络ID的。检查包含post对象的变量时,也会显示此信息不可用。

Q: What do other plugins/developers do?

如果他们需要将帖子迁移到另一个站点,但还需要将其追溯到其源,他们会将这些详细信息存储在帖子元中。

例如,原始URL、站点ID和帖子ID可以存储为帖子元。这对于UI来说很有用,可以告诉用户帖子已经被迁移或联合。这就是syndicatordistributor 插件可以。

Q: Can the GUID be used?

不,GUID并不总是URL,也不总是最新的,也不总是表示源。

例如,如果posts slug或URL更改,GUID不会更改,GUID可以是哈希而不是URL,GUID可以是远程URL,也可以是来自旧永久链接结构或旧站点URL的URL。

Q: Do we need to get the site ID from a post object?

不如果你有一个post对象,那么在某个时候你就处于它来自的站点的上下文中。将站点ID作为第二个参数传递。

理想情况下,您的函数应该接收帖子ID和站点ID,而不是帖子对象:

function doSomethingWithPost( int $post_id, int $site_id=0 ) {
    switch_to_blog( $site_id );
    $post = get_post( $post_id );
    // ....
    restore_current_blog();
}
或者,应假设现场为当前现场,以及switch_to_blog 提前调用,例如:

switch_to_blog( $site_id );
doSomethingWithPost($post_id);
restore_current_blog();
我建议将站点ID作为函数参数传递,这样就可以进行良好的依赖注入。

相关推荐

Page-slug.php不起作用,但仅适用于特定的插件

我正在尝试创建一个名为“的页面”;“漫画”;带着鼻涕虫“;“漫画”;用作我的网络经济网站的主目录。我已经创建了一个页面的漫画。然而,当我转到页面时,它只是链接回索引。php。当我尝试使用ID时,它也不起作用。当我尝试在其他slug和id中使用相同的格式时,效果很好,所以我知道WordPress工作正常。我认为这可能与我在函数中的某些内容相冲突。php,但是没有其他名称使用;“漫画”;(我已链接到下面的文件,供任何人查看)。我还尝试清理数据库中可能使用该slug的任何已删除项目,但一无所获。有人知道是什么导