[WordPress]寄稿者ユーザーに他者の投稿を表示させない方法
2015.04 09

寄稿者ユーザーに他者の投稿を表示させない方法について備忘録としてまとめました。フィルターフックとアクションフックを併用して、管理画面の投稿一覧に関する表示制御を行っています。

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

フィルターフック

プラグイン 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パラメータで投稿を絞り込むことができます。

参考

この記事へのコメント

[WordPress]サブカテゴリと単一記事のパーマリンクを混在させる設定
2010.09 27

パーマリンクの設定でポピュラーな設定は/%category%/%postname%/ですが、この場合、サブカテゴリが存在すると投稿スラッグがサブカテゴリを表すのか、投稿名を表すのか区別がつかないので、とあるカテゴリの単一 […]

パーマリンクの設定でポピュラーな設定は/%category%/%postname%/ですが、この場合、サブカテゴリが存在すると投稿スラッグがサブカテゴリを表すのか、投稿名を表すのか区別がつかないので、とあるカテゴリの単一記事を表示しようとすると、404となってしまいます。

かといって、/%category%/だけを指定すると、アーカイブページでタイトルにパーマリンクを反映させると、単一記事の表示ができなくなります。そこで、以下の方法としました。

/%category%/%post_id%/

記事の運用方法にもよりますが、投稿スラッグを使用しない運用であれば上記の設定でサブカテゴリと単一記事のパーマリンクが混在させられます。もっと良い方法があれば、どなたかご教授いただきたく・・・。短縮URL使えば、見てる側は気にならないことですが、WordPressのテーマカスタマイズをしてる側は重要な問題となります。

この記事へのコメント

[WordPress]抜粋(excerpt)を使わずにエントリの途中まで表示する
2010.09 10

通常のsubstr()を使用するとバイト指定になるため、マルチバイト対応のmb_substr()を使うことになります。 [sourcecode language=”php”] <p>& […]

通常のsubstr()を使用するとバイト指定になるため、マルチバイト対応のmb_substr()を使うことになります。
[sourcecode language=”php”]
<p><a href="<?php the_permalink(); ?>"><?php echo mb_substr(get_the_content(), 0, 56); ?>…more</a></p>
[/sourcecode]
上記サンプルの場合は、先頭から56文字を抽出して表示し、その文章にリンクさせています。指定した文字数より短い文章の場合は、文章の最後まで表示されることになります。文字数をカウントする場合は、マルチバイト対応のmb_strlen()を使用することになります。

この記事へのコメント

[WordPress]ページスラッグを取得する
2010.09 02

投稿、ページ作成時にURIを指定して、それを利用してCSS切り替えやclass指定、画像表示の制御をしたい時に使うのでメモ。 1: <?php if(have_posts()): while(have_posts( […]

投稿、ページ作成時にURIを指定して、それを利用してCSS切り替えやclass指定、画像表示の制御をしたい時に使うのでメモ。

   1:  <?php if(have_posts()): while(have_posts()): the_post(); ?>
   2:  <?php $slug = get_page_uri(get_the_ID()); ?>
   3:  ...
   4:  <?php endwhile; endif; ?>

固定ページのスラッグを取得したい場合は、以下の方法でも可能。

   1:  <?php $page = get_page(get_the_ID()); ?>
   2:  <?php $slug = $page->post_name;?>

階層ページの場合、1つ目の方法だと「親のページ名/このページ名」みたく取得されるので、配列化して任意の要素だけを取り出すという方法も考えられるが、今表示しているページのスラッグを取得したい場合は、2つ目の方法で十分だと思われる。

この記事へのコメント

WordPressで認証ページを作成する
2010.08 24

特定のページのみ(この場合は固定ページ)に認証を設ける方法についてです。 ここでの例はページテンプレートを作成し、このページテンプレートしたページへアクセスした場合、ログイン済みならそのまま表示、未ログインであればWor […]

特定のページのみ(この場合は固定ページ)に認証を設ける方法についてです。 ここでの例はページテンプレートを作成し、このページテンプレートしたページへアクセスした場合、ログイン済みならそのまま表示、未ログインであればWordPressのログインページへリダイレクトします。なお、ログイン後はアクセスしたページへリダイレクトされます。

   1:  <?php
   2:  /**
   3:   * Template Name: 認証つきページ
   4:   */
   5:  if(!is_user_logged_in()) auth_redirect();
   6:  get_header();
   7:  
   8:  ?>

ポイントをあげるとすれば、wp_header()の前に認証処理を記述することです。

この記事へのコメント

PDO For WordPressインストールでハマる
2009.03 23

レンタルサーバにWordPressをインストールというのはよくある話だけど、 SQLiteで動かそうとしたら、予想外に大ハマり・・・ というわけで、作業メモ。 環境: PHP 5.1.6 WordPress 5.7.1 […]

レンタルサーバにWordPressをインストールというのはよくある話だけど、
SQLiteで動かそうとしたら、予想外に大ハマり・・・

というわけで、作業メモ。

環境:
PHP 5.1.6
WordPress 5.7.1
PDO For WordPress 1.0.2

こちらを参考にさせてもらいつつ作業するも、なぜか画面が真っ白。
結局、PDO For WordPressのソースをさらに追ってみる。

こんな長時間のprintデバッグとか久し振り。
で、原因はここ。

line 206 on wp-content/pdo/driver_sqlite/pdo_sqlite_driver_create.php

//need this line to comment out.
//$this->_errors[] = preg_last_error();

preg_last_error() >= PHP 5.2.0
というわけで、5.1で未対応のメソッドを呼び出していたためにDBの初期化で停止していた模様。
ものすごい時間かけたわりに作業が1行いじっただけとかよくある話ですけどね。

この記事へのコメント

作者について

青森県内でソフトウェア・システム開発を行うフリーランスのプログラマー。元々は集中監視システム開発に従事。現在はウェブサイト製作・オンラインシステムの開発案件を中心に、プログラミングのスキルトレーニングや講演も行う。

TEL 0172-55-7030  FAX 0172-55-7031
10:00 - 18:00 土日祝休

恐れ入りますが、お急ぎの場合を除いて、メールにてお問い合わせください。