WordPressの管理画面で他のユーザーが投稿した記事を参照できないようにする方法

WordPressの管理画面で他のユーザーが投稿した記事を参照できないようにする方法

WordPressの管理画面で他のユーザーが投稿した記事を参照できないようにする方法

WordPressの管理画面では、他の人が投稿した記事も参照することができます。

「作成者」の列にユーザー名が表示されるので区別はできますが、複数人でブログを運営していると、自分が投稿した記事を探し当てるのも一苦労です。

そこで、管理者以外は自分の投稿以外を参照できないようにする方法を紹介したいと思います。

管理画面で他のユーザーの投稿を参照できないようにする方法

管理画面で他の人の投稿が出ないようにするには、functions.phpに以下のコードを追加します。

function exclude_other_posts( $wp_query ) {
  if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) {
    $post_type = get_post_type_object( $_REQUEST['post_type'] );
    $cap_type = $post_type->cap->edit_other_posts;
  } else {
    $cap_type = 'edit_others_posts';
  }
  
  if ( is_admin() && $wp_query->is_main_query() && !$wp_query->get( 'author' ) && !current_user_can( $cap_type ) ) {
    $user = wp_get_current_user();
    $wp_query->set( 'author', $user->ID );
  }
}
add_action( 'pre_get_posts', 'exclude_other_posts' );

これで、管理画面の投稿一覧にアクセスしても、他の人が投稿した記事は出てこなくなります。

なお、管理者権限のユーザーでは、すべての投稿が参照可能です。

投稿一覧の投稿数を全体ではなく各ユーザー毎の投稿数に変更する

上述したコードを追加すれば他ユーザーの投稿は表示されなくなりますが、投稿一覧画面に表示されている投稿数は全体の数のままなので、表示されている各ユーザーの投稿と数が合わなくなってしまいます。

投稿一覧の投稿数を各ユーザー毎の投稿数に合わせる方法が、WordPressカスタマイズ事典さんに掲載されていましたので、ご紹介いたします。

以下のコードをfunctions.phpに追記してあげることで、投稿一覧に表示される投稿数が各ユーザー毎の数に変更されます。

function count_author_posts( $counts, $type = 'post', $perm = '' ) {
  if ( !is_admin() || current_user_can('administrator') ) {
    return $counts;
  }

  global $wpdb;
  if ( ! post_type_exists( $type ) )
    return new stdClass;

  $cache_key = _count_posts_cache_key( $type, $perm ) . '_author';
  $counts = wp_cache_get( $cache_key, 'counts' );
  if ( false !== $counts ) {
    return $counts;
  }

  $query = "SELECT post_status, COUNT( * ) AS num_posts FROM {$wpdb->posts} WHERE post_type = %s";
  $query .= $wpdb->prepare( " AND ( post_author = %d )", get_current_user_id() );
  $query .= ' GROUP BY post_status';

  $results = (array) $wpdb->get_results( $wpdb->prepare( $query, $type ), ARRAY_A );
  $counts = array_fill_keys( get_post_stati(), 0 );
  foreach ( $results as $row ) {
    $counts[ $row['post_status'] ] = $row['num_posts'];
  }
  $counts = (object) $counts;
  wp_cache_set( $cache_key, $counts, 'counts' );
  return $counts;
}
add_filter( 'wp_count_posts', 'count_author_posts', 10, 3 );

コードの詳しい解説は、WordPressカスタマイズ事典さんの記事をご参照ください。

あとがき

管理者以外のユーザーでは他の人の投稿を非表示にしたい、という要望をいただくことは結構あります。なので、上記の方法を覚えておくと役立つ時があると思います。

複数人でブログを運営する際は、ぜひ参考にしてください。

この記事が気に入ったら
いいね!してね♪

Twitter で

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です