Home > blog > wordpressで非公開コミュニティサイトを作る(2)ユーザーレベルで表示内容を変更+plugin“Category Access”

wordpressで非公開コミュニティサイトを作る(2)ユーザーレベルで表示内容を変更+plugin“Category Access”

  • 2009-04-20 (月) 7:30
  • blog
  • | |
Google Adsense

wordpress!

認証は出来たので、今度はログインしたユーザーの権限をあらわすユーザーレベルで表示を変えたり、見る権限がない記事を表示しようとした場合は別のページへ飛ばす方法を探っていく。

wordpress界(?)ではWordBenchという立派なソーシャルコミュニティが出来たらしく話題になっているが、残念ながらあそこまで立派なものはちょっと難しそうだし、そもそもwordpressではなくwordpressMUを使っていたり、一人一人のblogまで必要じゃないんでとりあえずこのままwordpressをベースとして考えていく。

WordBench

通常ユーザーによって見せる見せないをwordpressで選択する場合、記事投稿時にパスをつけたり非公開設定をつけたりという事はデフォルトの機能として備わっている。
今回もそれを使えばこんな面倒な事をする必要はないのだが、下記理由によりその手が使いにくい。

  1. wordpressになれて無い(かつ面倒事が嫌いな)ユーザーも記事投稿を行うため、記事書くたびに非公開やパス設定させるのに無理がある
  2. 体験中の人でも見れる記事・ページのほうが更新頻度が少なく、公開範囲の狭いほうをデフォルトとしたい

といった諸般の事情から、基本的な流れとしては全部の記事を見る権限の無いユーザーがログインしたら、そのユーザーレベル専用のフロントページへ飛ばす、見る権限の無い記事へ飛んだらフロントページへ戻す、サイドバーなり検索結果等で見る権限のない記事は非表示もしくは本文が見れないような感じでいこうかなと画策。

二つの対処法

上記の条件を満たすために、pluginによる制限とphpであれこれやるという二つの方法で対応していこうと考える。
最初は全てphpをいじってやろうと思っていたし、後々の事を考えるとそのほうが安全なのだが、これが俺程度のスキルではちょっと難しく、数日ハマった後pluginで出来る事はやってもらおうという方針に変更。
偶然ちょうど目的に合ったpluginを見つけたというのも大きいが。

カテゴリー単位で閲覧制限をかけれるplugin “Category Access”

David Coppit's Code Page

で、そのpluginがCategory Access

試したwordpressのヴァージョン
2.7.1
試したヴァージョン
0.8.2
対応するwordpressの最新バージョン表記
2.3.X, and not prior versions
auther page
David Coppit’s Code Page

wordpressといえば、という事でこちらから情報ゲット。
Category Access – わーどぷれすっ!

分かりにくいのだが、Code Pageってところにこの開発者の作ったpluginとかがあれこれ置いてあるんで、下のほうにあるCategory Access 0.8.2ってリンクからDLする。
後はwordpressのpluginのインストール項目からDLしたzipを選択すればOK。

このpluginは公式Plugin Directoryにも登録されてないし、まして最終更新日が2007年と、まず動かねーだろうなぁと思っていたが、多少怪しい部分はあれどすんなり動いた。
今後wordpressの大幅なアップデートに際しても動き続けれるかは不安だが、2.3時代から2.5、2.7と乗り気って動いている事になるので、案外いけるんじゃないかなと思っている。(ソースを見ろと言う話)
最悪動かなくなってもこのpluginのソースを参考に自力で作り直すという荒業も残っている、実力不足で不安だが今の時点で動くお手本があるのは心強い。

なんていう話はともかくpluginについて。
このpluginはアクティブにするとwordpressの管理画面の設定に専用のオプションページ、さらに各ユーザーページの下部に幾つかの項目を追加する。

管理画面

Category Access

Category Access for:
New UsersAnonymous Usersの二種から選択。
Anonymous Usersはログインしていないユーザーを意味する、これの用法はシンプル。
今回俺が使うのはログインしたユーザーの権限で見れる範囲を指定なので、今回はNew Usersを選択。
実はNew Usersが何を表すかよくわからないのだが、恐らくはユーザーを新規登録した際、デフォルトで割り振られる権限の事なんだと思う。(詳細後述)
その下に幾つか出ているだろうチェックボックスは現在存在するカテゴリーにあたり、チェックを入れたカテゴリーは公開してもOK、という感じ。
Check all categoriesボタン・Uncheck all categoriesボタン
上に表示されるカテゴリーを全てチェックする・全てのチェックを外すボタン。カテゴリー数がやたら多い場合に使えるかもしれない。

Protected Posts in the Blog

