damienoneill2001
damienoneill2001

Reputation: 499

Show content based on multiple user roles in WordPress

I am looking to display content based on multiple different user roles.

The aim is to display content for two or three different user roles, and then block it for other user roles, displaying a message that it is only for certain logged in users.

So far, I have the following:

<?php 
    global $user_login, $current_user;
    get_currentuserinfo();
    $user_info = get_userdata($current_user->ID);
    $roles = array (
        'administrator',
        'subscriber',
    );

if (is_user_logged_in() && in_array( $roles, $user_info->roles)) {

//content here

} else {

// they aren't logged in, so show them the login form

}
?>

At the moment, the issue I am having seems to be that the code is looking for both the administrator and subscriber roles at the same time and as a result, the if statement is not satisfied and the login form shows.

If I change $roles to 'administrator' or 'subscriber', it then works fine.

So, how would I search through the array to display either role, not all of them.

Thanks

Upvotes: 1

Views: 4374

Answers (1)

Jamie Harding
Jamie Harding

Reputation: 383

You could use: array_intersect (link)

array_intersect will check between two array to see if the needle ($roles) exists in the haystack ($user_info->roles). I have tested this against my own and works well.

See below the use of array_intersect.

<?php 
    global $user_login, $current_user;
    get_currentuserinfo();
    $user_info = get_userdata($current_user->ID);
    $roles = array (
        'administrator',
        'subscriber',
    );

if (is_user_logged_in() && array_intersect( $roles, $user_info->roles)) {

echo 'success';

} else {

echo 'failure';

}
?>

Example 1: LINK the $roles array does not match.

Example 2: LINK the $roles array has one match.

Upvotes: 5

Related Questions