WP 函数中 OR 运算符的问题.php

Issues with OR operator in WP functions.php

提问人:ForfA 提问时间:6/18/2019 最后编辑:miken32ForfA 更新时间:6/19/2019 访问量:75

问:

我们的 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 语句中使用逻辑运算符的地方:该函数似乎忽略了“b”。(a || b) && c

我希望“管理员”角色也能够查看 $redaktor_pages 和 $mod_pages 中指定的页面,因为它包含在 if 语句中。

从逻辑上讲,我期望:(a = false || b = true) = true

实际发生的情况是,“管理员”无法查看特定变量中列出的页面,除非它们是 $admin_pages

这使得 if 语句的那部分看起来好像是这样处理的:(a = false || b = true) = false

php wordpress 布尔逻辑

评论

0赞 cabrerahector 6/19/2019
试着在纸上一行一行地写下你的条件,你就会明白问题出在哪里。
0赞 ForfA 6/19/2019
@cabrerahector设法通过重新排列来修复中间部分,如下所示: (!current_user_can('editor' ||'administrator') && $redaktor_pages)。在尝试了 () 的不同组合后,仍然不确定第三个。
0赞 miken32 6/19/2019
'editor' || 'administrator'只是评估,所以我认为这不会解决任何问题!true

答:

1赞 miken32 6/19/2019 #1

因此,这里有 3 组条件,如果其中任何一组的计算结果为 true,则访问将被拒绝。

对于您的第二个和第三个条件,您的问题说您正在使用,但事实并非如此。你正在处理的是另一回事。想想 和 的组合意味着什么。两个条件都进行计算,其中任何一个条件为真都会导致条件为真。(a || b) && c(!a || !b) && cORNOT

因此,当您检查管理员是否是管理员时,条件的计算结果为 true,因为他们是编辑者。您想要用于检查这两个条件是否都不成立。检查管理员的计算结果为 false。NOT editor OR NOT administratorNOTANDNOT 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;
    } 
}

请注意,它的优先级高于 因此,您在此处获得的额外括号是隐含的,是不必要的。但我发现无论如何都最好明确地包含它们。&&||

评论

0赞 ForfA 6/19/2019
这种方法是有道理的。随着时间的流逝,被困在“用户是编辑者还是管理员?”上很可能会让我更加困惑。对 OR 和 NOT 组合的进一步了解有望帮助我在未来避免这些问题。