WordPress多站点-使用自定义查询加载用户

时间:2015-03-15 作者:Rakhitha Nimesh

我在WordPRess中有一个基本的自定义查询,可以加载所有用户,如下所示。

SELECT DISTINCT users.* FROM " . $wpdb->users . " as users

我如何修改它,以便可以从多站点网络中的每个博客分别加载用户?

请让我知道

谢谢

1 个回复
SO网友:bueltge

下面是我对这个问题的评论,下面是解决问题的例子。

默认功能get_users 要获取每个站点的所有用户,请在单个或多个站点区域上工作。但在多站点网络中,要从每个站点获得所有用户,切换到每个站点是很重要的。下面的示例演示了这一点。

// Multisite
// get sites in the Multisite network
$sites = wp_get_sites();
// Switch in each Site
foreach( $sites as $site ) {
    switch_to_blog( $site[ \'blog_id\' ] );
    // Get Users of each site
    var_dump( count( get_users() ) );
    restore_current_blog();
}
上面的代码获取计数(count()) 网络每个站点中的所有用户。

如果您在网络的单个站点中,那么get_users() 足以获取此网站的所有用户。函数使用WordPress全局$GLOBALS[\'blog_id\'] 在其ID上标识站点。

自定义要求的备选方案

如果该功能没有帮助,请使用WP_User_Query 满足您的要求。该类为您提供了许多获取每个站点中的用户数据的可能性。还可以使用switch_to_blog() 切换多站点的每个站点。请参见codex 有关有用的提示、参数和示例源。

小提示,功能get_users 是一种易于使用的包装WP_User_Query-班

多站点提示可以从网络中的另一个博客获取数据,也可以在同一个多站点安装上从另一个博客获取数据。有些人使用SQL命令来实现这一点,但这可能很慢,而且容易出错。

虽然这是一个固有的昂贵操作,但您可以使用switch\\u to\\u blog和restore_current_blog 在使用标准WordPress API的同时,使其更简单。

switch_to_blog( $blog_id );
// Do something
restore_current_blog();
restore_current_blog 撤消对的最后调用switch_to_blog, 但只有一步,调用才是不可嵌套的,所以始终调用restore_current_blog 通话前switch_to_blog 再一次

大型网络可以在网络中列出博客,但这是一件昂贵的事情。默认情况下,网络的WordPress计数为10000个站点。如果要更改此值,请参阅下面的源代码。

add_filter( \'wp_is_large_network\', function( $is_large, $type, $count ) {

    if ( ! $is_large )
        return $is_large;

    // $type can be \'sites\' or \'users\'
    if ( \'sites\' !== $type )
        return $is_large;

    // Default is 10000, we add one 0
    return $count > 100000;
}, 10, 3 );
可以使用wp_get_sites( $args ) 功能,自WordPress 3.7版起可用。该函数接受一个参数数组,指定要查找的站点类型。

此功能的限制为100个站点。如果网络更大,则必须通过函数上的参数更改此值。

缓存功能wp_get_sites( $args ) 自3.7版以来一直在内核中,但没有缓存。如果经常使用,请在缓存中转换结果,如WP_Cache 或瞬态。

缓存get_users() 结果,速度更快。

结束

相关推荐

与wp_USERS一起查询wp_usermeta

我想使用WordPress查询功能,而不需要外部插件。以下是我目前掌握的情况:add_filter(\'user_search_columns\', \'user_search_columns_bd\' , 10, 3); function user_search_columns_bd($search_columns, $search, $this){ if(!in_array(\'display_name\', $search_columns)){