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来说很有用,可以告诉用户帖子已经被迁移或联合。这就是syndicator 和distributor 插件可以。
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作为函数参数传递,这样就可以进行良好的依赖注入。