为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕勒3428872 2021-08-28 10:07:34
我们的 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 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

所以这里有 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;

    } 

}

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


查看完整回答
反对 回复 2021-08-28
  • 1 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信