表示の制限をかけたい

WordPressの投稿者権限のユーザーは投稿記事やメディアの新規追加や編集ができるのですが、一覧表示で見たときに他のユーザーの記事やメディアが見えてしまいます。編集や削除はできないのですが、見せたくないというカスタマイズ要望が来たのでメモ。

投稿者権限のユーザーに自分の投稿だけが表示されるようにする

投稿の一覧に自分の投稿だけを表示するには以下のコードをfunctions.phpに記述します。

function show_author_post( $query ) {
  global $current_user;

  if ( is_admin() ) {
    if ( current_user_can( 'author' ) ) {
      $query->set( 'author', $current_user->ID );
    }
  }
}
add_action( 'pre_get_posts', 'show_author_post' );
  1. 1行目:pre_get_postsフックポイントのコールバック関数の引数で、$queryを受け取る。
  2. 2行目:現在のユーザー情報のグローバル変数を呼び出し。
  3. 4行目:管理画面のみ制御します。これがないと公開サイト側も自分の投稿しか表示されなくなってしまいます。
  4. 5行目:ここで投稿者権限だったらの条件文
  5. 6行目:$queryオブジェクトに所有者(author)が自分自身($current_user->ID)のIDのもののみ取得するようにセットして出来上がり!

投稿者権限のユーザーに自分のアップロードしたメディアだけが表示されるようにする

実は、投稿の制御をかけた段階でメディアも制御できています。メディアもデータ的には投稿と同じなので納得。逆に投稿だけ非表示でメディアはOKにするのであれば、ページで分岐してあげれば大丈夫。以下は、投稿ページの時にだけ制限をかける方法です。

function show_author_post( $query ) {
  global $current_user;
  global $pagenow;

  if ( is_admin() &&  $pagenow === 'post.php' ) {
    if ( current_user_can( 'author' ) ) {
      $query->set( 'author', $current_user->ID );
    }
  }
}
add_action( 'pre_get_posts', 'show_author_post' );

できた!\(^o^)/
WordPressはこういう制御が隅々までできるのが好き。

参考サイト

Developer Resources: wp_count_posts()
https://developer.wordpress.org/reference/hooks/pre_get_posts/