WP functions.php 中的 OR 运算符问题
Issues with OR operator in WP functions.php
我们的 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".
我希望 'administrator' 角色也能够查看 $redaktor_pages 和 $mod_pages 中指定的页面,因为它包含在 if 语句中。
逻辑上我期望:(a = false || b = true) = true
实际情况是 'administrator' 无法查看特定变量中列出的页面,除非它们是 $admin_pages
这使得 if 语句的那部分看起来像这样处理:(a = false || b = true) = false
所以这里有 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;
}
}
请注意,&&
的优先级高于 ||
,因此此处的额外括号是隐含的且不必要的。但我发现最好还是明确包含它们。
我们的 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".
我希望 'administrator' 角色也能够查看 $redaktor_pages 和 $mod_pages 中指定的页面,因为它包含在 if 语句中。
逻辑上我期望:(a = false || b = true) = true
实际情况是 'administrator' 无法查看特定变量中列出的页面,除非它们是 $admin_pages
这使得 if 语句的那部分看起来像这样处理:(a = false || b = true) = false
所以这里有 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;
}
}
请注意,&&
的优先级高于 ||
,因此此处的额外括号是隐含的且不必要的。但我发现最好还是明确包含它们。