WordPressで他人が書いた記事は見られないようにする

WordPressで構築したサイトで複数のユーザーが記事を投稿している場合に「他者の記事を記事一覧に表示させない(させたくない)」という場合があると思います。

記事をパクられたくないとかそういうことではなくて、誤って編集してしまったり、最悪削除してしまったり…という状況を想定してのことです。

そんなときはテーマの functions.php にこのコード入れればいいんじゃないかね、というコードを紹介します。

他者の記事が出てこないようにするコード

これは結構いろいろなブログに載っているコードです。

使用テーマの functions.php(またはそれに準ずるファイル)に追記してください。

// 表示する記事をログイン中のユーザーのものだけにする
function pre_get_author_posts( $query ) {
    if ( is_admin() && !current_user_can('administrator') && $query->is_main_query()
            && ( !isset($_GET['author']) || $_GET['author'] == get_current_user_id() )
          ) {
          // 投稿したユーザーのものだけに絞る
        $query->set( 'author', array( get_current_user_id() ) );
        unset($_GET['author']);
    }
}
add_action( 'pre_get_posts', 'pre_get_author_posts' );

こちらの記事を参考にしました。

件数とかも本来ならいろいろ変えるところありますよね。

ここで紹介したコードはあくまでも他者の記事が表示されなくなるだけです。

他者の記事を非表示: カスタム投稿タイプの場合

じゃあ、これをカスタム投稿タイプに限ってやりたい…っていう場合はどうすればよいか。

前述のコードを改造して作ってみました。

// 表示する任意のカスタム投稿タイプをログイン中のユーザーのものだけにする
function pre_get_author_custom_posts( $query ) {
    if ( is_admin() && !current_user_can('administrator') && $query->is_main_query()

            && ( !isset($_GET['author']) || $_GET['author'] == get_current_user_id() )

            && $query->query['post_type'] === 'custom_post' // 任意のカスタム投稿タイプ名

          ) 
          // 投稿したユーザーが管理者かどうかはわからないため管理者IDは許容する
        $query->set( 'author', array( get_current_user_id() ) );
        unset($_GET['author']);
    }
}
add_action( 'pre_get_posts', 'pre_get_author_custom_posts' );

他者の記事は見せたくないけど管理者(または特定ユーザー)の記事は一緒に見たい場合

さらに… 管理者(または特定のユーザー)が投稿したものは逆に全員に見せたいという場合は下記のような感じでできますね。

※例えば、賢威8の共通コンテンツとか 管理者が投稿したものは使いたいけど、その他はユーザーごとに管理したいという場合が想定できたりします。

// 共通コンテンツをログイン中のユーザーの投稿のみに制限する(管理者のものは見たい)
function pre_get_author_keni_cc( $query ) {
    if ( is_admin() && !current_user_can('administrator') && $query->is_main_query()

            && ( !isset($_GET['author']) || $_GET['author'] == get_current_user_id() )

            && $query->query['post_type'] === 'keni_cc' // 任意のカスタム投稿タイプ名

          ) 
          // 投稿したユーザーが管理者かどうかはわからないため管理者IDは許容する
        $query->set( 'author', array( get_current_user_id(), '〜管理者ユーザーID〜' ) );
        unset($_GET['author']);
    }
}
add_action( 'pre_get_posts', 'pre_get_author_keni_cc' );

コード中の ‘〜管理者ユーザーID〜’ は特定のユーザーIDに書き換えてください。

同じ要領で複数のユーザーのものを見せたい場合は下記の通りです。

$query->set( ‘author’, array( get_current_user_id(), ‘〜管理者ユーザーID〜’ ) );

この部分を

$query->set( ‘author’, array( get_current_user_id(), ‘〜管理者ユーザーID〜’, ‘〜特定のユーザーID〜’, ‘〜誰か〜’ … ) );

というように ‘author’ の値になる array に要素を増やせばいいです。

まとめ

クライアントワークで使うとしたら、最初のコードの際に紹介したリンクを追って件数とかいろいろ配慮をしたほうがよりよいと思います。

いろいろな応用が効きそうなのでお試しください。

この記事が気に入ったら
いいね ! しよう

Twitter で