从备用网络站点按分类查询帖子

时间:2014-05-05 作者:Michael Ecklund

我的WordPress多站点设置中有5个网络站点。

其中一个是“主网站”,其他网站将从中检索数据。

我当前正在使用WP_Query(); 检索帖子和switch_to_blog() / restore_current_blog(); 呼叫之前和之后WP_Query(); 如果当前站点不是主站点。

从主站点获取的帖子检索得很好。

当我转到网络中任何其他非主站点的站点时,它应该切换到主站点,从自定义帖子类型和自定义分类中检索帖子。找到帖子后,还原当前博客。

然而,这些子站点返回的帖子为零。我觉得很奇怪。所以我把WP_Query(); 在主站点和任何子站点上。

特别注意request 查询对象的一部分。

Request when on primary website:

[request] => SELECT SQL_CALC_FOUND_ROWS  ples_posts.ID FROM ples_posts  INNER JOIN ples_term_relationships ON (ples_posts.ID = ples_term_relationships.object_id) WHERE 1=1  AND ( ples_term_relationships.term_taxonomy_id IN (16) ) AND ples_posts.post_type = \'mbe-sales-listings\' AND ((ples_posts.post_status = \'publish\')) GROUP BY ples_posts.ID ORDER BY ples_posts.post_date DESC LIMIT 0, 5

Request when on any sub site:

[request] => SELECT SQL_CALC_FOUND_ROWS  ples_posts.ID FROM ples_posts  WHERE 1=1  AND 0 = 1 AND ples_posts.post_type = \'mbe-sales-listings\' AND ((ples_posts.post_status = \'publish\')) GROUP BY ples_posts.ID ORDER BY ples_posts.post_date DESC LIMIT 0, 4
每页的帖子都是不同的,所以这无关紧要。

关键是,当从任何子站点请求查询时,它似乎是在查询自定义帖子类型,但它甚至没有考虑自定义分类法。

Note:

自定义帖子类型以及该自定义帖子类型的所有自定义分类仅在主站点上注册。

当在所有子站点上注册自定义帖子类型以及该自定义帖子类型的所有自定义分类法时,它会按照预期检索帖子。

我并不特别想在任何子网站上注册自定义帖子类型或任何自定义分类法。我只希望他们在主站点注册。

既然你已经知道了这个复杂的故事,那么问题来了。。。

Is there any way I can only have the custom post type and all custom taxonomies registered on the primary site, and still be able to retrieve the necessary posts from any of the sub sites?

我想用一种特殊的$wpdb; 查询,不可能使用switch_to_blog();, WP_Query();, 和restore_current_blog();.

如果可以使用$wpdb; 查询时,我希望您能提供有关安全和正确的SQL查询的指导。我只是想从指定的站点ID、帖子类型和分类法/术语中查询所有已发布的帖子。

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

经过一番思考,我想出了一个可能的“解决方案”。然而,这并不完全是我希望走的路线。

必须在所有网络站点上注册自定义帖子类型和该自定义帖子类型的所有自定义分类,以便WP_Query(); 从网络中的任何子站点从主站点获取帖子。

至少作为一种临时解决方案,我指定了以下设置来帮助从子站点“隐藏”自定义帖子类型和自定义分类法。

首先,我指定了两个全局变量以在整个插件中使用。一个用于主站点ID,另一个用于当前站点ID。然后可以将这些变量全球化为任何类方法或函数。

$GLOBALS[\'mbe_primary_site_id\'] = 1;
$GLOBALS[\'mbe_current_site_id\'] = get_current_blog_id();
注册自定义帖子类型时。。。我添加了一个检查,并修改了一些post类型的注册参数。

global $mbe_primary_site_id, $mbe_current_site_id;
if($mbe_current_site_id != $mbe_primary_site_id){
    $args[\'show_ui\'] = false;
    $args[\'public\'] = false;
    $args[\'show_in_menu\'] = false;
}
注册自定义分类时。。。我添加了一个检查,并修改了一些分类法注册参数。

global $mbe_primary_site_id, $mbe_current_site_id;
if($mbe_current_site_id != $mbe_primary_site_id){
    $args[\'show_ui\'] = false;
    $args[\'public\'] = false;
}
现在,我可以从主站点的任何子站点上按分类法查询帖子,如:switch_to_blog($mbe_primary_site_id);, WP_Query(...);, 和restore_current_blog();

我不知道是否有切实可行的方法。我所知道的是这种方法是有效的,如果你通过$wpdb; 查询时,将涉及相当多的条件逻辑和检查,特别是如果您计划对内容分页的话。

这只会更痛苦,需要做很多额外的工作$wpdb; 对于所有内容,您也可以在子站点上注册自定义帖子类型和自定义分类法,并在子站点上隐藏对它们的访问权限。

结束

相关推荐

获取META_QUERY值的Foreach

如何获取meta\\u查询值中每个值的meta\\u框,下面是代码:$my_id = get_post_meta(get_the_ID(), \"artist_name\", true); $artistNames = array(); foreach($my_id as $id) { $artistNames[] = $id; } $artists = implode($artistNames,\", \"); $args = arr