WP functions.php中OR运算符的问题

时间:2019-06-18 15:54:28

标签: php wordpress boolean-logic

我们的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 个答案:

答案 0 :(得分:1)

因此,您在这里有3组条件,如果其中任何一个条件为true,则拒绝访问。

对于第二和第三个条件,您的问题是您正在使用(a || b) && c,但事实并非如此。您正在使用(!a || !b) && c,这是非常不同的事情。考虑一下ORNOT的组合是什么意思。这两个条件都被评估,并且其中一个条件为真都会导致条件为真。

因此,当您检查管理员是否为NOT editor OR NOT administrator时,条件将评估为true,因为他们是NOT的编辑者。您想使用AND来检查两个条件都不成立。检查管理员为NOT editor AND NOT administrator的结果为false。

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;
    } 
}

请注意,&&的优先级高于||,因此您在此处获得的多余括号是隐含的和不必要的。但我发现最好还是明确地将它们包括在内。