WordPress.org

Make WordPress Core

Opened 18 months ago

Last modified 6 months ago

#38851 new defect (bug)

WP_User_Query cannot retrieve multisite users who have not been assigned a role on a site

Reported by: robdxw Owned by:
Milestone: Future Release Priority: normal
Severity: normal Version:
Component: Users Keywords: needs-patch needs-unit-tests
Focuses: Cc:

Description

If you add a user to a multisite at network level, but do not proceed to assign them a role on a site within the network, WP_User_Query cannot retrieve those users (even if the query is run at network level), as they have no associated wp_capabilities meta_key.

To reproduce the problem:

1) Add a user to a multisite via Network Admin > Users > Add New. 2) Run a WP_User_Query at network level (e.g. by doing something like:

add_action('load-users.php', 'myAction');

function myAction()
{
  $screen = get_current_screen();
  if( $screen->base === 'users-network' {
    $query = new WP_User_Query();
    $users = $query->results;
  }
}

The returned results will not include the user added in step 1. In fact, it will only return users who have capabilities set on the first site in the network, even though this query is not occurring at site level.

This could be fixed by allowing something like 'blog_id' => 'all' in a WP_User_Query.

Change History (9)

This ticket was mentioned in Slack in #core by helen. View the logs.


18 months ago

#2 @johnbillion
18 months ago

  • Keywords needs-patch needs-unit-tests added
  • Version trunk deleted

#3 @johnbillion
18 months ago

  • Milestone changed from Awaiting Review to 4.8

Thank you for the report, @robdxw, and welcome to Trac. I'll be tackling several issues related to users with no role in 4.8.

#5 @stormrockwell
18 months ago

I feel that 'blog_id' => -1 would be a better choice so we don't mix primitives and it would resemble 'all' like 'posts_per_page' => -1 in many WP functions.

This ticket was mentioned in Slack in #core by flixos90. View the logs.


12 months ago

#7 @flixos90
12 months ago

  • Milestone changed from 4.8 to Future Release

Let's deal with this in a future release, in combination with the other tickets related to no-role users.

#8 @tomdxw
12 months ago

It's actually possible to retrieve all users on multisite: get_users(['blog_id' => 0]);

This is counterintuitive because in most of WordPress, -1 is used to indicate "all" and 0 is used to indicate "use the current site or user". And this feature appears to be undocumented. The documentation just says "(int) The site ID. Default is the current site."

I'm not going to mark this bug as fixed. I think this feature should be documented, and 'blog_id' => -1 should work too, for consistency.

#9 @demsei
6 months ago

Good catch @robdxw! I am interested in a fix for this as well. For now I am using the solution @tomdxw posted:

<?php
$args = array(
  'blog_id' => 0,
  'meta_query' => array(
    array(
      'key' => 'my.special.key',
      'compare' => 'NOT EXISTS'
    )
  )
);
Note: See TracTickets for help on using tickets.