blogの閲覧制限の設定
Protected Posts in the Blog

Hide entire post.
閲覧限定されたユーザーから、記事のタイトル・本文・コメント本文を隠す。ただし公開用カテゴリーアーカイブページでの“最新の投稿”等では非公開カテゴリー記事のタイトルが表示されてしまう。テーマの作り方次第でどうにかなるとは思う。
Show title, but a private message for the body text.
閲覧限定されたユーザーから、記事のタイトルのみを表示し、本文・コメント本文を隠す。本文の代わりに指定したメッセージ(private post message)を表示することも出来る。
Show a private message for the title and nothing for the body text.
閲覧限定されたユーザーから、記事のタイトル・本文・コメント本文を隠し、タイトルの代わりに指定したメッセージ(private post message)を表示する。表示出来ない記事を開くとタイトルの他に同じく指定メッセージが妙な位置に配置される。
The private post message:
上記選択肢で三項目目を選んだ際、タイトルの代わりに表示させるメッセージを入力する
Show a padlock icon on the private post message.
private post messageを表示する際、南京錠のアイコンを表示する
Consider a message to be visible if the user can view any of its categories (rather than all of its categories).
このチェックボックスをONにすると、1つの記事が複数のカテゴリーに属する場合、そのうち1つでも公開OKなカテゴリーが含まれていれば公開する。

Protected Posts in Feeds

フィードの閲覧制限の設定
Protected Posts in Feeds

Show the title and links (but not the summary or content) instead of hiding posts.
非公開の投稿を隠す代わりに、タイトルとリンクのみ表示させる。
これはcookieによるログイン判別をしているので、cookieを読み取らないfeed reader等を制限する事が難しいため、ならfeedのタイトルとリンクは隠さずに吐き出して、アクセスしてきたら閲覧制限がかかるよ、的な手なんだと思う。なので基本はチェックを入れておく。

The Category List

The Category List
閲覧許可をしていないカテゴリーを表示するかとか、表示出来ないカテゴリーに南京錠のアイコンを表示するか、といった選択肢なのだが、これは働いてなく、チェックを入れてアクセスするとエラーか何かが出て表示されなくなってしまう
ちなみに表示されるメッセージは以下の通り。

Unknown column 'wp_term_relationships.term_taxonomy_id.term_taxonomy_id' in 'where clause'

内容からいって、このpluginが作られた当時とDBの構成が変わっているため、わからんカラムが存在するよとか、そういう事なのかな。

下の2つのボタン

Update OptionsReset All Options

特筆する必要もない、設定更新とリセットボタン。
なんだけど、似たような位置に配置されているんで、クセで設定変更したあと一番したのボタン…を押すと見事にリセットがかかったりする。

ユーザーページ

user page options

Category Accessという項目が各ユーザーページの項目に表示される。ちなみに管理者のユーザーページには表示されない。

ここには現存するカテゴリーとcheck all、uncheck allのボタンがある。ここで個別ユーザーごとに公開範囲を指定する事が出来る。

実際の動作

New Usersでユーザーを新規登録すると、設定をいじってなければ通常権限は購読者になる。
この状態だと当然デフォの設定のまま、指定したカテゴリーの記事しか閲覧する事が出来ない。
当初New Usersとはこのデフォルトで割り振られる権限の事だと思っていた。
ところがこの新規登録したユーザーの権限を購読者の上の投稿者にしても、さらにその上の作成者にしても閲覧制限がかかったままなのだ。
その上の編集者にしてやっとAs a category manager, this user can view all categories.というメッセージがユーザーページのカテゴリー選択部分に表示され、全カテゴリーを閲覧できる状態になった。(勿論管理者権限になれば当然全部観れる)
そして編集者権限から下に再度変更すると、カテゴリーのチェックボックスが復活するのだが、このチェックが全て外れているのだ!
つまり常にではないものの、このpluginを使用した状態で権限をいじる場合には個別の手直しを前提で使う必要がある事になる。
権限を上下に頻繁に変更する事は俺の今回の想定利用環境ではありえないが、ちょっとこれは面倒な気がしてしまう。
カテゴリーが大量にあって、細かく分類している場合なんかは結構しんどそう。

なので、このpluginは複雑大量のカテゴリーをユーザーごとに細かく閲覧設定したい、みたいなヘビーなユーザー管理には向かない。
今回の俺の用途のように、低い権限だとこのカテゴリーしか見れないよ、程度なら耐えれる程度のものだろう。(古いしね)

自力で権限・ユーザーレベルで振り分け

