web-dev-qa-db-ja.com

Wordpressのファイルタイプをユーザタイプ別に制限する

私はすべてのユーザーに許可されたJPGやPNGなどの画像のみをアップロードできるようにすべてのユーザー(管理者以外)を制限することを検討しています。 JPGとPNG以外のもの!)

私は次のfunctions.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
Ctyldsley

条件に構文エラーがあります。

current_user_can(‘administrator’)

入力値は‘ ’でラップされていますが、代わりに' 'でラップする必要があります。今のところ、‘administrator’は役割でも機能でもないので、上記は常に偽の値を返します。

if(!current_user_can(‘administrator’))

これは常にtrueを返します。これは管理者を含む全員のMIMEタイプを制限します。正しい形式は次のとおりです。

if( !current_user_can('administrator') ) { 
    //CODE HERE
}
1
Jack Johansson

コードが機能しなかったのは、コードに誤植があるためです。そのコードは実際にエラーを引き起こしています。エラーを確認するには、 debug mode を有効にします。

しかし、それはあなたのコードで本当に悪いことではありません。本当に悪いのは、あなたが ユーザ能力 をチェックする関数を使っていて、ユーザの役割をチェックしようとしているということです。これはWordPressが役割と機能を処理する方法のために機能しますが、それはユーザーの役割をチェックする正しい方法ではありません。

実際、current_user_can()でユーザーロールを使用すると、近い将来に_doing_it_wrong()がトリガーされる可能性があります。 #38653ロール名をケーパビリティ としてチェックするときに間違ったことを引き起こすことをトリガします。 current_user_can()を使ってユーザーロールをチェックすることは長い間間違っていました。 2006年のこの記事、 を参照してください。WordPressユーザーが“管理者”であるかどうかをチェックする方法 、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_UPLOADSwp-config.php定数を定義し、unfiltered_upload機能を管理者ロールに追加してそれを確認することもできます。

1
Nathan Johnson