Проблемы с оператором OR в WP functions.php - PullRequest
0 голосов
/ 18 июня 2019

Наш веб-сайт Wordpress требует, чтобы некоторые страницы были видны только пользователям с определенными ролями. В настоящее время администратор не может получить доступ к страницам, указанным в $redaktor_pages и $mod_pages.

add_action( 'template_redirect', 'restrict_access' );
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;
    } 
}

Когда я использую логические операторы внутри оператора if: (a || b) && c похоже, что функция игнорирует "b".

Я ожидаю, что роль администратора также сможет просматривать страницы, указанные в $ redaktor_pages и $ mod_pages, видя, как они включены в оператор if.

Логически я бы ожидал: (a = false || b = true) = true

На самом деле происходит то, что «администратор» не может просматривать страницы, перечисленные в определенных переменных, если они не являются $ admin_pages

Это создает впечатление, что эта часть оператора if обрабатывается следующим образом: (a = false || b = true) = false

1 Ответ

1 голос
/ 18 июня 2019

Итак, у вас есть 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;
    } 
}

Обратите внимание, что && имеет более высокий приоритет, чем ||, поэтому дополнительные круглые скобки, которые вы здесь видите, подразумеваются и не нужны. Но я считаю, что лучше все равно явно включать их.

...