Testing if user belongs to group, has_term() proves unreliable
-
I am using WP User Groups on a BuddyPress powered site, with some extensive Profile Groups that need to be filled after signup.
Here is the logic I am applying:
- Users that subscribe to BuddyPress get nagged by a message asking to complete the profile – unless they belong to the User Group “profile-complete” (that’s where WP User Groups comes in).
- Once their profile is complete, my function adds them to the “profile-complete” group – using wp_set_object_terms() – end sends them a confirmation message using wp_mail().
The problem I encounter: after extensive testing, I discover that my method of verifying if a user is part of a group does not work reliably. For most test users, it works… but for *some* users, the test never validates and they get a confirmation message on every page load.
The method I used to test if the user belongs to “profile-complete”: has_term() which was working fine in my first testing, but proved unreliable.
Here is a sample code that helped me isolate the problem:
Let’s assume our group “profile-complete” has an ID = 42.
First, I generate an array of users in “profile-complete”, using get_objects_in_term():
$ids_of_complete_users = get_objects_in_term( 42 , 'user-group' );
This produces an array of users belonging to that group. Let’s assume we have two of them, the output could be:
array(2) { [0]=> string(3) "203" [1]=> string(3) "235" }
To make sure if my test is valid, I will now loop through all existing users:
$user_fields = array( 'user_login', 'user_nicename', 'display_name', 'user_email', 'ID' ); $user_query = new WP_User_Query( array( 'fields' => $user_fields ) );
I prepared my user list, now I run the loop, including two tests:
if ( ! empty( $user_query->results ) ) { foreach ( $user_query->results as $user ) { // Test if user belongs to term 42 using has_term() if ( has_term( 42, 'user-group', $user->ID ) ) { echo '<p>according to has_term(), user '.$user->ID.' belongs to group 42.</p>'; } // Test if user belongs to term 42 using in_array() ... we previously defined $ids_of_complete_users if ( in_array( $user->ID, $ids_of_complete_users ) ) { echo '<p>according to in_array(), user '.$user->ID.' belongs to group 42.</p>'; } } }
The expected result would be that both methods return a result for user 203 and 235.
Surprisingly, this is the actual result:
according to in_array(), user 235 belongs to group 42. according to in_array(), user 203 belongs to group 42. according to has_term(), user 203 belongs to group 42.
This means that has_term() fails to return the correct result for user 235. I applied my test to a real site (already in use for some years, about 150 users), and has_term() gives wrong results for about 50% of cases.
Any explanation? Is the user ID conflicting with the ID of other items (posts), hence confusing has_term() about which object to test?
- The topic ‘Testing if user belongs to group, has_term() proves unreliable’ is closed to new replies.