さて上記pluginを利用すれば記事(post)の保護は出来る、けどページにはカテゴリーが無いためpluginではどうこう出来ない。
さらにトップページなりサイドバーなりで閲覧出来ないんだから本来見える必要もない項目も出てくる。(カテゴリー1つ分しか閲覧許可出さない場合、カテゴリーリストを表示する部分は不要、だとか)
アクセス時に最初に飛ばしたい、体験者用ページなんかも作るかもしれないし、既に説明したとおり、ちょっとpluginが不安定なんで今後の事も考えると、やっぱり自力で振り分けする方法も把握して、部分的にでも使っていく必要がありそう。

ユーザーレベルを取得する

これをするには当然、今ログインして見てる人の権限を取得しないといけない。

権限っていうとwordpressの管理画面で言う管理者とか編集者とかの事なんだけど、実は内部処理的には0~10の11段階のユーザーレベルってのが設定されていて、こっちを使って判別する。
ちなみに管理者はユーザーレベル10、閲覧者はユーザーレベル0、と内部で振られていて、数字が上がるほど権限が増える感じぽい。(ここで言う権限は使う事が出来るwordpressの機能、設定の数や種類の事)

で、見てる人のユーザー情報を取得するにはglobal $user_levelとするだけで取得できる。1

実際に振り分けてみる

仮に管理者をユーザーレベル10、一般メンバーを編集者とするとユーザーレベル7、で体験中のメンバーを閲覧者でユーザーレベル0と設定する。(デフォなんで設定する必要ないんだけど)
このケースで閲覧者とその他、で処理を分けたい場合こんな風にすればいいっぽい。

<?php
global $user_level;
if ( $user_level > 0 ) {

//正式メンバーの人用の処理

} else {

//体験中のメンバーの人用の処理

}
?>

あら簡単。
これで例えば体験中の人にはサイドバーのこの項目は表示させなくていいな、とかそういう事がテーマ内で出来るようになるね!

トップページを変えたい場合のやり方

トップページを体験用と一般用に分けたい場合のやり方もついでにメモっておく。
と言っても既にユーザーレベルで分岐できているんで終わったようなものなのだが。

header.phpの一番上に以下のコードを挿入すればいい。

global $user_level;
if ( is_home() && $user_level == 0 ) {
        wp_redirect( get_option('siteurl') . '飛ばし先のパス' );
}

頑張ってheader送信しようとあれこれやってたんだけど、んもう全然出来なくて半泣きであれこれ調べてたらwp_redirect()なんていう関数を発見したのだったりする。

Function Reference/wp redirect « WordPress Codex

Redirects the user to a specified absolute URI.とあるように、絶対URIで書く必要があるようだ。

という事で、前回のアクセス制限のコードとあわせてheaderの頭に以下のコードを突っ込む事になる。

<?php
if ( !is_user_logged_in() ) auth_redirect();
global $user_level;
if ( is_home() && $user_level == 0 ) wp_redirect( get_option('siteurl') . '飛ばし先のパス' );
echo '<?xml version="1.0" encoding="'. get_bloginfo('charset') . '" ?>';
?>

関数化されているとはいえリダイレクトには変わらないようなので、echoより先に。

後は飛び先となるページを作り、それ用のテンプレートを用意すればいい。

  1. 実はこれを知るまでずっとget_currentuserinfo()を利用していて、この記事をほぼ書き上げてから$user_levelの存在を知り、涙ながらに今書き直している。つーか説明みても分からないけどget_currentuserinfo()は一体なんだったんだ?? [戻る]

関連するかもしれない他の記事

Comments:2

Matchyo 09-11-14 (土) 23:10

とても参考になりました!
ありがとうございました!

daruman 09-11-15 (日) 0:10

案外需要があるようですね、お役に立ててなによりです!

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://weblog.atl-r.net/blog/tipstomake_communitysite2/trackback/
Listed below are links to weblogs that reference
wordpressで非公開コミュニティサイトを作る(2)ユーザーレベルで表示内容を変更+plugin“Category Access” from atl*weblog
pingback from niko » wordpress:会員制っぽく閲覧制限したい 09-07-31 (金) 10:07

[...] ■カテゴリごとに…その2 http://weblog.atl-r.net/blog/tipstomake_communitysite2/ こちらでもカテゴリごとに制限するプラグインを紹介してます。 Permalink|Comments RSS Feed – Post a comment|Trackback URL. [...]

Home > blog > wordpressで非公開コミュニティサイトを作る(2)ユーザーレベルで表示内容を変更+plugin“Category Access”

Calendar
« 2010 年 7月 »
M T W T F S S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Search
ABM | AnotherBookmark™
heteml
heteml
amadana
amadana(アマダナ)
feed
Meta

Return to page top