寄稿者の権限で投稿を受け付ける場合、その人以外の投稿を見せないようにするためには、フィルターフックとアクションフックの両方を利用する必要があります。

フィルターフック

プラグイン API/フィルターフック一覧 – WordPress Codex 日本語版

WordPress上で投稿データを表示するときなど、何か表示するタイミングで独自のプログラムを実行させることができます。

アクションフック

プラグイン API/アクションフック一覧 – WordPress Codex 日本語版

WordPress上で投稿ボタンを押したときなど、何か動作が発生したタイミングで独自のプログラムを実行させることができます。

要件

  1. 投稿一覧で「すべて」「公開済み」などの投稿状態フィルタを非表示にする
  2. 寄稿者が自分の投稿数0件の状態でも、投稿一覧で他者の投稿が見えないようにする

上記を満たすために、フィルターフックとアクションフックをテーマ内のfunctions.phpに記述していきます。

実装

投稿一覧で「すべて」「公開済み」などの投稿状態フィルタを非表示にする

投稿状態フィルタ

投稿状態フィルタの変更後

function show_owned_posts_only( $views ) {
    unset($views['all']); // すべて
    unset($views['draft']); // 下書き
    unset($views['publish']); // 公開済み
    unset($views['pending']); // 保留中
    unset($views['trash']); // ゴミ箱

    return $views;
}
// views_edit-[post_type] カスタム投稿タイプの場合は、投稿タイプを指定する
add_filter('views_edit-xxxxx', 'show_owned_posts_only');

投稿状態フィルタそれぞれの内容はコールバック引数で受け取る、$viewsに入っています。unset()で要素を削除することで制御できます。

今回はすべての要素を非表示にすることで、「所有」という自分の投稿数のみ表示されるようになります。

注意点としては、CODEXにある「views_edit-post」は「投稿(投稿タイプ=post)一覧」のフィルターフックだという点です。カスタム投稿タイプを利用する場合は、「views_edit-hoge」のように投稿タイプ名に置き換える必要があります。

寄稿者が自分の投稿数0件の状態でも、投稿一覧で他者の投稿が見えないようにする

function hide_other_posts($wp_query) {
    global $current_screen, $current_user;

    if($current_screen->id != "edit-xxxxx") {
        return;
    }

    if(!$current_user->roles[0] == "contributor") {
        return false;
    }

    $wp_query->query_vars['author'] = $current_user->ID;
}
add_action('pre_get_posts', 'hide_other_posts');

フィルターフックで投稿状態フィルタを非表示したとしても、寄稿者の投稿数が0件の状態で投稿一覧にアクセスすると、他者の投稿が見えてしまいます。

pre_get_postsアクションフックを使い、ある特定の画面(この場合はカスタム投稿タイプの投稿一覧)で、ログインしているユーザー(この場合は寄稿者)の投稿のみ取得しています。

$current_screenと$current_userで現在表示している画面とログインしているユーザーを特定しています。

ユーザーを特定できれば、$wp_queryからauthorパラメータで投稿を絞り込むことができます。

参考