WordPress

自分が投稿したものだけ管理画面で表示する

More than 5 years have passed since last update.

管理者以外のユーザにいろいろ投稿させるサイトを作るときにきっとやりたくなるので、ちょっと調べてみた。

権限でedit_other_XXXをつけなければ、自分が作ったもの以外は編集できないのだけど、リスト上ではほかのユーザの投稿が見れるし、リスト上部の「すべて」とかの横に表示される投稿件数も自分以外の投稿を含めた結果になってしまう。これは、wordpressの事情を知らない普通のユーザからすれば違和感のある画面である。

以下の二つのfilterとactionでそれを回避できる。

まずは、投稿リストの「すべて」とかのリンクを出さないようにする。

管理画面のリスト上部のリンクは、

$views = apply_filters( 'views_' . $this->screen->id, $views );

された結果が表示される。この$viewsには、"mine"や"all"といったリスト表示内容を表すキーに対して、一覧へのリンク文字列が格納されている。

なので、viewsから"mine"以外のリンクを取り除いた配列を返すフィルターを設定する。こうすると、"所有"というリンクしか表示されなくなる。

既に自分が投稿しているものがあるときは、これだけで投稿リスト上には自分の投稿しか出なくなる(つまり所有リンクがクリックされた状態になっている。

しかし、自分の投稿が一件もないときは、他人の投稿のリストが表示されてしまうので、まだ目的は達成できていない。

そこで、実際に自分の投稿のみに限定するために、'pre_get_posts"アクションに以下のアクションを設定する。

function filter_other_post( $wp_query ) {
    global $pagenow, $current_user;

    if($pagenow != 'admin-ajax.php' && $pagenow != "edit.php" ) {
        return;
    }

    if($current_user->roles[0] == "administrator") {
        //管理者はすべて閲覧可能
        return;
    }

    $wp_query->query_vars['author'] = $current_user->ID;
}

管理画面からのajaxでの取得(写真を記事に挿入するときの画像一覧とか)と、投稿画面の時のみフィルターするようにしている。そうしないと、トップページやアーカイブページでもフィルターが効いてしまい、投稿がない状態として処理されてしまう。

これで、とりあえず管理画面を普通に触っている分には、他人の投稿は存在しないかのような画面を見せることができる。