Итак, у вас есть 3 набора условий, и если какое-либо из них оценивается как истинное, доступ запрещается.
Для вашего второго и третьего условий ваш вопрос говорит, что вы работаете с (a || b) && c
, но это не так. Вы работаете с (!a || !b) && c
, что совсем другое. Подумайте, что означает комбинация OR
и NOT
. Оба условия оцениваются, и любое из них, являющееся истинным, приводит к тому, что условие является истинным.
Таким образом, когда вы проверяете, является ли администратор NOT editor OR NOT administrator
, тогда условие оценивается как истинное, поскольку они NOT
являются редактором. Вы хотите использовать AND
, чтобы проверить, что оба условия не выполняются. Проверка администратора NOT editor AND NOT administrator
оценивается как ложное.
function restrict_access() {
//pages for admins
$admin_pages = is_page(array('veiledning-administrator', 'database'));
//pages for redaktør
$redaktor_pages = is_page(array('veiledning-redaktor'));
//pages for moderators
$mod_pages = is_page(array(''));
//users forum role
$forum_role = bbp_get_user_display_role( get_current_user_id() );
if(
(!current_user_can('administrator') && $admin_pages) ||
(!current_user_can('editor') && !current_user_can('administrator') && $redaktor_pages) ||
($forum_role != 'moderator' && !current_user_can('administrator') && $mod_pages)
) {
wp_redirect('/');
exit;
}
}
Обратите внимание, что &&
имеет более высокий приоритет, чем ||
, поэтому дополнительные круглые скобки, которые вы здесь видите, подразумеваются и не нужны. Но я считаю, что лучше все равно явно включать их.