hirakawatomohideのブログ

hirakawatomohideのブログ

ブログの説明を入力します。

Amebaでブログを始めよう!

投稿者が不特定多数いる場合、アップロードした画像を投稿者自身にしか表示させたくないことがあるかと思います。

 

今回それを行いたいのは
contributor(寄稿者)とauthor(投稿者)だったので

function my_media_author_query( $wp_query ) {
if (! preg_match('/wp-admin\/(?:upload|media-upload|admin-ajax).php/', $_SERVER['REQUEST_URI']) ) {
  return;
}

  global $current_user;
  $user_roles = $current_user->roles;
  $user_role = array_shift($user_roles);
  if($user_role==='contributor'||$user_role==='author'){
      $wp_query->set( 'author', $current_user->id );
  }
}
add_filter('pre_get_posts', 'my_media_author_query' );

当初海外のQ&Aサイトに投稿されていたのは上記のようなコードでした。

とりあえずうまく行ったように見えるのは落とし穴。

その後クライアントからAdvancedCustomField(ACF)で作ったハズのユーザープロフィールが変更されない、とのご指摘をうけました。

色々問題を切り分けていくと、どうもこのコードが原因のよう。
そもそもadmin-ajax.phpをACFはつかっているようで、そのフィールドの抽出作業の過程で上記のコードでは作成者でフィルタリングされてしまう為に表示されなくなる模様。
 

結果色々工夫した挙句、

if($wp_query->query_vars['post_type']!=='attachment'){
  return;
}

を加えて

function my_media_author_query( $wp_query ) {
// Only applicable for Media Library && Media Upload Dialog
if($wp_query->query_vars['post_type']!=='attachment'){
  return;
}
if (! preg_match('/wp-admin\/(?:upload|media-upload|admin-ajax).php/', $_SERVER['REQUEST_URI']) ) {
  return;
}

  global $current_user;
  $user_roles = $current_user->roles;
  $user_role = array_shift($user_roles);
  if($user_role==='contributor'||$user_role==='author'){
      $wp_query->set( 'author', $current_user->id );
  }
}
add_filter('pre_get_posts', 'my_media_author_query' );

 

でメディア画像の抽出時の動作の時のみフィルタリングさせる事に成功しました。


そもそもコードが不完全だったようです。。

あまり鵜呑みにしたらダメですね。