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

我们的 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


慕勒3428872
浏览 144回答 1
1回答

炎炎设计

所以这里有 3 组条件,如果其中任何一个条件为真,则访问被拒绝。对于您的第二个和第三个条件,您的问题说您正在使用,(a || b) && c但事实并非如此。你正在与之合作,(!a || !b) && c这是一件非常不同的事情。想想OR和的组合是什么NOT意思。两个条件都被评估,其中一个为真导致条件为真。因此,当您检查是否是管理员时NOT editor OR NOT administrator,条件评估为真,因为他们是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;    } }请注意,&&具有更高的优先级,||因此您在此处获得的额外括号是隐含且不必要的。但我发现无论如何最好明确包含它们。
打开App,查看更多内容
随时随地看视频慕课网APP