按用户类型限制WordPress文件类型上载

时间:2017-04-18 作者:Ctyldsley

我希望限制所有用户(管理员除外)只能上传图像,例如允许所有用户上传JPG和PNG,但仍允许管理员上传PDF等(或者更好的做法是只阻止未注册用户上传JPG和PNG以外的任何内容!)

我一直在尝试以下功能。php代码,但它似乎仍然限制管理员上载PDF:

add_filter(\'upload_mimes\',\'restict_mime\'); 
function restict_mime($mimes) { 
if(!current_user_can(‘administrator’)){
    $mimes = array( 
                \'jpg|jpeg|jpe\' => \'image/jpeg\', 
                \'png\' => \'image/png\', 
    ); 
}
    return $mimes;
}
有什么想法吗?

2 个回复
最合适的回答,由SO网友:Johansson 整理而成

您的条件中存在语法错误:

current_user_can(‘administrator’)
输入值被包装在‘ ’, 应该用\' \' 相反现在,因为‘administrator’ 既不是角色也不是功能,上述内容将始终返回假值,因此

if(!current_user_can(‘administrator’))
将始终返回true, 这将限制每个人(包括管理员)的mime类型。正确的形式为:

if( !current_user_can(\'administrator\') ) { 
    //CODE HERE
}

SO网友:Nathan Johnson

代码不起作用的原因是因为代码中存在印刷错误。该代码实际上触发了一个错误。您可以启用debug mode 查看错误。

但这并不是你的代码真正的问题所在。真正的错误是,您使用的函数检查user capability 并尝试检查用户的角色。这是因为WordPress是如何处理角色和功能的,但这不是检查用户角色的正确方法。

实际上,在中使用用户角色current_user_can() 可能会触发_doing_it_wrong() 在不久的将来。看见#38653 Trigger a doing it wrong when checking a role name as a capability. 使用current_user_can() 检查用户角色已经错误很长时间了。参见2006年的帖子,How to check if a WordPress user is an “administrator”, WordPress首席开发者Mark Jaquith

您应该将功能用于该功能,而不是角色。

如果要检查用户的角色,则应执行以下操作。确实没有好的方法来检查用户的角色,因为他们可以有多个角色,而且用户的功能不能保证与他们所属的角色相同。

add_filter( \'upload_mimes\', \'wpse_263936_upload_mimes\' ); 
function wpse_263936_upload_mimes( $mimes ) { 
  if( ! in_array( \'administrator\', wp_get_current_user()->roles ) ) {
    $mimes = array( 
      \'jpg|jpeg|jpe\' => \'image/jpeg\', 
      \'png\' => \'image/png\', 
    );
  }
  return $mimes;
}
如果要继续使用current_user_can(), 您应该检查以下功能:promote_usersmanage_options 默认情况下,仅应用于管理员角色。

add_filter( \'upload_mimes\', \'wpse_263936_upload_mimes\' ); 
function wpse_263936_upload_mimes( $mimes ) { 
  if( ! current_user_can( \'promote_users\' ) ) {
    $mimes = array( 
      \'jpg|jpeg|jpe\' => \'image/jpeg\', 
      \'png\' => \'image/png\', 
    );
  }
  return $mimes;
}
或者你甚至可以定义ALLOW_UNFILTERED_UPLOADS 在您的wp-config.php 并添加unfiltered_upload 管理员角色的功能,并进行检查。

相关推荐

无法在模板函数.php中使用IS_HOME

我试图在标题中加载一个滑块,但只在主页上加载。如果有帮助的话,我正在使用Ultralight模板。我正在尝试(在template functions.php中)执行以下操作:<?php if ( is_page( \'home\' ) ) : ?> dynamic_sidebar( \'Homepage Widget\' ); <?php endif; ?> 但这行不通。现在,通过快速的google,我似乎需要将请