<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>atl*weblog &#187; blog</title>
	<atom:link href="http://weblog.atl-r.net/category/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://weblog.atl-r.net</link>
	<description>だるまんの覚書や感想文、日々の事を書いてます！！！！</description>
	<lastBuildDate>Thu, 18 Feb 2010 16:07:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iPhoneのまとめ記事がほってんとりった</title>
		<link>http://weblog.atl-r.net/blog/hotentry/</link>
		<comments>http://weblog.atl-r.net/blog/hotentry/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 15:10:38 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[hatena]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2586</guid>
		<description><![CDATA[				
				先日アップしたiPhoneを購入した際のまとめ記事、iPhoneを購入してやった事まとめ &#8211; atl*weblogがおそらく短期間ながらHatenaのホットエントリーになっていたようなので、 [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/07/p2586_01.png" alt="hotentry" title="hotentry" width="400" height="200" class="alignnone size-full wp-image-2591" /></p>
				<p>先日アップしたiPhoneを購入した際のまとめ記事、<img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://weblog.atl-r.net/text/iphone/" /><a href="http://weblog.atl-r.net/text/iphone/" title="iPhoneを購入してやった事まとめ - atl*weblog" class="topic">iPhoneを購入してやった事まとめ &#8211; atl*weblog</a>がおそらく短期間ながらHatenaのホットエントリーになっていたようなので、どんな感じだったか結果報告。</p>
				<p><span id="more-2586"></span></p>
				<h2>異常なアクセスに気付く</h2>
				<p>iPhoneの記事をあげて約5日後、やっと記事も書き出したし久々にAnalyticsでも見てみるか…と、Google Analyticsを開いた時に気付いた。<br />
				変化率が35%もプラスだなー、ずいぶん何も書いてなかったし記事上がってみてくれる人でも少しは戻ったかね、程度に思いつつマイリポートを開いたら</p>
				<p><img src="http://weblog.atl-r.net/wp-content/uploads/2009/07/p2586_02.png" alt="セッション数" title="セッション数" width="610" height="170" class="alignnone size-full wp-image-2590" /></p>
				<p>なんだこの極端な推移は…？ひょっとしてwordpressのアップデートか何かの際に挿入コードとかがおかしくなってデータ取れてなかったかなぁ、と思いマウスオーバーすると</p>
				<p><img src="http://weblog.atl-r.net/wp-content/uploads/2009/07/p2586_03.png" alt="ピーク時" title="ピーク時" width="174" height="74" class="alignnone size-full wp-image-2589" /></p>
				<p>セッション625って、普段の10倍じゃねーかｗ<br />
				とりあえず参照元を見るとb.hatena.ne.jpの/hotentry/it、ITカテゴリーのホッテントリだったようだ。<br />
				ブクマ数を見るとこの時点で30、このblogにしては驚異的な数だけど、普段見てるほっとてんとりからすると微々たるもの。<br />
				ITカテゴリーだからこの数でもいけたのかなーとか考えたり。</p>
				<h2>これまでとの変化</h2>
				<p>このblogの通常時のアクセスはこんな感じだった。</p>
				<dl>
				<dt>セッション</dt>
				<dd>40～80程度、土日に30～40に落ち込み</dd>
				<dt>ページビュー</dt>
				<dd>100前後、土日に50前後に落ち込み</dd>
				</dl>
				<p>これがピーク前後はこんな感じに。</p>
				<dl>
				<dt>ピーク前日</dt>
				<dd>セッション数：214</dd>
				<dd>ページビュー：269</dd>
				<dt>ピーク</dt>
				<dd>セッション数：625</dd>
				<dd>ページビュー：756</dd>
				<dt>ピーク後日</dt>
				<dd>セッション数：124</dd>
				<dd>ページビュー：164</dd>
				</dl>
				<p>このblogは土日にアクセスの落ち込む典型的な平日型アクセスだったが、その差異がグラフにおいて平坦で判別不可能になるほどピーク時が飛びぬけていた。</p>
				<h2>で、どうなった？</h2>
				<p class="img_R"><a href="http://tophatenar.com/view/http://weblog.atl-r.net/"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/07/p2586_04.png" alt="TopHatenar" title="TopHatenar" width="400" height="300" class="alignnone size-full wp-image-2596" /></a></p>
				<p>この記事を書いている段階までも緩やかにはてブ数は増加し、34になっている。<br />
				今後はiPhoneではてブ検索したりする人に見つけてもらって、場合によってははてブされ、そして通常通りに戻るだろう。</p>
				<p>見てもらえるのはありがたいが、正直いってあの記事はまさに備忘録で、特にメールのくだりなんか考えながら書いてて結局まとまってない、結構ひどいものだったので、こんな事ならもうちょっと気合入れて書けばよかったと思ったりもした。<br />
				したんだけど、未だによくわからないんで書き直しようもないのが困りもの。<br />
				まぁ文章の出来はともかく、ボリュームがそれなりにあるので読むのがだるい反面ハッタリは効いてそう、有用なリンク先も掲載させてもらったんで、簡易なリンク集的な意味でまとめタグがつくのかも。</p>
				<p>しかしiPhoneの記事であそこまでアクセスが集まるとは思わなかった…。</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/hotentry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hetemlでwordpressのプラグイン“Shadowbox JS”を使う場合の留意点</title>
		<link>http://weblog.atl-r.net/blog/shadowbox_js3-0/</link>
		<comments>http://weblog.atl-r.net/blog/shadowbox_js3-0/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 19:20:42 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2494</guid>
		<description><![CDATA[				
				つい最近Shadowbox JSが3.0にアップデートされて、それに伴ってphp4.xのサポートが打ち切られた。
				hetemlだけじゃないかもしれないけれど、デフォルトでphp4.xを利用してる [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img alt="Shadowbox JS | Sivel.net" src="http://capture.heartrails.com/400x400/border/shorten?http://sivel.net/wordpress/shadowbox-js/" /></p>
				<p>つい最近<strong>Shadowbox JS</strong>が3.0にアップデートされて、それに伴ってphp4.xのサポートが打ち切られた。<br />
				hetemlだけじゃないかもしれないけれど、デフォルトでphp4.xを利用してるサーバーではこのpluginは使えなくなった。<br />
				幸いhetemlは一応php5.xも使えるようにする方法があるのでセフセフだったが、一応何かの役に立つかもしれないんでここに顛末を書きとめておく。</p>
				<p><span id="more-2494"></span></p>
				<h2>問題発覚から解決までの経緯</h2>
				<p>久々に記事を書いてupしたら、あれshadowbox動いてないじゃん。</p>
				<p>ちょうど前後してwordpress2.8にアップデートしたので（しかもバグのある自動アップデート）、そのせいかと疑ってみる。</p>
				<p>あれ、そもそも管理画面の設定メニューにShadowbox JSの項目すらないぞ。</p>
				<p>pluginサイトのコメントを追っていくと、作者のこんな話が。<br />
				<cite><img src="http://favicon.hatena.ne.jp/?url=http://sivel.net/wordpress/shadowbox-js/" width="16" height="16" alt="" /><a href="http://sivel.net/wordpress/shadowbox-js/">Shadowbox JS | Sivel.net</a></cite></p>
				<blockquote cite="http://sivel.net/wordpress/shadowbox-js/"><p>Matt says: <br />
				10 Jun 2009 at 12:14:43 EDT </p>
				<p>@Jonathan: And like I told the other user, you are likely using PHP 4. PHP 4 support was dropped in this release in favor of better functionality. Please consider upgrading to PHP 5.</p></blockquote>
				<p>んだよ、readmeにもこのpluginのページのどこにも説明ねーじゃねーか！</p>
				<p>この際だし、このドメイン内は全部php5.ｘが動くように、.htaccessを置いて切り替える方法をとろうと思いたつ。<br />
				<img src="http://favicon.hatena.ne.jp/?url=http://heteml.jp/support/manual/php5/" width="16" height="16" alt="" /><a href="http://heteml.jp/support/manual/php5/" title="レンタルサーバー「heteml」 - PHP5のご利用方法について">レンタルサーバー「heteml」 &#8211; PHP5のご利用方法について</a></p>
				<p>おし、管理画面に<em>Shadowbox JS</em>の項目出たわ、どれどれ…</p>
				<p>なんだ言語にja増えてる、ラッキー…あれ？エラーでまくってるんだけど何これ。</p>
				<p>チェックボックスをcheckedにするかどうかの部分でエラーが出て、データタイプがちげーぞ！配列じゃねーぞ！ってエラー吐いてる</p>
				<p>データベースに保存されてるデータ形式が変わったんだろうか、けどどうすんだこれ</p>
				<p><em>Shadowbox JS</em>pluginを一度停止し再起動</p>
				<p>うごいたー＾＾</p>
				<h2>汎用Liblary無しで使用しても、コンフリクトしなくなった</h2>
				<p><cite><img src="http://favicon.hatena.ne.jp/?url=http://weblog.atl-r.net/blog/shadowbox_js/" width="16" height="16" alt="" /><a href="http://weblog.atl-r.net/blog/shadowbox_js/">Shadowbox JS　LightBox系のjsライブラリ・Shadowboxをwordpressに簡単実装するplugin &#8211; atl*weblog</a></cite></p>
				<blockquote cite="http://weblog.atl-r.net/blog/shadowbox_js/"><p>javascriptを読み込む際にonloadの記述がチョロくて、場合によっては他のjavascriptやliblary、javascriptを利用するpluginとコンフリクトする可能性がある</p></blockquote>
				<p>と以前の記事で書いたが、今回のバージョンアップでその問題が解決している。<br />
				なのでわざわざ使ってもいない汎用Liblaryを導入してページのロードを泣く泣く遅くしている人は、もうその心配は要らない…はず。</p>
				<h2>まとめ</h2>
				<ul>
				<li><em>Shadowbox JS</em>はphp5.x以上じゃないと動かなくなった</li>
				<li>hetemlでは.htaccessを置けばおｋ、.htaccess自体は公式で公開してる、置いたディレクトリ以下の階層にも全部適用</li>
				<li>wordpressとかはphp4でも5でも動くようになってるんで切り替えても問題ない</li>
				<li>けどpluginのほうはよくわからない、とはいえphp4.xでしか動かないpluginとか恐らくない</li>
				<li>.htaccessを置く前に<em>Shadowbox JS</em>を一旦停止、同様のケースのために一時的にplugin全部止めてもいいかも</li>
				</ul>
				<p>ニッチすぎるtips。</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/shadowbox_js3-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一ヶ月近くblogを書かないとアクセスはどうなるか</title>
		<link>http://weblog.atl-r.net/blog/access_transition/</link>
		<comments>http://weblog.atl-r.net/blog/access_transition/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 17:37:42 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[daily]]></category>
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2481</guid>
		<description><![CDATA[				
				feedを合体させるのに失敗し、ガラスのハートを持つ俺は完全にモチベーションを失った。
				その間レゲーに逃げるものの、それを悟らせまいとまるで実験的に更新しなかったかのように見せる試みに出るのだっ [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/06/p2481_01.png" alt="キーワード" title="キーワード" width="298" height="318" class="alignnone size-full wp-image-2484" /></p>
				<p>feedを合体させるのに失敗し、ガラスのハートを持つ俺は完全にモチベーションを失った。<br />
				その間レゲーに逃げるものの、それを悟らせまいとまるで実験的に更新しなかったかのように見せる試みに出るのだった…。</p>
				<p><span id="more-2481"></span></p>
				<h2>2009/05/22～2009/6/16のアクセス</h2>
				<p>という訳で、アクセスがどーなったかなという話。<br />
				下図は最後に更新した日からのセッション数の遷移。<br />
				<a href="http://weblog.atl-r.net/wp-content/uploads/2009/06/p2481_02.png" rel="shadowbox[post-2481];player=img;"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/06/p2481_02.png" alt="access0522-0616" title="access0522-0616" width="840" height="147" class="alignnone size-full wp-image-2485" /></a></p>
				<p>定期的に二日連続で落ちこむ規則性が見えるが、これは土日viewが下がるこのblog特有の状態。みんな仕事場から見てるんだろうか、とても仕事に使えるレベルの話をして無い気もするが…。<br />
				まぁ概ね横ばい。<br />
				このblogは特に何かに特化させる気はないが、俺がその時々に手がけている内容が連続するので、その話題の切り替わりで新規アクセスが増える以外、これまで常に横ばいだった。<br />
				たまたま初期はblogを作る事自体がテーマだったため、それに付随してGoogle Analyticsの話題が多く、まずはそれに興味関心のある人がご来場、あとAmazonか。</p>
				<h2>個人サイト・個人blog立ち上げの時留意すべき事</h2>
				<p>このblogをやりはじめて約半年たったんで、上記の事も踏まえて現時点で思ってる、立ち上げ時の準備内容を書いておいてみる。</p>
				<ol>
				<li>記事を何本か書き溜めておく</li>
				<li>鉄板ネタを何本か準備しておく　オススメは利用中のfirefoxのアドオン、けど5個も使ってないよとかって場合どうなんだろ</li>
				<li>トラックバックを使う</li>
				<li>blogを作る時すべき○○の事柄　みたいな記事が山ほどあるんでそこにのってるSEO関連を全部やる</li>
				</ol>
				<p>最初の書き溜める記事や初期の内容は、blogを作る時すべき○○の事柄みたいなのに載ってる事を実際全部やってみてそれについて記事を書けばいい。<br />
				技術的な話を書くblogじゃなくても、そういうのに詳しくない人がどこでつまづくのかは一部層に需要がある。（初心者の行動に感心のある技術者や、同じ初心者など）</p>
				<p>そこまであざとくアクセス稼ぎたくねーよ、という話もあるんだけど、ある程度人が見てないと公開する意味もない。<br />
				かといってただ書いてるだけだと誰の目にも留まらない。</p>
				<p>で、どうも自分でblogやってここまでのアクセスの遷移を見てると、最初にガッと増えてそれ以降落ちない。<br />
				あとは内容次第でその横ばいのラインが底上げされていく感じになるみたい。<br />
				なんで最初にガッとあげるべく、必要な手順の一つと割り切ってSEO関係を見よう見まねでやると、あとは凄いアクセスが来るわけでもないんだけど、まぁ日記レベルとしてはそこそこのアクセスがあって書いてる意味も多少あんのかな、と思える程度の水準に持っていける。</p>
				<p>たまに更新をガッチリしろとか書いてあるアドバイスあんだけど、これは多分人気blogにするならって事なんじゃないかね。<br />
				書く内容によってはfeedリーダー使う層が少なくて、更新ないとアクセス減るってケースもありそうだけど。</p>
				<p>てことで半年やった結果、そんなに頑張って更新しなくても有る程度のアクセスで満足いくならまったく問題ないよという事が分かった。<br />
				という事を調べるための実験のためにしばらく更新しなかったワケで、feedの合体に失敗してへこたれたとか、うっかりファイアーエムブレムに手を出してしまっただとか、そういう事では全然ない。<br />
				ましてそのせいでファイアーエムブレムの動画ばかり見てるなんて訳もない。</p>
				<div class="amazlet-box">
				<div class="amazlet-image"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000065V6S/amawebzon-22/ref=nosim/" name="amazletlink"><img src="http://ecx.images-amazon.com/images/I/51P8TKEX15L._SL160_.jpg" alt="ファイアーエムブレム 聖戦の系譜" /></a></div>
				<div class="amazlet-info">
				<div class="amazlet-name"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000065V6S/amawebzon-22/ref=nosim/" name="amazletlink">ファイアーエムブレム 聖戦の系譜</a>
				<div class="amazlet-powered-date">posted with <a href="http://www.amazlet.com/browse/ASIN/B000065V6S/amawebzon-22/ref=nosim/" title="ファイアーエムブレム 聖戦の系譜">amazlet</a> at 09.06.17</div>
				</div>
				<div class="amazlet-detail">任天堂 (1996-05-14)<br />売り上げランキング: 3392</div>
				<div class="amazlet-link"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B000065V6S/amawebzon-22/ref=nosim/" name="amazletlink">Amazon.co.jp で詳細を見る</a></div>
				</div>
				<div class="amazlet-footer"></div>
				</div>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/access_transition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpressで非公開コミュニティサイトを作る（7）feedのカスタマイズ2（失敗）</title>
		<link>http://weblog.atl-r.net/blog/tipstomake_communitysite7/</link>
		<comments>http://weblog.atl-r.net/blog/tipstomake_communitysite7/#comments</comments>
		<pubDate>Thu, 21 May 2009 21:56:51 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[bbpress]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2408</guid>
		<description><![CDATA[				
				feedのカスタマイズをしてみる。
				以前、をかもとさんの助言を得てfeedのテンプレートを自身のテーマ内に持つ方法を知ったので、これをwordpress自身のfeedに加え、コメントと、bbpr [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/01/090109-01.png" alt="wordpress!" title="wordpress!" width="345" height="85" class="alignnone size-full wp-image-221" /></p>
				<p>feedのカスタマイズをしてみる。</p>
				<p>以前、をかもとさんの助言を得てfeedのテンプレートを自身のテーマ内に持つ方法を知ったので、これをwordpress自身のfeedに加え、コメントと、bbpressのfeedをあわせる方法をやってみる。</p>
				<p><span id="more-2408"></span></p>
				<p>注意：<strong>今回いろいろ試した結果、挫折したのでこの記事を最後まで読んでも結局どうすればいいかは載ってないのであしからず…！！！</strong></p>
				<p>参考：<img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://dogmap.jp/2009/04/30/switching-feed-template/" /><a href="http://dogmap.jp/2009/04/30/switching-feed-template/" title="各種フィード用テンプレートの変更 : dogmap.jp" class="topic">各種フィード用テンプレートの変更 : dogmap.jp</a></p>
				<p>参考：<img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://weblog.atl-r.net/blog/tipstomake_communitysite4/" /><a href="http://weblog.atl-r.net/blog/tipstomake_communitysite4/" title="wordpressで非公開コミュニティサイトを作る（4）feedのカスタマイズ - atl*weblog" class="topic">wordpressで非公開コミュニティサイトを作る（4）feedのカスタマイズ &#8211; atl*weblog</a></p>
				<p>注意：をかもとさんが提示してくれたコードを、をかもとさん自身が記事にして若干変更されているので、そちらを参考にしたほうがきっと幸せ。</p>
				<h2>rss2の仕様</h2>
				<p>atomとかもあるけどまずはrss2から。<br />
				恥ずかしながらrss2の仕様についてよく知らないので、せっかくなので調べてみた。</p>
				<p><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://wiki.koshigoe.jp/doku.php?id=koshigoewiki:feed:rss2.0%E4%BB%95%E6%A7%98" /><a href="http://wiki.koshigoe.jp/doku.php?id=koshigoewiki:feed:rss2.0%E4%BB%95%E6%A7%98" title="koshigoewiki:feed:rss2.0仕様 [KoshigoeWiki]" class="topic">koshigoewiki:feed:rss2.0仕様 [KoshigoeWiki]</a></p>
				<p>今までなんとなく面倒そうでちゃんと理解してこなかったが、案外シンプルでわかりやすい。<br />
				詳しい仕様はリンク先を参照してもらうとして、以下個人的めも。</p>
				<ul>
				<li>channel要素は仕様では複数設置できるが、フィード利用状況からひとつにおさえ、複数のコンテンツはchannel要素内のitem要素を増やす形に</li>
				<li>必須項目・オプション項目に含まれない要素はxmlnsで指定したネームスペースを利用</li>
				</ul>
				<h2>rss2テンプレートの仕組み（feed-rss2.php）</h2>
				<p>wordpress2.7.1の<em>feed-rss2.php</em><br />
				※ただし元のママではなく、本文部分を出力しないよう該当部分を除外したもの、詳しくは&#8221;<a href="http://weblog.atl-r.net/blog/tipstomake_communitysite4/" title="wordpressで非公開コミュニティサイトを作る（4）feedのカスタマイズ - atl*weblog" class="topic">wordpressで非公開コミュニティサイトを作る（4）feedのカスタマイズ &#8211; atl*weblog</a>”に。</p>
				<pre><code class="prettyprint"><span class="nocode"> 1: </span>&lt;?php
<span class="nocode"> 2: </span>/**
<span class="nocode"> 3: </span> * RSS2 Feed Template for displaying RSS2 Posts feed.
<span class="nocode"> 4: </span> *
<span class="nocode"> 5: </span> * @package WordPress
<span class="nocode"> 6: </span> */
<span class="nocode"> 7: </span>header(&apos;Content-Type: text/xml; charset=&apos; . get_option(&apos;blog_charset&apos;), true);
<span class="nocode"> 8: </span>$more = 1;
<span class="nocode"> 9: </span>
<span class="nocode">10: </span>?&gt;
<span class="nocode">11: </span>&lt;?php echo &apos;&lt;?xml version=&quot;1.0&quot; encoding=&quot;&apos;.get_option(&apos;blog_charset&apos;).&apos;&quot;?&apos;.&apos;&gt;&apos;; ?&gt;
<span class="nocode">12: </span>
<span class="nocode">13: </span>&lt;rss version=&quot;2.0&quot;
<span class="nocode">14: </span>  xmlns:content=&quot;http://purl.org/rss/1.0/modules/content/&quot;
<span class="nocode">15: </span>  xmlns:wfw=&quot;http://wellformedweb.org/CommentAPI/&quot;
<span class="nocode">16: </span>  xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;
<span class="nocode">17: </span>  xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;
<span class="nocode">18: </span>  xmlns:sy=&quot;http://purl.org/rss/1.0/modules/syndication/&quot;
<span class="nocode">19: </span>  &lt;?php do_action(&apos;rss2_ns&apos;); ?&gt;
<span class="nocode">20: </span>&gt;
<span class="nocode">21: </span>
<span class="nocode">22: </span>&lt;channel&gt;
<span class="nocode">23: </span>  &lt;title&gt;&lt;?php bloginfo_rss(&apos;name&apos;); wp_title_rss(); ?&gt;&lt;/title&gt;
<span class="nocode">24: </span>  &lt;atom:link href=&quot;&lt;?php self_link(); ?&gt;&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot; /&gt;
<span class="nocode">25: </span>  &lt;link&gt;&lt;?php bloginfo_rss(&apos;url&apos;) ?&gt;&lt;/link&gt;
<span class="nocode">26: </span>  &lt;description&gt;&lt;?php bloginfo_rss(&quot;description&quot;) ?&gt;&lt;/description&gt;
<span class="nocode">27: </span>  &lt;pubDate&gt;&lt;?php echo mysql2date(&apos;D, d M Y H:i:s +0000&apos;, get_lastpostmodified(&apos;GMT&apos;), false); ?&gt;&lt;/pubDate&gt;
<span class="nocode">28: </span>  &lt;?php the_generator( &apos;rss2&apos; ); ?&gt;
<span class="nocode">29: </span>  &lt;language&gt;&lt;?php echo get_option(&apos;rss_language&apos;); ?&gt;&lt;/language&gt;
<span class="nocode">30: </span>  &lt;sy:updatePeriod&gt;&lt;?php echo apply_filters( &apos;rss_update_period&apos;, &apos;hourly&apos; ); ?&gt;&lt;/sy:updatePeriod&gt;
<span class="nocode">31: </span>  &lt;sy:updateFrequency&gt;&lt;?php echo apply_filters( &apos;rss_update_frequency&apos;, &apos;1&apos; ); ?&gt;&lt;/sy:updateFrequency&gt;
<span class="nocode">32: </span>  &lt;?php do_action(&apos;rss2_head&apos;); ?&gt;
<span class="nocode">33: </span>  &lt;?php while( have_posts()) : the_post(); ?&gt;
<span class="nocode">34: </span>  &lt;item&gt;
<span class="nocode">35: </span>    &lt;title&gt;&lt;?php the_title_rss() ?&gt;&lt;/title&gt;
<span class="nocode">36: </span>    &lt;link&gt;&lt;?php the_permalink_rss() ?&gt;&lt;/link&gt;
<span class="nocode">37: </span>    &lt;pubDate&gt;&lt;?php echo mysql2date(&apos;D, d M Y H:i:s +0000&apos;, get_post_time(&apos;Y-m-d H:i:s&apos;, true), false); ?&gt;&lt;/pubDate&gt;
<span class="nocode">38: </span>    &lt;dc:creator&gt;&lt;?php the_author() ?&gt;&lt;/dc:creator&gt;
<span class="nocode">39: </span>    &lt;?php the_category_rss() ?&gt;
<span class="nocode">40: </span>    &lt;guid isPermaLink=&quot;false&quot;&gt;&lt;?php the_guid(); ?&gt;&lt;/guid&gt;
<span class="nocode">41: </span>    &lt;wfw:commentRss&gt;&lt;?php echo get_post_comments_feed_link(); ?&gt;&lt;/wfw:commentRss&gt;
<span class="nocode">42: </span>&lt;?php rss_enclosure(); ?&gt;
<span class="nocode">43: </span>  &lt;?php do_action(&apos;rss2_item&apos;); ?&gt;
<span class="nocode">44: </span>  &lt;/item&gt;
<span class="nocode">45: </span>  &lt;?php endwhile; ?&gt;
<span class="nocode">46: </span>&lt;/channel&gt;
<span class="nocode">47: </span>&lt;/rss&gt;</code></pre>
				<dl>
				<dt>7行目</dt>
				<dd>headerを送っている、文字コードはxml宣言時に送ってるので不要な気がしたが、両方送っても問題なさそうだしいいのかな。</dd>
				<dt>8行目</dt>
				<dd>調べたんだけどよくわからないな…おそらく“続きを読む”とかその辺に関連してると思うんだけど。$moreが1だと全文って事な感じなんだけどなー。</dd>
				<dt>11行目</dt>
				<dd>xml宣言</dd>
				<dt>13～20行目</dt>
				<dd>rss要素の開始タグ。何か沢山xmlnsつけてるんだけどxmlns:contentが使われている形跡がない？？</dd>
				<dt>19行目</dt>
				<dd>この<code>do_action(&apos;rss2_ns&apos;)</code>はどこにもadd_actionがないんだよなぁ、pluginとかで使うようにあるっぽい。</dd>
				<dt>22行目</dt>
				<dd>channel要素開始タグ。</dd>
				<dt>23～31行目</dt>
				<dd>このfeedに関する情報。タイトルとかURLとか。</dd>
				<dt>32行目</dt>
				<dd><code>do_action(&apos;rss2_ns&apos;)</code>と同じくplugin用ぽい。</dd>
				<dt>33~45行目</dt>
				<dd>ここがループ部分。普通のテンプレートでのループと同じやり方。itemを一つづつ出力してる。</dd>
				<dt>35~38行目</dt>
				<dd>ループ中の記事のタイトルとかパーマリンクとかをrss向けに出力するテンプレートタグだったり、関数だったり。</dd>
				<dt>39行目</dt>
				<dd>feedのフォーマットにあわせた形で、ループ中の記事のカテゴリーを出力する。出力はカテゴリーごとに<code>&lt;category&gt;</code>タグに入れて、カテゴリー名はCDATAとして出している。俺の環境だといまいち法則性の分からない改行とインデントも漏れなく付いてくる。</dd>
				<dt>40行目</dt>
				<dd>これもパーマリンクを出力してるんだけど、25行目と違うのは、こっちはwordpressで設定したパーマリンク設定ではなくデフォルトの設定でURLが出力されてるみたい。けど<code>isPermaLink=”false”</code>だからfeedreaderはuriとして解釈しないみたい。なんであるかは知らない。</dd>
				<dt>41行目</dt>
				<dd>ループ中の記事のコメントのfeedアドレス。</dd>
				<dt>42行目</dt>
				<dd>ループ中の記事に画像とかポッドキャストがあった場合、feed用に変換し出力するテンプレートタグ、らしい。該当するものがない場合は何も出力されない。</dd>
				<dt>43行目</dt>
				<dd>これもplugin用フックかな、フィードの各記事分が閉じられる直前に何かしたい場合に利用するんだろう。</dd>
				</dl>
				<h2>rss2コメントテンプレートの仕組み（feed-rss2-comments.php）</h2>
				<p>wordpress2.7.1の<em>feed-rss2-comments.php</em></p>
				<pre><code class="prettyprint"><span class="nocode"> 1: </span>&lt;?php
<span class="nocode"> 2: </span>/**
<span class="nocode"> 3: </span> * RSS2 Feed Template for displaying RSS2 Comments feed.
<span class="nocode"> 4: </span> *
<span class="nocode"> 5: </span> * @package WordPress
<span class="nocode"> 6: </span> */
<span class="nocode"> 7: </span>
<span class="nocode"> 8: </span>header(&apos;Content-Type: text/xml;charset=&apos; . get_option(&apos;blog_charset&apos;), true);
<span class="nocode"> 9: </span>
<span class="nocode">10: </span>echo &apos;&lt;?xml version=&quot;1.0&quot; encoding=&quot;&apos;.get_option(&apos;blog_charset&apos;).&apos;&quot;?&apos;.&apos;&gt;&apos;;
<span class="nocode">11: </span>?&gt;
<span class="nocode">12: </span>&lt;rss version=&quot;2.0&quot;
<span class="nocode">13: </span>  xmlns:content=&quot;http://purl.org/rss/1.0/modules/content/&quot;
<span class="nocode">14: </span>  xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;
<span class="nocode">15: </span>  xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;
<span class="nocode">16: </span>  xmlns:sy=&quot;http://purl.org/rss/1.0/modules/syndication/&quot;
<span class="nocode">17: </span>  &gt;
<span class="nocode">18: </span>&lt;channel&gt;
<span class="nocode">19: </span>  &lt;title&gt;&lt;?php
<span class="nocode">20: </span>    if ( is_singular() )
<span class="nocode">21: </span>      printf(ent2ncr(__(&apos;Comments on: %s&apos;)), get_the_title_rss());
<span class="nocode">22: </span>    elseif ( is_search() )
<span class="nocode">23: </span>      printf(ent2ncr(__(&apos;Comments for %s searching on %s&apos;)), get_bloginfo_rss( &apos;name&apos; ), attribute_escape($wp_query-&gt;query_vars[&apos;s&apos;]));
<span class="nocode">24: </span>    else
<span class="nocode">25: </span>      printf(ent2ncr(__(&apos;Comments for %s&apos;)), get_bloginfo_rss( &apos;name&apos; ) . get_wp_title_rss());
<span class="nocode">26: </span>  ?&gt;&lt;/title&gt;
<span class="nocode">27: </span>  &lt;atom:link href=&quot;&lt;?php self_link(); ?&gt;&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot; /&gt;
<span class="nocode">28: </span>  &lt;link&gt;&lt;?php (is_single()) ? the_permalink_rss() : bloginfo_rss(&quot;url&quot;) ?&gt;&lt;/link&gt;
<span class="nocode">29: </span>  &lt;description&gt;&lt;?php bloginfo_rss(&quot;description&quot;) ?&gt;&lt;/description&gt;
<span class="nocode">30: </span>  &lt;pubDate&gt;&lt;?php echo gmdate(&apos;r&apos;); ?&gt;&lt;/pubDate&gt;
<span class="nocode">31: </span>  &lt;?php the_generator( &apos;rss2&apos; ); ?&gt;
<span class="nocode">32: </span>  &lt;sy:updatePeriod&gt;&lt;?php echo apply_filters( &apos;rss_update_period&apos;, &apos;hourly&apos; ); ?&gt;&lt;/sy:updatePeriod&gt;
<span class="nocode">33: </span>  &lt;sy:updateFrequency&gt;&lt;?php echo apply_filters( &apos;rss_update_frequency&apos;, &apos;1&apos; ); ?&gt;&lt;/sy:updateFrequency&gt;
<span class="nocode">34: </span>  &lt;?php do_action(&apos;commentsrss2_head&apos;); ?&gt;
<span class="nocode">35: </span>&lt;?php
<span class="nocode">36: </span>if ( have_comments() ) : while ( have_comments() ) : the_comment();
<span class="nocode">37: </span>  $comment_post = get_post($comment-&gt;comment_post_ID);
<span class="nocode">38: </span>  get_post_custom($comment_post-&gt;ID);
<span class="nocode">39: </span>?&gt;
<span class="nocode">40: </span>  &lt;item&gt;
<span class="nocode">41: </span>    &lt;title&gt;&lt;?php
<span class="nocode">42: </span>      if ( !is_singular() ) {
<span class="nocode">43: </span>        $title = get_the_title($comment_post-&gt;ID);
<span class="nocode">44: </span>        $title = apply_filters(&apos;the_title_rss&apos;, $title);
<span class="nocode">45: </span>        printf(ent2ncr(__(&apos;Comment on %1$s by %2$s&apos;)), $title, get_comment_author_rss());
<span class="nocode">46: </span>      } else {
<span class="nocode">47: </span>        printf(ent2ncr(__(&apos;By: %s&apos;)), get_comment_author_rss());
<span class="nocode">48: </span>      }
<span class="nocode">49: </span>    ?&gt;&lt;/title&gt;
<span class="nocode">50: </span>    &lt;link&gt;&lt;?php comment_link() ?&gt;&lt;/link&gt;
<span class="nocode">51: </span>    &lt;dc:creator&gt;&lt;?php echo get_comment_author_rss() ?&gt;&lt;/dc:creator&gt;
<span class="nocode">52: </span>    &lt;pubDate&gt;&lt;?php echo mysql2date(&apos;D, d M Y H:i:s +0000&apos;, get_comment_time(&apos;Y-m-d H:i:s&apos;, true), false); ?&gt;&lt;/pubDate&gt;
<span class="nocode">53: </span>    &lt;guid isPermaLink=&quot;false&quot;&gt;&lt;?php comment_guid() ?&gt;&lt;/guid&gt;
<span class="nocode">54: </span>&lt;?php if ( post_password_required($comment_post) ) : ?&gt;
<span class="nocode">55: </span>    &lt;description&gt;&lt;?php echo ent2ncr(__(&apos;Protected Comments: Please enter your password to view comments.&apos;)); ?&gt;&lt;/description&gt;
<span class="nocode">56: </span>    &lt;content:encoded&gt;&lt;![CDATA[&lt;?php echo get_the_password_form() ?&gt;]]&gt;&lt;/content:encoded&gt;
<span class="nocode">57: </span>&lt;?php else : // post pass ?&gt;
<span class="nocode">58: </span>    &lt;description&gt;&lt;?php comment_text_rss() ?&gt;&lt;/description&gt;
<span class="nocode">59: </span>    &lt;content:encoded&gt;&lt;![CDATA[&lt;?php comment_text() ?&gt;]]&gt;&lt;/content:encoded&gt;
<span class="nocode">60: </span>&lt;?php endif; // post pass
<span class="nocode">61: </span>  do_action(&apos;commentrss2_item&apos;, $comment-&gt;comment_ID, $comment_post-&gt;ID);
<span class="nocode">62: </span>?&gt;
<span class="nocode">63: </span>  &lt;/item&gt;
<span class="nocode">64: </span>&lt;?php endwhile; endif; ?&gt;
<span class="nocode">65: </span>&lt;/channel&gt;
<span class="nocode">66: </span>&lt;/rss&gt;</code></pre>
				<dl>
				<dt>8～10行目</dt>
				<dd>feed-rss2.phpと同じだが<code>$more</code>はない。</dd>
				<dt>12～17行目</dt>
				<dd>xmlnsが少なくなっているのと、<code>do_action('rss2_ns');</code>がなくなっている。</dd>
				<dt>19～26行目</dt>
				<dd>どこのコメントかによってタイトル表記を分岐させているようだ。</dd>
				<dt>20～21行目</dt>
				<dd><code>is_singular()</code>はコンディショナルタグで、<q title="Conditional Tags - WordPress Codex 日本語版" cite="http://wpdocs.sourceforge.jp/Conditional_Tags">When any of the following return true: is_single(), is_page() or is_attachment().</q>とあるように、記事かページか画像などの添付ファイル表示ページの時のみtrueを返す。<br />
				<code>ent2ncr()</code>は文字実態参照を数値文字参照に変換する。</dd>
				<dt>22～23行目</dt>
				<dd><code>is_search()</code>はまんま、検索結果表示ページなら、という意味のコンディショナルタグなんだけど、検索結果表示ページにコメントなんかつけて、しかもそれfeedで受信てどうも利用用途がわからないな。テンプレートいじればコメントつけれるようになるとは思うけど…そもそもそんなテーマも少なそう。<br />
				<code>get_bloginfo_rss()</code>でfeed用にフォーマットされたblog自体の名称を取得して、検索語句とあわせ出力している。</dd>
				<dt>24～25行目</dt>
				<dd>上記でない場合の処理、けど上記に当てはまらないケースが思いつかない。</dd>
				<dt>27～33行目</dt>
				<dd>多少差異はあるがfeed-rss2.phpと同様に表示中のfeedに関する詳細情報を出力している。</dd>
				<dt>34行目</dt>
				<dd><code>do_action('rss2_head')</code>と同じくplugin用フックだと思われる。</dd>
				<dt>36行目</dt>
				<dd>ループの開始部分。</dd>
				<dt>37行目</dt>
				<dd><code>$comment-&gt;comment_post_ID</code>でループ中のコメントのIDを取得し、そのIDを<code>get_post()</code>に渡す事で、そのコメントが含まれる記事やページを取得しているんだと思う。ここで取得した記事やページのオブジェクトから、記事IDや、コメントがついている元の記事タイトルなんかを引っ張り出している。</dd>
				<dt>38行目</dt>
				<dd>上で取得した記事のIDを引数に渡し、なぜかカスタムフィールドを読み込んでいる。</dd>
				<dt>40～63行目</dt>
				<dd>item要素がこの範囲、コメントひとつ分にあたる。</dd>
				<dt>41～49行目</dt>
				<dd>タイトルを先ほど出てきた<code>is_singular()</code>で分岐させている。<code>is_singular()</code>がfalseの場合はタイトルとコメント投稿者名を、trueの場合はコメントの投稿者名のみを出力。<br />
				falseの場合、コメント全体を出力しているのでコメントの元となる記事やページのタイトルが必要になる。</dd>
				<dt>50～53行目</dt>
				<dd>出現順やテンプレートタグは違うが、基本feed-rss2.phpと同じ。</dd>
				<dt>54～60行目</dt>
				<dd>コメントの元となる記事やページがパスワード保護されているかで条件分岐させている。もし保護されている場合、descriptionにパスワード入れてからコメント見てねというメッセージと入力フォームを表示する。パスワード保護がない場合、descriptionにコメント本文をfeed用に、<code>&lt;content:encoded&gt;</code>にコメント本文をCDATAで出力。</dd>
				<dt>61行目</dt>
				<dd>feed-rss2.phpと同じくplugin用フック。こちらはコメントIDとコメントのついている記事のIDも引数で渡すようになっている。</dd>
				</dl>
				<h2>通常のfeedにコメントのfeedをあわせる</h2>
				<p>さて、まずは通常feedにコメントも加えてみる。<br />
				具体的にはpostとコメント、両方を区別せず更新日時のみでfeedを生成する形を目指す。<br />
				当然そんなテンプレートタグは用意されてないので、どうするのか現時点では皆目検討がつかないが…、うまくいけばwordpressのコアの関数かなにかを使ってもにょもにょしたい。<br />
				出来ない場合は…通常のとコメントのをループまわして、それぞれ格納して、ソートしなおして、出力…？<br />
				それは避けたいなぁー！！</p>
				<h3>ループの仕組み</h3>
				<p>という事でとりあえずwordpressのループ周りの仕組みを追跡してみた。<br />
				とりあえずよくわからないけどそう書けと言うんで言われるがままに書いてきた、have_postsとかthe_postについて。</p>
				<p>まずwordpressはループやちょっと複雑な処理を担当するWP_Queryってクラスがwp-includes/query.phpで定義されてる。<br />
				んで、つかう場合は$wp_queryオブジェクトからメソッドで操作せず、ラッパー関数から同名メソッドを呼び出す形が多い。<br />
				しかもこのオブジェクトは色々情報も持ってる、今ループ中ですとか、現ループで扱ってる記事の情報とか、そもそも現在のページはアーカイブページですよ、だとか。<br />
				…たぶん、あんま自信ないけどそういう事だと思う。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query" width="16" height="16" alt="" /><a href="http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query" title="関数リファレンス/WP Query - WordPress Codex 日本語版">関数リファレンス/WP Query &#8211; WordPress Codex 日本語版</a></p>
				<p>んで、件のhave_postsとかthe_post、あとはコメントfeedで使われてたループ制御のhave_commentsやthe_commentも、WP_Queryのメソッドだったのだ。（正確にはメソッドを呼び出すラッパー関数）<br />
				本題のhave_postsとかthe_postの機能はリンク先に既に載っているのでざっと。<br />
				have_postsが表示すべき記事がまだあるの？ってのをみてる。記事がまだ3つしかないblogのループの場合、3回ループまわして4回目は当然ないんでこのメソッドはfalseを返す。<br />
				the_postはループ中にのみ使えて、現ループ中の対象記事の情報をグローバル変数$postに突っ込んでくれる。<br />
				つまりthe_post()と書くだけで$postを参照する様々な関数だとかが、対象となる現ループ中の記事情報を参照してくれる。<br />
				コメントのほうも基本同じような事してるっぽい、なるほどなぁ～。</p>
				<p>すんげー面倒そうでやってないけど、wp-includes/query.phpの中身をよく見ていくと、きっと何でも出来る気がしてくるんじゃないかな！<br />
				俺はまったくしないけど。</p>
				<h3>七転八倒</h3>
				<p>とりあえずwhileの条件にhave_posts()かhave_comments()がtrueでまわすようにして、中で再びそれぞれifの条件で出すような感じにしたんだけど、これじゃだめっぽい。<br />
				そもそもコメントのみ出てなかったんで、試しにコメントだけ出力するようにしてみたけど、何もでない。<br />
				あれー、と思いfeed-rss2.phpにfeed-rss2-comments.phpをまるまる上書きしてみると…うお！でねぇ！<br />
				てことは、今表示してるのが普通のfeedかコメントのfeedかをどこかで見てて、それのせいでコメントの分を混ぜれてないのか。</p>
				<p>しょうがないのでwp_queryオブジェクトを見てみると、feed-rss2-comments.phpのほうではquery_varsにwithcommentsなんてものが存在してる。あとこれは予想通りだが、is_comment_feedが1(true)だ。<br />
				試しに無理やりこの値を設定してみたが、それでもダメくさい、<br />
				うーん、feedを読み込む際にwp_queryオブジェクトを生成してて、それがcommentsじゃないからコメントのテキストやらメタ情報が含まれて無いから、もう一回wp_queryオブジェクトを取得しなおせばいい…のか？</p>
				<p>何かうまい方法あるんじゃねーの？と思いfeed関係のpluginのソースを眺めてみるが…ゲーッ！クエリ書いてる！<br />
				そりゃまぁ何でもできるだろうけど…スマートじゃないなぁ。</p>
				<p>wordpressの関数を利用してやるには、今の俺にはちょっとしんどい量のソースを追跡しないといけなそう、かといってSQLクエリを書いてどうこうするのはセキュリティ的な面で非常に不安が残るし、DB構造が今後変更されたら最高に面倒なので、いったんwordpressから離れて考える事に。</p>
				<h3>別の方法を考える</h3>
				<p>さて、wordpressの機能を利用するという枷がなくなると選択肢は一気に広がる。<br />
				広がりすぎて記事数本になりかねない勢い。<br />
				ざっと思いつくのが以下。</p>
				<ol>
				<li>feed-rss2.phpおよびfeed-rss2-comments.phpを、item要素を返す関数があるだけのファイルにし、それを呼び出して使う。</li>
				<li>phpでゴリゴリ作る。</li>
				<li>feedマージ系のwebサービスを使う。</li>
				</ol>
				<p>個人的に本命は1なんだけど、今は心が折れ気味なのと、そもそも出来るのかよくわからないのと、そのうちwordpressの機能でやる方法を思いつくなり調べれるのを期待し、もっとも手軽な3で行こうかなとりあえず。<br />
				最終的にはbbpressのfeedも合成したいんで、wordpressの機能だけと言いつつどのみち1か2か、もしくは別の方法を混ぜていかないといけなくなるはずなので、そういう意味でもwebサービスは代替方法としては最適だ。<br />
				というかなんで最初から使わなかったのかってと、Yahoo! Pipesのレスポンスとかが遅いイメージがあったのと、更新頻度が低いからだったりする。</p>
				<h3>webサービスでfeedをマージする</h3>
				<p><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://jamz.jp/weblog/2009/01/rss-merge.html" /><a href="http://jamz.jp/weblog/2009/01/rss-merge.html" title="[J] 複数のフィード (RSS) を一つにマージする方法 - Jamz" class="topic">[J] 複数のフィード (RSS) を一つにマージする方法 &#8211; Jamz</a></p>
				<p>ここに非常に有益なマトメ記事があるので、すでに半分以上目的が達成している。<br />
				あとはどれを選ぶかくらいの話だ。</p>
				<p>本来なら各サービスの速度測定とかしたり比較したりして余力がありゃ記事化したいところだが、あまりに本筋から脱線してるしそもそもwebサービスは代替方法なのでここはスルー力。とりあえずははてなRSSを非公開で試してみたが、問題なさそうではある…あれ！？bbpressのfeedが構文エラー起こしてる！</p>
				<h3>bbpressのfeedがおかしい</h3>
				<p>bbpressのfeedがwordpressと統合をしたせいでおかしな事になっていた。<br />
				簡単にまとめると以下の構造のコードが書き出されていた。</p>
				<pre><code class="prettyprint">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;!-- generator=&quot;WordPress/2.7.1&quot; --&gt;
&lt;rss version=&quot;0.92&quot;&gt;
&lt;channel&gt;
  &lt;title&gt;wordpressのタイトル &amp;#187; ページが見つかりませんでした&lt;/title&gt;
  &lt;link&gt;wordpressのURI&lt;/link&gt;
  &lt;description&gt;wordpressのdescription&lt;/description&gt;
  &lt;lastBuildDate&gt;日時&lt;/lastBuildDate&gt;

  &lt;docs&gt;http://backend.userland.com/rss092&lt;/docs&gt;
  &lt;language&gt;ja&lt;/language&gt;

&lt;/channel&gt;
&lt;/rss&gt;
&lt;br /&gt;
&lt;b&gt;Warning&lt;/b&gt;:  Cannot modify header information - headers already sent by (output started at feedのテンプレートへのパス/feed-rss.php:12) in &lt;b&gt;bbpressのテーマへのパス/rss2.php&lt;/b&gt; on line &lt;b&gt;1&lt;/b&gt;&lt;br /&gt;

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;!-- generator=&quot;bbPress&quot; --&gt;
&lt;rss version=&quot;2.0&quot;
  xmlns:content=&quot;http://purl.org/rss/1.0/modules/content/&quot;
  xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;
  xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot;
&gt;
  &lt;channel&gt;
    &lt;title&gt;bbpressの名前: トピック名&lt;/title&gt;
    &lt;link&gt;bbpressへのパス&lt;/link&gt;
    &lt;description&gt;bbpressのdescription&lt;/description&gt;
    &lt;language&gt;ja&lt;/language&gt;
    &lt;pubDate&gt;日時&lt;/pubDate&gt;

    &lt;generator&gt;bbpress 1.0-alpha-6&lt;/generator&gt;
    &lt;textInput&gt;
      &lt;title&gt;&lt;![CDATA[検索]]&gt;&lt;/title&gt;
      &lt;description&gt;&lt;![CDATA[Search all topics from these forums.]]&gt;&lt;/description&gt;
      &lt;name&gt;q&lt;/name&gt;
      &lt;link&gt;bbpressの検索へのURI&lt;/link&gt;
    &lt;/textInput&gt;

    &lt;atom:link href=&quot;bbpressのfeedのURI&quot; rel=&quot;self&quot; type=&quot;application/rss+xml&quot; /&gt;

    &lt;item&gt;
      &lt;title&gt;投稿者名 :  &quot;トピック名&quot;&lt;/title&gt;
      &lt;link&gt;投稿へのリンク&lt;/link&gt;
      &lt;pubDate&gt;日時&lt;/pubDate&gt;
      &lt;dc:creator&gt;投稿者名&lt;/dc:creator&gt;

      &lt;guid isPermaLink=&quot;false&quot;&gt;1@bbpressへのURI&lt;/guid&gt;
      &lt;description&gt;投稿内容&lt;/description&gt;
    &lt;/item&gt;

  &lt;/channel&gt;
&lt;/rss&gt;</code></pre>
				<p>見てのとおり、最初にwordpressのfeedテンプレートを呼んじゃってて、ページは見つからない扱いになる…まではわかるのだが、なぜかその後bbpressのほうのfeedテンプレートまで呼び出すもんだから、headerがエラー出すわエラーメッセージでbrタグなんか入れるわそもそもwordpress側のrssのヴァージョンがなぜか0.92だわテンヤワンヤになっている。<br />
				しかもあれこれしてるうちに、そもそもアクセスしても何もないよとか言われる始末。<br />
				とはいえ冷静に見るとbbpressのfeedはちゃんと出てるぽいんでなんとかしてやろうかな。<br />
				（ほんと次から次へと問題でるな…）</p>
				<p>あれ？というかbbpressのfeedってログインしないと見れないのか。<br />
				じゃだめじゃん…_no</p>
				<p>ここで今回は力尽きた。（今回、といっても一週間以上かかっているのだが…）</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/tipstomake_communitysite7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpressで非公開コミュニティサイトを作る（6） bbpress1.0αのテーマカスタマイズ</title>
		<link>http://weblog.atl-r.net/blog/tipstomake_communitysite6/</link>
		<comments>http://weblog.atl-r.net/blog/tipstomake_communitysite6/#comments</comments>
		<pubDate>Sat, 09 May 2009 07:36:17 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[bbpress]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2380</guid>
		<description><![CDATA[				
				無事導入できたbbpresws、次はこれを通常のwordpress同様にカスタムしていく方法を見ていく。
				
				wordpressとbbpressの完全な統合
				前回やった連携・統合と [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/01/090109-01.png" alt="wordpress!" title="wordpress!" width="345" height="85" class="alignnone size-full wp-image-221" /></p>
				<p>無事導入できたbbpresws、次はこれを通常のwordpress同様にカスタムしていく方法を見ていく。</p>
				<p><span id="more-2380"></span></p>
				<h2>wordpressとbbpressの完全な統合</h2>
				<p>前回やった連携・統合というのは、<em>ログインとユーザー情報を共有</em>させる基本的なものだった。<br />
				けどwordpress及びbbpressを利用してあれこれ作りたい人にとって本来欲しい統合とは、テンプレートタグやAPIの統合だったんじゃないだろうか。<br />
				wordpressで作ったサイト内の1コンテンツとして、bbpressを利用したforumsがあり、それら全てのコンテンツで共通したヘッダーやフッダーが表示される、そこにはグローバルメニューがあり、メニューはwordpressのテンプレートタグからカテゴリーリストを取得している…みたいな。<br />
				俺も以前いじった時はそれがやりたくて、あれこれ調べた結果、以下の記事に載っている方法でそれを再現する事が出来た。</p>
				<p><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://www.adityanaik.com/integratepress-part-i/" /><a href="http://www.adityanaik.com/integratepress-part-i/" title="integratePress - Part I | Aditya Naik" class="topic">integratePress &#8211; Part I | Aditya Naik</a></p>
				<p>これを利用すると何が出来たか、それはbbpressのテーマファイルからwordpressのテンプレートタグを利用できるようになったのだ。<br />
				なのでbbpressのテンプレートからwp_head()を利用してheader.phpを呼び出したりとかも可能だった。<br />
				しかしこれ、既に<strong>現在のヴァージョンでは使う事が出来ない。</strong></p>
				<p>俺が試した時は確かwordpress2.5x、bbpressが0.9xだった頃だったが、wp2.6そして2.7にいたるまでに肝心のcookieの仕様等あれこれ変わったせいなのか、使えなくなってしまったみたい。</p>
				<p>うーんまいったなぁと思ってたら、あれ公式のDocumentationに載ってた！</p>
				<p><cite><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://bbpress.org/documentation/integration-with-wordpress/" /><a href="http://bbpress.org/documentation/integration-with-wordpress/" title="bbPress » Integration with WordPress" class="topic">bbPress » Integration with WordPress</a></cite></p>
				<blockquote cite="http://bbpress.org/documentation/integration-with-wordpress/"><p>bbPress will not have access to WordPress’ functions unless you manually tell bbPress to load WordPress first. This integration step is also known as “deep” integration, it is a totally optional part of integration and is not required to get shared cookies and logins working. In order to do it, you need to put require_once(&#8216;path/to/wp-blog-header.php&#8217;); in bbPress’ bb-config.php (wp-blog-header is in the same directory as WordPress’ wp-config.php file).</p></blockquote>
				<p>bb-config.phpに<code>require_once('フルパス/wp-blog-header.php');</code>を加えるだけで、wordpressのテンプレートタグが使えるように！（この際日本語化に支障が出るが、詳しくは後述）<br />
				けどDocumentationには、重くなるからplugin使ったほうがいいよとある…のだが、pluginを探してみるも一体どれがその役目を果たすものなのか見つけられなかったので、とりあえずこの方法でやる事に。<br />
				テスト環境だと特に重さは感じられないので、問題なさそうだけど。</p>
				<h2>bbpressのテーマ</h2>
				<h3>テーマの位置</h3>
				<p>bbpressはwordpressと同様にbbpress独自のテーマ・テンプレートがあり、それをあれこれする事でデザインを変更する事が出来る。<br />
				bbpressのディレクトリ内の<em>bb-templates</em>フォルダが、wordpressのthemesにあたる。<br />
				…と本来これで終了なのだが、bbpressではbb-templatesはコアファイル（？）に含まれるらしく、ヴァージョンアップの際上書きされる可能性が一応ある。<br />
				なのでbbpressのテーマを作る際は、bbpressのディレクトリ直下に<strong>my-templates</strong>という名前のフォルダを作り、ここに自分で作成するテーマを入れていく形になる。<br />
				（同様にpluginも<em>my-plugins</em>フォルダを作って管理する事が出来る）</p>
				<h3>テーマを構成するファイルの種類</h3>
				<p>日本語の革命から取ったと思われる<em>Kakumei</em>というデフォルトテーマを良く読めば、一応どのように作るかは把握出来る。</p>
				<p>テーマについての情報を管理画面に表示するために最低限必要なものは以下のとおり。</p>
				<ul>
				<li>style.css</li>
				<li>300×225のscreenshot.png</li>
				</ul>
				<p>wordpressと同じく、テーマの情報はstyle.cssの最初の部分にコメントとして以下の形式で記述。</p>
				<pre><code class="prettyprint">/*
Theme Name:[テーマの名称]
Theme URI: [テーマのURI]
Description: [テーマの説明]
Version: [テーマのバージョン]
Author: [テーマの制作者]
Author URI: [テーマの制作者のURI]
[コメントやライセンスなど]
*/</code></pre>
				<p>wordpressでは上記に加えindex.phpが必要だったが、bbpressではindex.phpもそれに相当するテンプレートファイルも見当たらない。<br />
				bbpressでは必要なテンプレートファイルがない場合、デフォルトテーマであるKakumeiから該当部分のみ読み込むようになっている。</p>
				<p>また公式サイトによると以下のテンプレートファイルが存在するとの事。</p>
				<dl id="template-list">
				<dt>front-page.php</dt>
				<dd>フロントページ、つまりbbpressのトップページにあたる。</dd>
				<dt>forum.php</dt>
				<dd>フォーラムの表示、ここに表示中のフォーラムに属するトピックが一覧表示される。</dd>
				<dt>edit-post.php</dt>
				<dd>既に投稿したコメントを編集する画面。</dd>
				<dt>edit-form.php</dt>
				<dd>bbpress用関数<code>edit_form()</code>で呼び出される、編集フォーム。edit-post.phpから呼び出されている。</dd>
				<dt>favorites.php</dt>
				<dd>ユーザー情報の“お気に入り”ページのテンプレート。</dd>
				<dt>header.php</dt>
				<dd>その名の通り、ヘッダー。<code>bb_get_header()</code>で呼び出される。</dd>
				<dt>footer.php</dt>
				<dd>その名の通り、フッター。<code>bb_get_footer()</code>で呼び出される。</dd>
				<dt>login.php</dt>
				<dd>ログインページのテンプレート。/bb-login.phpがそれにあたる。</dd>
				<dt>login-form.php</dt>
				<dd>bbpress用関数<code>login_form()</code>で、ユーザーがログインしてない場合、呼び出される。デフォルトテーマKakumeiではヘッダー部分で呼び出している。</dd>
				<dt>logged-in.php</dt>
				<dd>bbpress用関数<code>login_form()</code>で、ユーザーがログインしている場合、呼び出される。</dd>
				<dt>password-reset.php</dt>
				<dd>/bb-login.phpからパスワードの回復を行った場合の結果を表示する画面。ここでユーザー名を送ると登録してあるメアドにパスワードリセット用URIが送られ、そのアドレスへ移動するとメアドに新しいパスワードを送ってくれる機能。このpassword-reset.phpはメール送りましたよ！って通知とパスワード新しく設定したよ！って通知の際に表示される。</dd>
				<dt>post-form.php</dt>
				<dd>フォーラムやトピックを新しく追加する際に呼び出されるフォーム。bbpress用関数<code>post_form()</code>で呼び出される。</dd>
				<dt>post.php</dt>
				<dd>bbpress用関数<code>bb_post_template()</code>で呼び出される。投稿を表示するためのテンプレートでループ中に呼び出される。</dd>
				<dt>profile.php</dt>
				<dd>ユーザーページのテンプレート。</dd>
				<dt>profile-edit.php</dt>
				<dd>ユーザーページの編集画面のテンプレート。</dd>
				<dt>profile-base.php</dt>
				<dd>プラグインでユーザーページに追加されたページがあった場合のページテンプレート。</dd>
				<dt>register.php</dt>
				<dd>ユーザー登録画面用テンプレート。</dd>
				<dt>register-success.php</dt>
				<dd>ユーザー登録に成功した旨を知らせるページ用テンプレート。</dd>
				<dt>search.php</dt>
				<dd>検索結果表示用テンプレート。</dd>
				<dt>search-form.php</dt>
				<dd>bbpress用関数<code>search_form()</code>で呼び出される。検索フォームのテンプレート。デフォルトテーマKakumeiではヘッダー部分で呼び出している。</dd>
				<dt>stats.php</dt>
				<dd>人気の記事や現在の登録ユーザー数等を表示するstatistics.php用テンプレート。デフォルトテーマKakumeiではどこからもリンクされていない。</dd>
				<dt>topic.php</dt>
				<dd>トピックを表示するテンプレート。</dd>
				<dt>topic-tags.php</dt>
				<dd>bbpress用関数<code>topic_tags()</code>で呼び出される。表示中のトピックのタグと、追加削除用フォームを呼び出す。</dd>
				<dt>tag-form.php</dt>
				<dd><q>Called by tags_form().</q>と公式サイトにあるが、少なくとも1.0にはそんな関数もなければ、tag-form.phpもデフォルトテンプレート内に存在しない。またコアファイル内のどこにもtag-form.phpに関する関連付けがないので、作った所で何も機能しない。<br />
				これはおそらく誤表記で正確には<strong>tag_form()</strong>だと思われるが、これはコアファイル内の関数でhtmlを出力しているので、結局テンプレートを作っても置き換えてはくれないぽい。</dd>
				<dt>tags.php</dt>
				<dd>タグ一覧ページ表示用テンプレート。よく使われるタグ一覧を見れる。</dd>
				<dt>tag-single.php</dt>
				<dd>あるタグに属するトピックの一覧・そのタグに属するトピックの作成フォーム・タグ編集フォームが表示される画面のテンプレート。アドレスはtags.phpと一緒だが、こちらは引数でタグ名を渡すと表示される。</dd>
				<dt>view.php</dt>
				<dd>ログインしている時のみ表示される「返信の無いトピック」や「タグの無いトピック」といった一覧を表示するためのテンプレート。ログインしている時のみ、というのは単にテンプレートでログインしてるかで分岐させているだけなので、元々そういう機能が備わっているワケではない。</dd>
				</dl>
				<p><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://bbpress.org/documentation/themes/" /><a href="http://bbpress.org/documentation/themes/" title="bbPress » Themes and Templates" class="topic">bbPress » Themes and Templates</a></p>
				<p>また、これ以外にもデフォルトテーマ内には以下のテンプレートが存在した。</p>
				<dl>
				<dt>404.php</dt>
				<dd>見てのとおり、404が帰ってきた時に表示するページ用テンプレート…のはずだがまったく機能しているように見えない。</dd>
				<dt>rss2.php</dt>
				<dd>RSS2用テンプレート。</dd>
				<dt>style-rtl.css</dt>
				<dd>サブcss。デフォルトテーマのひとつKakumei-blueでも利用されているようだ。</dd>
				</dl>
				<p>さらに、デフォルトテーマにはないが以下のファイルを自分で作ればテ－マファイルの一部と認識してくれるようだ。</p>
				<dl>
				<dt>functions.php</dt>
				<dd>wordpressと同じ、テーマで使用する関数を書いておくものだろう。</dd>
				</dl>
				<p>見てのとおり、bbpressはwordpressよりテンプレート数が膨大なのが結構大変だったりする。<br />
				先のwordpressのテンプレートタグを使える方法をとったなら、header.php等共通化できる部分はしてしまったほうが作業量が減るケースがあるかもしれない。<br />
				ただしwordpress本体のアップグレードによるなんらかの変更でbbpressとの統合が解けてしまう可能性もある、wordpressをアップデートしていく意思があるなら極力テンプレートは別にしておき、wordpressのテンプレートタグを利用するのは最小限にしたほうが被害は少ないだろう。<br />
				また、テーマフォルダにない場合デフォルトのテーマから流用するので、流用されても問題のないものは製作必須ではない。（rss2.phpやstyle-rtl.cssは多くの場合いじる必要がないだろう）</p>
				<h3>テンプレートタグ</h3>
				<p>bbpressのテンプレートタグがまとまっているサイトを俺は知らないけれど、多くのテンプレートタグは/bb-includes/functions.bb-template.phpにまとまっているので、デフォルトテーマの中身とつき合わせていけば大体把握できる。（もちろんある程度phpはわからないとだめだけど）</p>
				<p>注意するべきはループのまわし方やConditional Tagの違いかなぁ。</p>
				<h2>wordpressとの統合やbbpressの設定の調整</h2>
				<h3>bbpressのパーマリンクの変更</h3>
				<p>bbpressの管理画面でパーマリンク設定を変更してもリンクが修正されず、wordpressの404画面に飛ばされる。<br />
				bbpressではwordpressのように自動で.htaccessを作成してくれないからのようだ。<br />
				この場合管理画面のパーマリンク設定部分の下の説明にある<strong>provided here</strong>というテキストリンクから表示されるテキストを<strong>.htaccess</strong>という名前で保存し、bbpressのディレクトリにアップロードすればOK。</p>
				<h3>リダイレクト</h3>
				<p>ログインしてない場合のリダイレクト</p>
				<p>bbpressのテーマのほうにfunctions.phpをつくり以下の内容を書く。</p>
				<pre><code class="prettyprint">&lt;?php

if ( !bb_is_user_logged_in() ) auth_redirect();

?&gt;</code></pre>
				<p>bbpressにはフィルターフックやアクションフックが提供されていないのでどうしたもんかなと思っていたが、functions.phpは他のテンプレートより先に読み込まれて実行されるので、関数でラップしなければ普通に実行してくれるようだ。<br />
				リダイレクト関数を利用してるんで、普通にリダイレクトする時と同じく出力が先にくるとエラーが出そうだから（試してない）functions.phpの最初に書くほうがいいかも。</p>
				<h3>日本語リソースの引用修正</h3>
				<p>既に少し触れたが、wordpressとの完全な統合のためにbb-config.phpでwp-blog-header.phpを読み込んでいると、bbpressの日本語リソースの参照先が変わってしまうので、bbpressの大部分の箇所が英語に戻ってしまっているはずだ。<br />
				一部日本語に翻訳されたままの部分もあるが、これはworpdressと共通の語句が翻訳されているだけにすぎない。<br />
				つまり、この時bbpressはwordpressの日本語リソースを読んでいる事になる。<br />
				これへの対処方法はbb-config.phpの<strong>wordpressのwp-blog-header.phpを読み込む処理の後でload_textdomain関数を実行する。</strong></p>
				<pre><code class="prettyprint">/* wordpressとの統合 */
require_once(&apos;wordpressまでのフルパス/wp-blog-header.php&apos;);

/* bbpressの日本語リソース読み込み */
load_textdomain(&apos;default&apos;, &apos;bbpressまでのフルパス/my-languages/ja.mo&apos;);</code></pre>
				<p>この二つをbb-config.phpの一番最後の部分に追加してやれば、<em>wordpressのテンプレートタグが使えて日本語化されているbbpress</em>が完成する。</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/tipstomake_communitysite6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpressで非公開コミュニティサイトを作る（5） bbpress1.0αのインストール</title>
		<link>http://weblog.atl-r.net/blog/tipstomake_communitysite5/</link>
		<comments>http://weblog.atl-r.net/blog/tipstomake_communitysite5/#comments</comments>
		<pubDate>Sat, 02 May 2009 07:52:03 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[bbpress]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2321</guid>
		<description><![CDATA[				
				wordpressとの連携を考えてbbpressの導入、実際にwordpressと連携させる手順とかもろもろをやってみる。
				
				今回はやはりフォーラム・BBSの類はどうしても欲しくなるので [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/01/090109-01.png" alt="wordpress!" title="wordpress!" width="345" height="85" class="alignnone size-full wp-image-221" /></p>
				<p>wordpressとの連携を考えてbbpressの導入、実際にwordpressと連携させる手順とかもろもろをやってみる。</p>
				<p><span id="more-2321"></span></p>
				<p>今回はやはりフォーラム・BBSの類はどうしても欲しくなるので、折角だからbbpressを試してみる。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://bbpress.org/" width="16" height="16" alt="" /><a href="http://bbpress.org/" title="bbPress">bbPress</a></p>
				<p>wordpressの開発元が作った、wordpressに似たフォーラムの事、フォーラムってのはでっかい掲示板みたいなの。<br />
				2ちゃんで言うと、板＝フォーラム・スレッド＝トピック、みたいな。<br />
				このbbpress、数年前にいじった事があるのだが結構話題にはのぼるものの具体的な日本語での情報がろくにないのでかなり苦労した覚えがある。<br />
				そしてどうもその状況は未だ変わらず、検索しても簡単な紹介や、入れてみました、といった内容がほとんどで、しかも現在最新版である1.0-Alphaに関する言及はほぼ見かけない。<br />
				あーこれはキタな。<br />
				本来英語がろくに出来ない俺は適任ではないけど、ここはいっちょ頑張ってみるか＾＾</p>
				<h2>bbpressについて</h2>
				<p>bbpressは少しとっつきにくい。<br />
				おぼろげな記憶を手繰るに、bbpressのとっつきにくさの原因は以下にあると思う。</p>
				<ol>
				<li>少し古いwordpressをベースにしている</li>
				<li>wordpressとの連携が可能、なのだが何が連携されるのかよくわからない</li>
				<li>wordpressとの連携が可能、なのだがそれまでに幾多の設定が必要になる</li>
				<li>wordpressと似たような内容が違う語句で表現されている</li>
				<li>調べようにも情報が見つかりにくい</li>
				<li>根本的に“フォーラム”という形態にほとんどの人が不慣れ</li>
				</ol>
				<p>とりあえず現時点で分かるのは、連携されるのは主に<em>ログインとユーザー情報</em>に関する内容だと言う事だ。<br />
				wordpressでログインすると、bbpressでもログインされた事になり、bbpressでログアウトすると、wordpressでもログアウトした事になる、みたいな。<br />
				wordpressのほうはともかく、bbpressは基本的にログインして使うように作られているからだと思うが、wordpressでログインとか普段見る分には関係なくねー、っていう普通のblogの形態の場合は無理に連携しなくていいかもしれない。</p>
				<p>日本語化は既にされていて、日本語リソースも提供されているものの、現在最新版となる1.0Alpha版はまだない。<br />
				これはAlpha版だから本格的に取り掛かっていないだけかもしれない、有志でやっていただいてるんで気長に待つ。<br />
				とはいえ0.9.0.4版の日本語リソースでもかなりの部分が日本語化されるので、とりあえずこれでまかなえる。</p>
				<p>連携に関しては現時点での安定動作バージョンであろうversion 0.9.0.4は、最新のwordpressとcookieの形態が違うため連携がかなり難しかった覚えがある。（うろ覚えで適当な事言ってる可能性あり）<br />
				なので今wordpressとbbpressを連携して使いたい場合、日本語リソースが完全でないのを我慢してAlpha版を使うほうがいいかもしれない。（0.9.xのほうも地味にヴァージョンアップをしているので今なら0.9.xでも楽なのかな）</p>
				<p>wordpressとbbpressは親和性が高いものの、いくつもの用語に差異があり混乱する。<br />
				keymaster等の権限周りの呼称の違いが最初理解するのに時間がかかった覚えがある。<br />
				とはいえそもそもやってる事が違うので全て同じには出来ないのだが…。</p>
				<p>また、bbpressにはwordpressと非常に似た管理画面があるのだが、このデザインがwordpress2.5.ｘより前のデザインを踏襲しているため、なんとなく不安になるｗ<br />
				個人的にこの古い管理画面 + 完全に日本語化されてなく英語が混ざる各項目 + 情報源がほぼ公式forumのみ（当然英語）、という状況が印象として導入のハードルを上げているように感じている。<br />
				あとwinXP環境だとfont指定のせいか、出来悪い明朝体による日本語表示になる部分があるのが悲しい。</p>
				<p>ところでwordpressとの連携と聞いて一番期待するものは、実はログイン情報の共有なんかじゃなく、テンプレート等デザインやレイアウト要素の共有じゃないのだろうか。<br />
				ログインなんてのは基本blogを書いている本人のみの問題なので、自分が以前使った際も本当はテンプレート共有こそが一番期待するところだった。（今回はログインしないと見れないようなサイトをwordpressで構築するのが目的なんで別にいいんだけど）<br />
				ところがこれが案外大変だったような…今は変わったのかな。</p>
				<p>ちなみに俺が感じてるbbpressの良い所も書いておくと、forumとしては定番の<a href="http://www.phpbb.com/" title="phpBB • Creating Communities Worldwide">phpBB</a>ほどゴチャゴチャしてなく、けどそれなりの機能があり、テンプレートとかがwordpressの書式と似ている所だ。<br />
				つまりwordpressのテンプレートをある程度いじれる知識があれば、bbpressのデザイン変更もかなり自由に出来る。（wordpressのテーマとは別扱いだが）<br />
				forumレベルの機能のbbsをフルスクラッチするのは労力に見合わない、けれどありもののforumのデザインを変えるのは結構大変、なのでwordpressの知識を流用すればデザインが変更しやすいという一点においてのみでもbbpressは十分魅力的だったりする。</p>
				<p>て事でだいぶ久々にインスコからやっていってみる。</p>
				<h2>bbpressのインストール</h2>
				<p>wordpressと連携させるのを前提に、bbpressをインストールしていく。<br />
				導入環境は以下。</p>
				<dl>
				<dt>bbpressのバージョン</dt>
				<dd>1.0-Alpha-6</dd>
				<dt>wordpressのバージョン</dt>
				<dd>2.7.1</dd>
				<dt>phpのバージョン</dt>
				<dd>php4.4.x</dd>
				<dt>MySQLのバージョン</dt>
				<dd>5.0.51a</dd>
				</dl>
				<p>サーバは要はheteml仕様。<br />
				さらに既にwordpressはインストールしてあるものとして、そこにbbpressをどうインストールし連携させていくかを追っていく。<br />
				今回はwordpressをインストールしたディレクトリ直下にforumsというフォルダ作る。</p>
				<h3>1.下準備</h3>
				<p>必要になデータを用意する。</p>
				<p>bbpress本体（Alpha版は下のダウンロードから、zipでもgzでも中身は同じ）<br />
				<img src="http://favicon.hatena.ne.jp/?url=http://bbpress.org/download/" width="16" height="16" alt="" /><a href="http://bbpress.org/download/" title="bbPress » Download »">bbPress » Download »</a></p>
				<p>bbpress日本語リソース（moファイルだけでもいい気がしたけど一応両方）<br />
				<img src="http://favicon.hatena.ne.jp/?url=http://svn.automattic.com/bbpress-i18n/ja/tags/0.9.0.1/" width="16" height="16" alt="" /><a href="http://svn.automattic.com/bbpress-i18n/ja/tags/0.9.0.1/" title="Revision 397: /ja/tags/0.9.0.1">Revision 397: /ja/tags/0.9.0.1</a></p>
				<p>次にwordpressに秘密鍵（セキュリティ・キー）を設定しておく。<br />
				<cite><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://wpdocs.sourceforge.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86" /><a href="http://wpdocs.sourceforge.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86" title="wp-config.php の編集 - WordPress Codex 日本語版" class="topic">wp-config.php の編集 &#8211; WordPress Codex 日本語版</a></cite></p>
				<blockquote cite="http://wpdocs.sourceforge.jp/wp-config.php_%E3%81%AE%E7%B7%A8%E9%9B%86"><p>セキュリティ・キー とは、パスワードに無作為（ランダム）な要素を加えることによって、あなたのサイトへの不正アクセスや侵入・改竄を難しくする hashing salt です。</p></blockquote>
				<p>どうするかというと、WordPress.orgの秘密鍵サービスにアクセスし、自動で生成されたランダムな文字列のkeyを全てコピー。<br />
				wordpressをインストールしたディレクトリにある<strong>wp-config.php</strong>をダウンロードして開き、該当部分に上書きして保存、アップロードする。</p>
				<p><a href="http://api.wordpress.org/secret-key/1.1/" title="">WordPress.orgの秘密鍵サービス</a></p>
				<dl>
				<dt>wp-config.php</dt>
				<dd>以下の部分を上書きし書き換える。</dd>
				<dd>
				<pre><code class="prettyprint">define(&apos;AUTH_KEY&apos;, &apos;put your unique phrase here&apos;);
define(&apos;SECURE_AUTH_KEY&apos;, &apos;put your unique phrase here&apos;);
define(&apos;LOGGED_IN_KEY&apos;, &apos;put your unique phrase here&apos;);
define(&apos;NONCE_KEY&apos;, &apos;put your unique phrase here&apos;);</code></pre>
				</dd>
				</dl>
				<h3>2.インストールと日本語化</h3>
				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_02.png" alt="フォルダ階層" title="フォルダ階層" width="333" height="186" class="alignnone size-full wp-image-2344" /></p>
				<p>forumsフォルダを作成したらその中に解凍したbbpressのファイル一式をアップロードする。<br />
				次に日本語リソースファイルをアップロードするのだがここで注意がある。<br />
				<strong>現在多くのサイトで解説されている方法はversion 0.9.x用で、今回使う1.0Alpha版では日本語化されない</strong>ということだ。</p>
				<p>これまではforums/bb-includes/にlanguagesという名前でフォルダを作り、先ほどダウンロードした二つの日本語化リソースをアップロードすることで日本語化できた。<br />
				今回使う1.0Alphaではbbpressのrootディレクトリ、つまり今回は<strong>forumsフォルダ直下にmy-languagesというフォルダを作り、そこにリソースをアップロードする。</strong><br />
				この<em>my-languages</em>フォルダは0.9.xと同様に、自分で作らないと存在しない上、スペルミスすると動かないので注意。</p>
				<p><img src="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_03.png" alt="my-languages" title="my-languages" width="190" height="102" class="alignnone size-full wp-image-2345" /></p>
				<p>この後0.9.xだとbb-config.phpを作ってあれこれするのだが、1.0Alphaからか今では0.9.xも同様かは分からないが、手作業でbb-config.phpをいじる必要は無くなっている。（日本語化についてのみ）</p>
				<p>この状態でアップロードしたアドレスにアクセスすると、インストールのウィザードが表示される。<br />
				日本語化に成功していれば、言語を選択するプルダウンが表示されるはずだ。<br />
				ここでjaを選択してやればOK。</p>
				<p><img src="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_04.png" alt="ウィザードトップ" title="ウィザードトップ" width="590" height="375" class="alignnone size-full wp-image-2346" /></p>
				<p>ちなみに解説をしているサイトによっては日本語化のタイミングがもっと後になっているケースもあるが、今はこの段階でやっておくとインストールウィザードまで日本語化してくれるので本当にありがたい。</p>
				<h3>3.インストーラー　ステップ 1 &#8211; データベース設定</h3>
				<p class="img_R"><a href="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_05.png" rel="shadowbox[post-2321];player=img;"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_05-99x300.png" alt="step1" title="step1" width="99" height="300" class="alignnone size-medium wp-image-2347" /></a></p>
				<p>あとは基本インストーラーの指示に添って入力していけばいいだけだが、空欄でもいい箇所もあったりする、んだけどそれがどこかわかりにくかったりも。</p>
				<dl>
				<dt>Database name・Database user・Database password</dt>
				<dd>利用するデータベースの名前・ユーザー名・パスワードを入力する。wordpressとの統合を目指すならデータベースはwordpressと同じものがいいぽい。</dd>
				<dt>使用言語</dt>
				<dd>日本語化に成功していればここには既に<em>ja</em>が選択されているはずなので、そのままでOK。</dd>
				<dt>Show advanced settings</dt>
				<dd>より細かい設定項目を表示するかどうかのチェックボックス、チェックしよう。<q>99% of the time these settings will not have to be changed.</q>なんて説明が書いてあるけど、ウソじゃないのこれ。（99%変更する必要はないよ、みたいな事言ってる）</dd>
				<dt>Database host</dt>
				<dd>これwordpressのほうでも通常変えなくていいよ、とか書いてあるんだけど本当なのかな？俺はレンタルサーバーだし当然変更しないといけないんだけど、デフォルトの<q>localhost</q>のままでいい人って自宅サーバー持ってる人とかだけじゃないのかな？？それって一般的なんだろうか…。良く分からないけどとりあえず自分が利用しているサーバーの設定にあわせて必要なら入力。</dd>
				<dt>Database character set</dt>
				<dd>utf8になってると思うんでそのままで</dd>
				<dt>Database character collation</dt>
				<dd>これは設定してもしなくてもいいと思う。文字化け対策に<em>utf8_general_ci</em>を入れてもいいと思うけど、データベースのテーブルが全て無い状態で設定しないといけないぽいんで、既にこの設定無しでwordpressを使っている場合、結構面倒かもしれない。（wordpressのデータを一旦エクスポートしてデータベース初期化する必要があるから）この辺自信なし、俺の環境では設定しなくても問題なかった。</dd>
				<dt>bbPress &#8220;auth&#8221; cookie key・bbPress &#8220;secure auth&#8221; cookie key・bbPress &#8220;logged in&#8221; cookie key・bbPress &#8220;nonce&#8221; key </dt>
				<dd>ここは後で直接config.phpをいじるのでこの時点ではスルー。</dd>
				<dt>Table name prefix</dt>
				<dd>データベースのテーブルの接頭語、デフォルトのままでいい。</dd>
				</dl>
				<p>ここまで入力し、ステップ2へ</p>
				<h3>4.インストーラー　ステップ 2 &#8211; WordPress ブログとの統合</h3>
				<p class="img_R"><a href="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_06.png" rel="shadowbox[post-2321];player=img;"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_06-82x300.png" alt="step2" title="step2" width="82" height="300" class="alignnone size-medium wp-image-2348" /></a></p>
				<p>ここでwordpressとの統合の設定をする、ここで言う統合とはログイン情報とユーザーデータの統合にあたる。<br />
				wordpressと連携する気がない場合はステップ2自体を飛ばしていい。</p>
				<dl>
				<dt>Add integration settings</dt>
				<dd>wordpressと連携させたい場合はチェックする。チェックする事で以下に続く2つのチェックボックスが追加される。</dd>
				<dt>Add cookie integration settings</dt>
				<dd>wordpressとcookieの統合をする場合はチェックする。cookieを統合するとログイン情報を共有する事が出来るようになる。チェックする事で統合に関する設定項目が表示される。</dd>
				<dt>Add user database integration settings</dt>
				<dd>wordpressとユーザーデータを統合する場合はチェックする。チェックする事で統合に関する設定項目が表示される。</dd>
				</dl>
				<h4>cookieの統合項目</h4>
				<dl>
				<dt>WordPress address (URL) ・Blog address (URL) </dt>
				<dd>統合予定のwordpressの一般設定と同じ内容にする。これはなんとなくではなく、<strong>ちゃんとコピペして正確に同じ文字列を入力しよう。</strong></dd>
				<dt>WordPress &#8220;auth&#8221; cookie key</dt>
				<dd>wp-config.phpの上書きした部分の以下をコピペする。<br />
				<code>define(&apos;AUTH_KEY&apos;,&apos;ここをコピペする&apos;);</code></dd>
				<dt>WordPress &#8220;auth&#8221; cookie salt</dt>
				<dd>下の説明文中にある<q>this WordPress admin page</q>の箇所のリンク（wordpressのwp-admin/options.php）を開き、ここに表示される幾つかの項目の中から<em>auth_salt</em>の文字列をコピペ。</dd>
				<dt>WordPress &#8220;secure auth&#8221; cookie key</dt>
				<dd>wp-config.phpの上書きした部分の以下をコピペする。<br />
				<code>define(&apos;SECURE_AUTH_KEY&apos;,&apos;ここをコピペする&apos;);</code></dd>
				<dt>WordPress &#8220;secure auth&#8221; cookie salt</dt>
				<dd>何も入力せず空けたままでいいようだ。</dd>
				<dt>WordPress &#8220;logged in&#8221; cookie key</dt>
				<dd>wp-config.phpの上書きした部分の以下をコピペする。<br />
				<code>define(&apos;LOGGED_IN_KEY&apos;,&apos;ここをコピペする&apos;);</code></dd>
				<dt>WordPress &#8220;logged in&#8221; cookie salt </dt>
				<dd>先ほど開いたwordpressのオプション一覧画面（wordpressのwp-admin/options.php）を開き、ここに表示される幾つかの項目の中から<em>logged_in_salt</em>の文字列をコピペ。</dd>
				</dl>
				<h4>ユーザーデータの統合項目</h4>
				<dl>
				<dt>User database table prefix</dt>
				<dd>ユーザーデータがあるデータベースのテーブルに使われている接頭語、つまりwordpress側の接頭語にあたる。何も変更していないなら<em>wp_</em>のままでいい。</dd>
				<dt>Show advanced database settings</dt>
				<dd>wordpressとbbpressが別のデータベースを使う場合の設定を表示するかどうかのチェックボックス。今回は同じデータベースを使用するのでチェックは入れない。</dd>
				</dl>
				<p>ここまで設定したら右下にある<strong>Save Wordpress integration settings</strong>ボタンをクリックすればOK。</p>
				<h3>5.インストーラー　ステップ 3 &#8211; サイト設定</h3>
				<p class="img_R"><a href="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_07.png" rel="shadowbox[post-2321];player=img;"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_07-154x300.png" alt="step3" title="step3" width="154" height="300" class="alignnone size-medium wp-image-2349" /></a></p>
				<p>サイト…というかこのforumの設定になる。</p>
				<dl>
				<dt>Site name</dt>
				<dd>このbbpressの名前をつける。</dd>
				<dt>Site address (URL)</dt>
				<dd>このbbpressのアドレス</dd>
				<dt>&#8220;キーマスター&#8221; アカウント</dt>
				<dd>bbpress設置初期状態のキーマスターを決める。キーマスターとはwordpressで言う所のadministrator、つまり管理者権限にあたる。</dd>
				<dt>最初のフォーラム</dt>
				<dd>bbpressに最初に作られるフォーラム名。</dd>
				</dl>
				<p>設定したら設定は完了、あとはインストール開始するだけになる。<br />
				無事インストールが終わったら、wordpressのほうを一応ログアウトしてからbbpressにアクセスしてみよう。</p>
				<p>ここで注意してほしいのは、既に日本語化されていても<em>最初のフォーラムを日本語で入力してはいけない。</em><br />
				好奇心で一度日本語でやってみたら、インストール後bbpressにアクセス出来なくなってしまった！<br />
				やめろと言われるとやりたくなる人は、こうなった場合データベースのbb_が接頭語のテーブルを全て消し、再度アクセスしてインストールの手順を踏むといい。<br />
				既にbb-config.phpは生成されているため多少早くインストールしなおせるだろう。</p>
				<h3>6.権限の設定</h3>
				<p>次にwordpressでのユーザー権限とbbpressでの権限をどう対応させるかの設定を行う。<br />
				bbpressにログインしなおしたら、bbpressの管理画面（Admin）に入り、<em>設定 ＞ Wordpressとの統合</em>を表示。</p>
				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/05/p2321_08.png" alt="userRoleMap" title="userRoleMap" width="456" height="447" class="alignnone size-full wp-image-2343" /></p>
				<p>日本語化されていないが、たいしてむずかしい事をするわけじゃないので問題ない。<br />
				<em>User Role Map</em>にwordpressのデフォの権限が並んでいて、それぞれにbbpressのどの権限を対応させるかをプルダウンから選択する形になる。</p>
				<p>wordpressの日本語の権限との対応は以下の通り。（たぶん）</p>
				<dl>
				<dt>WordPress Administrator</dt>
				<dd>管理者</dd>
				<dt>WordPress Editor</dt>
				<dd>編集者</dd>
				<dt>WordPress Author</dt>
				<dd>作成者</dd>
				<dt>WordPress Contributor</dt>
				<dd>投稿者</dd>
				<dt>WordPress Subscriber</dt>
				<dd>購読者</dd>
				</dl>
				<p>例えば恐らく自分のwordpress上での権限である管理者をbbpressの管理者に相当する<strong>Key Master</strong>に対応させるには、WordPress Administratorのプルダウンを<em>bbPress Key Master</em>にしてあげればいい。<br />
				それぞれ設定したら下にある<strong>Save User Role Map</strong>ボタンを押せば保存される。<br />
				これでwordpressとbbpressの権限をリンクさせた事になる。</p>
				<h3>7.wordpress plugin“bbPress Integration&#8221;の導入</h3>
				<p>さて、自分のアカウントを無事Key Masterに設定し、ログインしなおしてみると…bbpressの管理画面に入れなくなっている！（wordpressの管理画面には入れる）<br />
				実はこれ、0.9.xの頃から事あるごとに起きる問題だったのだが（俺限定）、1.0Alphaにはこれを解決する専用のpluginがあるようだ。</p>
				<p><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://wordpress.org/extend/plugins/bbpress-integration/" /><a href="http://wordpress.org/extend/plugins/bbpress-integration/" title="WordPress › bbPress Integration « WordPress Plugins" class="topic">WordPress › bbPress Integration « WordPress Plugins</a><br />
				ちなみにこれはwordpressのほうのplugin。</p>
				<p>これを有効化するとwordpressの管理画面の“設定”に<strong>bbPress Integration</strong>が追加されるので、ここで設定をしていく。<br />
				といってもむずかしくはない。</p>
				<ol>
				<li><em>bbPress URL</em>にbbpressのURLを入力しSave Changesボタンを押す。（“Your plugins URL”は空でいい）</li>
				<li><em>Manual Cookie Settings</em>の下にあるテキストフォームの中身をコピー</li>
				<li>wordpressログアウト</li>
				<li>wordpressのwp-config.phpをダウンロード</li>
				<li>言語設定の下辺りに先ほどコピーしたコードをペースト</li>
				<li>wordpressのwp-config.phpをアップロード</li>
				</ol>
				<p>これでbbpressの管理画面にも入れるようになるはずだ。<br />
				そもそもこんなpluginが必要なのも困り物だが、いずれ改善される…んじゃないかな。<br />
				長らく問題になってる部分だから、もうしばらくはこのpluginのお世話になる予感もするけど。</p>
				<h2>参考資料</h2>
				<p>今回の記事は以下のトピックに上がっているスクリーンキャストを元に、日本語化の工程を加えてやってみた。<br />
				数年前の初めてbbpressに触れた当時も、forumでは散々wordpressの統合の話ばかりが質問されていて、恐らくもういい加減にせいよ！という事で動画提供したんじゃないかな。（邪推）</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://bbpress.org/forums/topic/basic-integration-screencast#post-21911" width="16" height="16" alt="" /><a href="http://bbpress.org/forums/topic/basic-integration-screencast#post-21911" title="Basic integration screencast « bbPress Support Forums">Basic integration screencast « bbPress Support Forums</a></p>
				<p>英語がわからんので何を喋っているのか把握出来てないけど、一番肝となるcookie関連について喋ってそうなので理解出来ないのが歯がゆい。<br />
				まぁこうやって工程くらいは把握できるんだけど。</p>
				<p>余談だけど、どうせ統合できる作りにするならwordpressの管理画面でbbpressの設定とかも出来るようにしてほしいなーとやってて思った。<br />
				確かそんなpluginもあった気がするが…あの当時何もかもがバギーな印象で、そんなチャレンジブルなpluginは入れなかったと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/tipstomake_communitysite5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>wordpressで非公開コミュニティサイトを作る（4）feedのカスタマイズ</title>
		<link>http://weblog.atl-r.net/blog/tipstomake_communitysite4/</link>
		<comments>http://weblog.atl-r.net/blog/tipstomake_communitysite4/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 06:39:44 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2307</guid>
		<description><![CDATA[				
				前回保留にした、アクセス制限した状態でのfeedをどうするかという問題を考えていく。
				
				前回、ログイン確認にfunctions.phpからアクションフックを利用してリダイレクトする方法に [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/01/090109-01.png" alt="wordpress!" title="wordpress!" width="345" height="85" class="alignnone size-full wp-image-221" /></p>
				<p>前回保留にした、アクセス制限した状態でのfeedをどうするかという問題を考えていく。</p>
				<p><span id="more-2307"></span></p>
				<p>前回、ログイン確認にfunctions.phpからアクションフックを利用してリダイレクトする方法に変更し、そのおかげでfeedも認証が必要になった。<br />
				ところがwordpressの認証にはcookieを利用している事から、cookieを判別出来ないfeed readerではアクセス出来ない問題が残ったので、これについて考えて見る。</p>
				<p>参考：<img src="http://favicon.hatena.ne.jp/?url=http://weblog.atl-r.net/blog/tipstomake_communitysite3/" width="16" height="16" alt="" /><a href="http://weblog.atl-r.net/blog/tipstomake_communitysite3/" title="wordpressで非公開コミュニティサイトを作る（3）続・ユーザーレベルで表示内容を変更 - atl*weblog">wordpressで非公開コミュニティサイトを作る（3）続・ユーザーレベルで表示内容を変更 &#8211; atl*weblog</a></p>
				<h2>feedはどんな風に利用されるか</h2>
				<p>クローズドなサイトを作るのが今回の目的なので、通常のblogのように全文配信したりといった、feed自体の質にはそこまでこだわる必要はないかなと思っている。（特に根拠がないどころか、質がいいに決まってるんだけど）<br />
				ログインする、という手間がかかるので更新されたかどうかの通知は必須になる。<br />
				なのでfeedは必要であるものの、配信される内容はぶっちゃけタイトルだけでもいい。<br />
				コメントのやり取りも想定される事から、出きれば本文とコメント等を纏めて一つのfeedとして配信出来るといいんだけど…、これは無理にやらずに他のfeed纏めるサービス使ったほういいのかなぁ。<br />
				けどfeedの配信タイミングが遅れそうな気もするなー。</p>
				<h2>feedテンプレートってどこにあるの？</h2>
				<p>feedで吐き出すxmlをカスタムしてしまえば、本文のみ隠したりも出来るし、ひょっとしたらwordpressの関数使ってcookie見てのログイン判別も出来るかもしれない。<br />
				なんて淡い期待を込めつつやり方を探すも、どうもfeed用のテンプレートはコアファイルにしか存在しないらしい。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://codex.wordpress.org/Customizing_Feeds" width="16" height="16" alt="" /><a href="http://codex.wordpress.org/Customizing_Feeds" title="Customizing Feeds « WordPress Codex">Customizing Feeds « WordPress Codex</a></p>
				<p>ここにfeedのカスタム方法が載っているけど、ここに記載されているwp-rss2.phpだとかwp-atom.phpと同名のファイルでも作ってテーマフォルダにでも置けばテンプレートみたいになるかな、なんて淡い期待を持って無駄な時間をすごしたり。<br />
				今現在のwordpress（2.7.x）ではwp-includes内にあるfeed-atom.php、feed-atom-comments.php、feed-rdf.php、feed-rss2.php、feed-rss2-comments.phpとかがテンプレートにあたるようだ。<br />
				中身を見るとテンプレートファイルと同様に、様々なfeed用テンプレートタグを利用してfeedの雛形が作られている。</p>
				<p>コアファイルを編集する事に抵抗が無いならこれをいじれば簡単に目的達成となるだろう、やり方もテーマの修正と同様なので特にむずかしくもない。<br />
				ただ上記の通り、ヴァージョンアップで変わってしまう可能性があるコアファイルのため、俺はこの方法はちょっと避けたい。</p>
				<h2>feedのカスタマイズの下準備</h2>
				<p>まずfeedへのアクセスに認証をしないで出来るようにする。</p>
				<h3>認証周りの処理変更</h3>
				<p>前回<code>send_headers</code>フックでログイン判別とリダイレクトをさせていて、これでfeed見るにも認証が必要になるぜわっしょいしてたが、ログイン判別にcookieが必要な以上通常のFeedReaderで読めなくなってしまう。<br />
				というか薄々気づいていたのだが、どうにも対処方法がわからず、それならば吐き出すfeed自体をどうにかしたほうが現実的という事でこれは一度戻す事に。<br />
				とはいえまたheader.phpに直接書くのも芸がないので<code>get_header</code>フックで以下のようにfunctions.phpにリダイレクト処理を書いた。</p>
				<pre><code class="prettyprint">function op_auth() {
	if ( !is_user_logged_in() ) auth_redirect();
}
add_action('get_header', 'op_auth');</code></pre>
				<p>このアクションフックはheader.phpが読み込まれる際に動くらしいので、header.phpの最初に記述したのとほぼ同様の効果を得られる。<br />
				処理も別の場所に分離できていい感じ。</p>
				<h3>デフォルトのフィルターをリムーブ→再設定し、feedテンプレートを置き換える</h3>
				<p>さて、feedをあれこれするのに何かいいフックないかなーと探し幾つかそれっぽいものを見つけたものの、結局何が出来るかどうかすらわからなかった。<br />
				日本のcodexはまだ未翻訳、本家のcodexには記事がない。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://codex.wordpress.org/Plugin_API/Action_Reference/atom_entry" width="16" height="16" alt="" /><a href="http://codex.wordpress.org/Plugin_API/Action_Reference/atom_entry" title="Plugin API/Action Reference/atom entry « WordPress Codex">Plugin API/Action Reference/atom entry « WordPress Codex</a></p>
				<p>こりゃ別の方法かなー、と思って半ば諦めていたらtwitterでアドバイスを頂いた！</p>
				<p><cite><img src="http://favicon.hatena.ne.jp/?url=http://twitter.com/wokamoto/status/1634305789" width="16" height="16" alt="" /><a href="http://twitter.com/wokamoto/status/1634305789">Twitter / wokamoto: @darumen default_filter とし &#8230;</a></cite></p>
				<blockquote cite="http://twitter.com/wokamoto/status/1634305789"><p>@darumen default_filter として do_feed_rss, do_feed_rss2, &#8230; ってフィルタをフックして、ロードするテンプレートを指定しているので、これらをリムーブ後、新たにフィルタを add すれば、好きなテンプレートをロードできます。</p></blockquote>
				<p>しかもサンプルコードまで書いてもらってしまった…！<br />
				（共有メモサービスでコード提示してもらったけど、一応そっちのアドレスは伏せ）</p>
				<pre><code class="prettyprint">// フィルタリムーブ
remove_filter(&apos;do_feed_rdf&apos;, &apos;do_feed_rdf&apos;, 10);
remove_filter(&apos;do_feed_rss&apos;, &apos;do_feed_rss&apos;, 10);
remove_filter(&apos;do_feed_rss2&apos;, &apos;do_feed_rss2&apos;, 10);
remove_filter(&apos;do_feed_atom&apos;, &apos;do_feed_atom&apos;, 10);

// フィルタ追加
function custom_feed_rdf() {
  load_template( get_template_directory() . &apos;/feed-rdf.php&apos; );
}
add_action(&apos;do_feed_rdf&apos;, &apos;custom_feed_rdf&apos;, 10, 1);

function custom_feed_rss() {
  load_template( get_template_directory() . &apos;/feed-rss.php&apos; );
}
add_action(&apos;do_feed_rss&apos;, &apos;custom_feed_rss&apos;, 10, 1);

function custom_feed_rss2( $for_comments ) {
  if ( $for_comments )
    load_template( get_template_directory() . &apos;/feed-rss2-comments.php&apos; );
  else
    load_template( get_template_directory() . &apos;/feed-rss2.php&apos; );
}
add_action(&apos;do_feed_rss2&apos;, &apos;custom_feed_rss2&apos;, 10, 1);

function custom_feed_atom( $for_comments ) {
  if ($for_comments)
    load_template( get_template_directory() . &apos;/feed-atom-comments.php&apos;);
  else
    load_template( get_template_directory() . &apos;/feed-atom.php&apos; );
}
add_action(&apos;do_feed_atom&apos;, &apos;custom_feed_atom&apos;, 10, 1);</code></pre>
				<p><a href="http://dogmap.jp/" title="dogmap.jp">をかもとさん</a>ありがとうございます！（2日ほどハマってました）</p>
				<h3>コードの検証</h3>
				<p>動作確認も出来たのですぐにでも使えてしまうレベルのコードだけど、折角なのでどういう事をしているのか調べて見る。<br />
				feedが表示される際、アクセスされたfeedの種類によってdo_feed_～～というフックが動いて何かするんで、それをremove_filterで無しにした後、新たにそれぞれにadd_actionで処理を再設定している。<br />
				処理自体はテーマフォルダ内の同名テンプレートを取得する事によって、本来コアファイルに含まれるfeed用テンプレートをテーマフォルダ内にある自作テンプレートに置き換えている。<br />
				rss2とatomはコメントのfeedのケースもあるんで、引数で渡された$for_commensの真偽でどちら用のテンプレートを使うかを判別している。<br />
				…のかな、たぶん。</p>
				<p>分からないのは、remove_filterで指定してるフックと関数名が同じだけど、どういう事だろうって点と、こういう事をする場合関数ってどうやって調べるんだろう、という二点。 </p>
				<p>まずremove_filterで指定してるフック、do_feed_～～だがこんな感じのもの。<br />
				<cite><img src="http://favicon.hatena.ne.jp/?url=http://wpdocs.sourceforge.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7" width="16" height="16" alt="" /><a href="http://wpdocs.sourceforge.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7">プラグイン API/アクションフック一覧 &#8211; WordPress Codex 日本語版</a></cite></p>
				<blockquote cite="http://wpdocs.sourceforge.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7"><p>do_feed_フィード名 <br />
				 アクション関数引数: フィードの種類（コメントフィードならtrue、投稿記事フィードならfalse） <br />
				 RSS2、Atom、RDFなどのフィードが生成される直前に実行する。フィード名には rss2、atom などフィードの種類を入れる。</p></blockquote>
				<p>feedが生成される直前に実行されるってのはあってるようだ。</p>
				<p>で関数のほうはwp-includes/functions.phpの1481行からあった！</p>
				<pre><code class="prettyprint">/**
 * Load the RDF RSS 0.91 Feed template.
 *
 * @since 2.1.0
 */
function do_feed_rdf() {
  load_template( ABSPATH . WPINC . &apos;/feed-rdf.php&apos; );
}

/**
 * Load the RSS 1.0 Feed Template
 *
 * @since 2.1.0
 */
function do_feed_rss() {
  load_template( ABSPATH . WPINC . &apos;/feed-rss.php&apos; );
}

/**
 * Load either the RSS2 comment feed or the RSS2 posts feed.
 *
 * @since 2.1.0
 *
 * @param bool $for_comments True for the comment feed, false for normal feed.
 */
function do_feed_rss2( $for_comments ) {
  if ( $for_comments )
    load_template( ABSPATH . WPINC . &apos;/feed-rss2-comments.php&apos; );
  else
    load_template( ABSPATH . WPINC . &apos;/feed-rss2.php&apos; );
}

/**
 * Load either Atom comment feed or Atom posts feed.
 *
 * @since 2.1.0
 *
 * @param bool $for_comments True for the comment feed, false for normal feed.
 */
function do_feed_atom( $for_comments ) {
  if ($for_comments)
    load_template( ABSPATH . WPINC . &apos;/feed-atom-comments.php&apos;);
  else
    load_template( ABSPATH . WPINC . &apos;/feed-atom.php&apos; );
}</code></pre>
				<p>結論：単にフックと同名の関数があるだけだった。</p>
				<p>そしての調べ方だが、恐らくケースによるのだろうけれど、をかもとさんのアドバイスによると<q>default_filter として～～</q>というくだりがあるので、とりあえずwp-includes/default_filters.phpを見てみたりして、目的のフックで実行されている関数があればwp-includes/functions.phpで探せばいいのかな。</p>
				<p>ちなみにこの場合Codexは本家のほうをしっかり読み込んでれば大丈夫だと思うんだけど、俺のように怠けて辞書代わりに使ってる場合本家codexにも記述のない項目が結構あるので見つからなかったりする。</p>
				<h2>feedテンプレートのカスタマイズ</h2>
				<p>という事でアドバイスもあって見事にテーマフォルダにfeed用テンプレートファイルを持つ事が出来るようになった。<br />
				wp-includesディレクトリ下にある各種テンプレートファイルを利用中のテーマフォルダにコピーし、これを改良していく。</p>
				<h3>認証は無理だった</h3>
				<p>まず認証についてだが、案の定判別はむずかしいようだ。<br />
				利用するFeedReader次第ではあるのだが、やはり別の方法で情報隠蔽を考えたほうがいいみたい。<br />
				また、ユーザーレベルでの振り分けもどうやら無理なようだ、普通にブラウザでfeedを表示する場合には適用されるケースもあるのだが、やはりFeedReaderで見ると全てユーザーレベル0での挙動しかしないので、振り分ける意味はあまりなかった。</p>
				<h3>本文をrssに表示させない</h3>
				<p>本来概要くらいは表示させておいてもいいのだが、利用者と想定している層が<code>&lt;!--more--&gt;</code>すら使ってくれなそうなので、タイトルとメタ情報のみの配信にしておきたい。<br />
				なのでfeed用テンプレートの本文部分を無くしておく。<br />
				さらにデフォではコメントへのリンクもあるのでこれもはずしておく。</p>
				<p>feed-rss2.phpのコメント部分は以下。</p>
				<pre><code class="prettyprint">&lt;comments&gt;&lt;?php comments_link(); ?&gt;&lt;/comments&gt;</code></pre>
<p>feed-rss2.phpの本文部分は以下。</p>
<pre><code class="prettyprint">&lt;?php if (get_option(&apos;rss_use_excerpt&apos;)) : ?&gt;
		&lt;description&gt;&lt;![CDATA[&lt;?php the_excerpt_rss() ?&gt;]]&gt;&lt;/description&gt;
&lt;?php else : ?&gt;
		&lt;description&gt;&lt;![CDATA[&lt;?php the_excerpt_rss() ?&gt;]]&gt;&lt;/description&gt;
	&lt;?php if ( strlen( $post-&gt;post_content ) &gt; 0 ) : ?&gt;
		&lt;content:encoded&gt;&lt;![CDATA[&lt;?php the_content() ?&gt;]]&gt;&lt;/content:encoded&gt;
	&lt;?php else : ?&gt;
		&lt;content:encoded&gt;&lt;![CDATA[&lt;?php the_excerpt_rss() ?&gt;]]&gt;&lt;/content:encoded&gt;
	&lt;?php endif; ?&gt;
&lt;?php endif; ?&gt;</code></pre>
				<p>これらを削除すればいい。他のatomとか別のfeedも似たような感じなので同様に。</p>
				<h2>結局のところ…</h2>
				<p>思いもかけないアドバイスもいただき凄く勉強になったものの、今回の目的からすればfeedをテンプレートとして持つほどの修正は必要なかった感じがする。<br />
				というのも前回やった<code>the_content</code>フィルターフックによる記事本文、そして<code>comment_text</code>フィルターフックによるコメント文の差し替えはfeedにも効いているからだ。<br />
				なので、体験用メンバーの権限のユーザーレベルを0から1に引き上げてやり、feedからの閲覧は自動的にユーザーレベル0扱いにする事によって、全ての記事の本文・コメント文を非表示ないし文言置き換えをする事が可能だからだ。<br />
				ただちょっと面倒そうなのでスルーしたが、feedテンプレートを持つ事が出来たおかげで今後頑張れば本文とコメント両方の更新を一つのfeedで受信できるようにカスタムしたり、その場合はコメント用feedは一本化したほうのfeedにリダイレクトしたり、といった事が出来るかなーと思えるようになった。</p>
				<p>しかし不安なのは、適当にfeedから本文部分を削除したけど、正しいRSS構文とかそういった観点から見るとどうなんだろう？<br />
				今まで直接xmlをいじる機会がなかったけど、そのうちこれも勉強しないと＞＜</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/tipstomake_communitysite4/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>wordpressで非公開コミュニティサイトを作る（3）続・ユーザーレベルで表示内容を変更</title>
		<link>http://weblog.atl-r.net/blog/tipstomake_communitysite3/</link>
		<comments>http://weblog.atl-r.net/blog/tipstomake_communitysite3/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 06:50:32 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2195</guid>
		<description><![CDATA[				
				前回ユーザーレベルでの振り分けをpluginとphpやwordpressAPIを使い分けて行う方法を模索したが、pluginが古いせいもあり挙動が不安定なので、やはり全てを自力で行う方法を考えていく。
 [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/01/090109-01.png" alt="wordpress!" title="wordpress!" width="345" height="85" class="alignnone size-full wp-image-221" /></p>
				<p>前回ユーザーレベルでの振り分けをpluginとphpやwordpressAPIを使い分けて行う方法を模索したが、pluginが古いせいもあり挙動が不安定なので、やはり全てを自力で行う方法を考えていく。</p>
				<p><span id="more-2195"></span></p>
				<p>と言うわけでどうすればplugin無しで出来るか考えていく。<br />
				ここまでのやり方で全部代替出来るんじゃねーかなぁという感触があり、pluginが行っている閲覧制限機能を1つづつ代替出来るか試してみる。</p>
				<p>pluginが行っているのは表面的には以下の内容。</p>
				<ul>
				<li>閲覧権限がないカテゴリーの記事自体のタイトル・本文・コメント本文を非表示化、もしくはメッセージとして登録した文字列に置換</li>
				<li>各種ループで閲覧権限がないカテゴリーの記事のタイトル・本文・コメント本文を非表示化（トップページ・カテゴリーアーカイブ・最新の記事等）</li>
				<li>閲覧権限がないカテゴリーへのリンクを非表示化（カテゴリー一覧等）、ただしループ内に表示される記事のカテゴリー表示は非表示化されない</li>
				<li>Feedを各記事のタイトルと記事へのリンクのみに</li>
				</ul>
				<p>こんなかな。<br />
				なんかいけそ～な気がする～。<br />
				<strong>注：過程を追って書いてるんで、一度書いたコードが徐々に変わったりしてるんで注意＞＜</strong></p>
				<h3>前提条件</h3>
				<p>ユーザーレベル0の人にも表示していいカテゴリー名は『体験用』、カテゴリーIDは『3』。<br />
				閲覧制限したいのは主に本文、タイトルは別に出てても問題なし。<br />
				あとコメント本文も閲覧制限したい。<br />
				コメント非表示の場合は入力フォームもか。</p>
				<h3>記事自体の閲覧制限</h3>
				<p>閲覧OKのカテゴリー以外の記事（post）の本文を隠す。<br />
				やり方はテーマの中の<strong>functions.php</strong>に、テーマ内で利用するプログラムを含める事が出来るので、ここにその処理を作っていく。<br />
				テーマの柔軟性や保守性のため、出来る限り他のテンプレートであれこれせず、処理をfunctions.phpに集めるのがいいと思う。<br />
				wordpressは様々なフックのAPIが用意されているので、データベースからデータ取得→表示、の間に取得したデータを加工する処理をフィルターフックで割り込む形でやってみる。<br />
				pluginでもよく使われるこの方法だと、テンプレートのほうから関数呼び出しすら必要がなくなるので、綺麗に表示との分離が出来る。</p>
				<p>詳しい記述方法はググってもらうとして、フィルターのフックを使うにはこんな感じで書く。</p>
				<pre><code class="prettyprint">add_filter('the_content', 'op_hide_content');</code></pre>
<p><strong>add_filter</strong>でフィルタを設定する、1つ目の引数がフィルターフック名、2つ目がフックが起動した際に処理させる関数名。<br />
この場合<em>the_content</em>で記事本文が表示される際にフックが起動し、op_hide_content関数を実行する、となる。<br />
で、op_hide_content関数はこんな感じで書いてみた。</p>
<pre><code class="prettyprint">function op_hide_content( $content ) {
  global $user_level;
  if ( 0 == $user_level &amp;&amp; !in_category(3) ) {
    $content = &quot;&lt;p&gt;みせないよ&lt;/p&gt;&quot;;
    return $content;
  } else {
    return $content;
  }
}</code></pre>
				<p>引数の$contentはフックにあわせた内容だったりpost_IDだったりを渡せるようだ、このケースだと記事本文を取得できる。<br />
				前回の記事のユーザーレベル取得の方法でglobalから$user_levelを持ってくる。<br />
				さらに条件に<code>in_category()</code>を利用し、引数で指定したカテゴリーIDに表示中の記事が含まれているかを判別。</p>
				<p>注意点は、フックで呼び出す関数の引数は必ず1つ、ってのと必ず引数を返す、って点。<br />
				引数はオプションで数を変更できるが。</p>
				<p>これで無事本文を隠す事が出来るようになった。<br />
				記事自体を表示した時はもちろん、トップページ等で記事の概要のみ表示している場合でも、その部分は表示されないようにする事が出来た。</p>
				<h3>コメントの閲覧制限</h3>
				<p>コメントの非表示は記事本文非表示とフックが変わるだけでやる事はほぼ同じだ。<br />
				なので同じ関数で処理できるようにフィルタだけ追加してみる。</p>
				<pre><code class="prettyprint">function op_hide_content( $content ) {
  global $user_level;
  if ( 0 == $user_level &amp;&amp; !in_category(3) ) {
    $content = &quot;&lt;p&gt;みせないよ&lt;/p&gt;&quot;;
    return $content;
  } else {
    return $content;
  }
}

add_filter(&apos;the_content&apos;, &apos;op_hide_content&apos;);
add_filter(&apos;comment_text&apos;, &apos;op_hide_content&apos;);</code></pre>
				<p>最後の行に追加されているフィルターがコメント本文のフックだ。<br />
				どのフィルターから関数が呼び出されたかを判別する方法がわからないが、もし無いなら呼び出す関数を別にしないと置き換えメッセージを本文とコメントで別々に設定できないなぁ。<br />
				add_filterを使う前にあれこれしてあげればいいけど。</p>
				<p>とりあえずこれでコメントも隠す事ができた。<br />
				しかし記事もコメントも見れないのに、コメント入力フォームが表示されているのはスマートじゃない。<br />
				なのでコメント入力フォームも隠す方法を考える。</p>
				<h3>単一記事（post）の閲覧制限</h3>
				<p>アクションフックにcomment_formなるものも用意されてはいるものの、どうも動かない、というかこれであってるのかすらよくわからないのだが。<br />
				なんかテーマによっては動かないよって事なので、ここは仕方なくコメント部分のテンプレートをいじろうかなと思い立つ。</p>
				<p>けどよく考えてみると、記事単体を表示する際は本文とコメントとコメント入力フォームを隠すわけだから、単一記事の投稿テンプレートをいじってまとめて隠したほうがいいな。<br />
				さっきのフィルターで本文は隠れるようになっているので機能重複するけど、あれはトップページとかでも使えたりするんでまぁいいか。<br />
				というわけで記事単体のテンプレートを修正する。</p>
				<p>今回俺のケースだとタイトルは別に表示してもかまわないので、使用してるテーマにもよるが、本文呼び出しのテンプレートタグ（the_content()）やコメントテンプレート呼び出しタグ（comments_template()）をラップしてるblock要素を丸ごとを、分岐で変更させる。</p>
				<pre><code class="prettyprint">//single.php ヘッダー部分省略
  &lt;h1&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;
&lt;?php

global $user_level; //ユーザーレベル取得
if ( 0 == $user_level &amp;&amp; !in_category(3) ) { //体験中のユーザーで、かつ閲覧制限のかかったカテゴリーの場合

?&gt;
  &lt;div class=&quot;entry&quot;&gt;
    &lt;div class=&quot;textBody&quot;&gt;&lt;p&gt;だめー&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;!--end entry--&gt;
&lt;?php

} else {//通常表示する場合

?&gt;
  &lt;div class=&quot;entry&quot;&gt;
    &lt;div class=&quot;textBody&quot;&gt;&lt;?php the_content(); ?&gt;&lt;/div&gt;//本文呼び出し
    &lt;?php comments_template(); ?&gt; //comments.php呼び出し
  &lt;/div&gt;&lt;!--end entry--&gt;
&lt;?php

}

?&gt;
//single.php フッター部分省略</code></pre>
				<p>これでおｋ。<br />
				閲覧できない場合のメッセージや表示はもっと細かく書くなり、functions.phpのほうにおいたりも可能だが、書き出された際のhtmlに矛盾が無いようにする点だけ注意。</p>
				<p>しかしこれ、functions.phpのように関数だけ集めてあるならともかく、テンプレートを直接いじってるのでカテゴリーIDを生で入れてるのが気になる。どう考えても変更の際面倒な事になる。<br />
				なので指定カテゴリーIDをfunctions.phpに格納し利用したいなー、と思い定数にでもするかと思ったが、カテゴリーが複数ある場合困るなぁ。<br />
				定数じゃ配列入れれないし、そもそも複数ある場合はカテゴリーIDだけひっぱってきても分岐部分の書き換えが必要になってしまう。<br />
				なのでfunctions.phpのほうでその辺を判別する処理を、グローバル変数を置くのも気が引けるんでもろもろclass化したり色々書き換え。</p>
				<dl>
				<dt>functions.php</dt>
				<dd>
				<pre><code class="prettyprint">//非表示カテゴリーに関連するクラス
class DivergenceView {
  var $hide_cat = array(3); //表示OKなカテゴリーIDの配列
  var $hide_mess = &quot;&lt;p&gt;この内容は今の権限では見れません！&lt;p&gt;&quot;; //非表示化した際置き換える文字列
  function lv() { //ユーザーレベルの確認結果を格納する
    global $user_level;
    return ( 0 != $user_level )?true:false;
  }
  function in_cat() { //現在表示中の場所が除外カテゴリーかをチェックし、非表示にする必要がないならtrueを返す
    if ( $this-&gt;lv() ) return true; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせずtrue返す
    foreach ( $this-&gt;hide_cat as $k =&gt; $v ) {
      if ( in_category( $v ) ) return true;
    }
    return false;
  }
}

//コンテンツの非表示化
function op_hide_content( $content ) {
  $DView = new DivergenceView();
  if ( !$DView-&gt;in_cat() ) $content = $DView-&gt;hide_mess;
  return $content;
}
add_filter(&apos;the_content&apos;, &apos;op_hide_content&apos;);
add_filter(&apos;comment_text&apos;, &apos;op_hide_content&apos;);</code></pre>
				</dd>
				<dt>single.php（逆にした）</dt>
				<dd>
				<pre><code class="prettyprint">//single.php ヘッダー部分省略
  &lt;h1&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;
&lt;?php

$DView = new DivergenceView(); //オブジェクト生成
if ( $DView-&gt;in_cat() ) { //体験中のユーザーではない、もしくは閲覧制限のかかっていないカテゴリーの場合
  &lt;div class=&quot;entry&quot;&gt;
    &lt;div class=&quot;textBody&quot;&gt;&lt;?php the_content(); ?&gt;&lt;/div&gt;//本文呼び出し
    &lt;?php comments_template(); ?&gt; //comments.php呼び出し
  &lt;/div&gt;&lt;!--end entry--&gt;
?&gt;

&lt;?php

} else {//通常表示する場合

?&gt;
  &lt;div class=&quot;entry&quot;&gt;
    &lt;div class=&quot;textBody&quot;&gt;&lt;?php echo $DView-&gt;hide_mess; ?&gt;&lt;/div&gt; //class内にある置換メッセージ表示
  &lt;/div&gt;&lt;!--end entry--&gt;
&lt;?php

}

?&gt;</code></pre>
				</dd>
				</dl>
				<p>本当はフィルターで呼び出す関数もメソッド化したかったが、add_filterからメソッドを呼ぶ方法が分からなかったのでそのままに。</p>
				<h3>ページ（page）の閲覧制限</h3>
				<p>テンプレート自体は記事（post）と似たようなものなため基本的なやり方は同様だが、ページの場合はカテゴリーがないので別の判別方法が必要になる。<br />
				ページにもカテゴリーをつけるpluginとか昔あった気がするが、経験上こういうトリッキーな代物は後々大変になったりするんで、今回は素直にカスタムフィールドを利用する。</p>
				<p>カスタムフィールドに、名前を“provisional”、値にtrueを入力し追加しておく。（勿論名前は英数字なら何でもい）<br />
				ここでtrueを値にしたのは、今後カスタムフィールドの拡張pluginを利用する場合、チェックボックスのみで公開非公開を選べるといいなぁという淡い期待からである。<br />
				これをページ描画の際に取得して振り分けを行う。</p>
				<p>ページのテンプレートpage.phpの作りは、これもテーマによるが基本的に記事用のテンプレートと大差ないはずなので、ここでは条件の部分のみ。</p>
				<pre><code class="prettyprint">//page.php ヘッダー部分省略
&lt;h1&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;
&lt;?php
$cfv = get_post_custom_values(&quot;provisional&quot;);//カスタムフィールドの値取得
$cfv = $cfv[0];//配列なので代入しなおし
global $user_level; //ユーザーレベル取得
if ( !$cfv  &amp;&amp; 0 == $user_level ) {//体験中のユーザーで、カスタムフィールドがtrueを返す場合、制限表示
	$DView = new DivergenceView();
?&gt;
&lt;div class=&quot;entry&quot;&gt;
	&lt;div class=&quot;textBody&quot;&gt;
		&lt;p&gt;&lt;?php echo $DView-&gt;hide_mess; ?&gt;&lt;/p&gt;
	&lt;/div&gt;
&lt;/div&gt;&lt;!--end entry--&gt;
&lt;?php
} else {
?&gt;
&lt;div class=&quot;entry&quot;&gt;
	&lt;div class=&quot;textBody&quot;&gt;&lt;?php the_content(); ?&gt;&lt;/div&gt;
&lt;?php comments_template(); ?&gt;
&lt;/div&gt;&lt;!--end entry--&gt;
&lt;?php
}
?&gt;
//page.php フッター部分省略</code></pre>
				<p>カスタムフィールドの情報を取得するには<em>the_meta()</em>というテンプレートタグを利用すればいい、がこれそのまま使うとそのwordpressにあるカスタムフィールドをすべて、しかもご丁寧にリストで表示してくれちゃったりする。<br />
				これじゃ分岐には使えないので引数で取得する情報を指定する、出力じゃなく値で取得するにはいくつかの方法があるのだが、今回は今見てるページのカスタムフィールドが欲しいのでpost_IDを指定しなくて済む<strong>get_post_custom_values()</strong>を使う。<br />
				ここでは<code>get_post_custom_values("provisional")</code>の部分。<br />
				さらに返り値は配列なので、key0を代入しなおしている。</p>
				<p>さて、このままだと分岐がちゃんと行われるものの、先ほど作ったフィルターが全てのページの本文だけブロックしてしまう。ページはカテゴリーがないからね。<br />
				なのでフィルターに少し手を加える。</p>
				<pre><code class="prettyprint">function op_hide_content( $content ) {
  $DView = new DivergenceView();
  if ( !$DView-&gt;in_cat() &amp;&amp; !is_page() ) $content = $DView-&gt;hide_mess;
  return $content;
}</code></pre>
				<p>if文の条件に<code>!is_page()</code>を加えた、これによって<em>今の表示がページではなく</em>、の条件が加えられる。</p>
				<p>さらに、pageテンプレート自体の修正を減らしたいのと、このカスタムフィールドからの判別は他でも使うため（後述）、これも先ほどのclassのメソッド化しておく。</p>
				<pre><code class="prettyprint">class DivergenceView {
  var $hide_cat = array(3); //表示OKなカテゴリーIDの配列
  var $hide_mess = &quot;&lt;p&gt;この内容は今の権限では見れません！&lt;p&gt;&quot;; //非表示化した際置き換える文字列
  function lv() { //ユーザーレベルの確認結果を格納する
    global $user_level;
    return ( 0 != $user_level )?true:false;
  }
  function in_cat() { //現在表示中の場所が除外カテゴリーかをチェックし、非表示にする必要がないならtrueを返す
    if ( $this-&gt;lv() ) return true; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせずtrue返す
    foreach ( $this-&gt;hide_cat as $k =&gt; $v ) {
      if ( in_category( $v ) ) return true;
    }
    return false;
  }
  function page_cf() { //ページのカスタムフィールドをチェックし表示すべきかを返す
    if ( $this-&gt;lv() ) return true; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせずtrue返す
    $cfv = get_post_custom_values(&quot;provisional&quot;);//カスタムフィールドの値取得
    $cfv = $cfv[0];//配列なので代入しなおし
    return ( $cfv )?true:false;
  }
}</code></pre>
				<p>さらに先ほどのpage.phpテンプレートもあわせて変更。<br />
				ちなみに分岐内容に重複するタグがあるのでもっとコンパクトに出来るんだけど、視認性のためにそのままにしてる。<br />
				アホなんで次の日見ただけでもう忘れてる可能性がある。俺流のリスクヘッジ2009春。</p>
				<pre><code class="prettyprint">//page.php ヘッダー部分省略
	&lt;h1&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;
&lt;?php

$DView = new DivergenceView();
if ( $DView-&gt;page_cf() ) {

?&gt;
&lt;div class=&quot;entry&quot;&gt;
  &lt;div class=&quot;textBody&quot;&gt;&lt;?php the_content(); ?&gt;&lt;/div&gt;
&lt;?php comments_template(); ?&gt;
&lt;/div&gt;&lt;!--end entry--&gt;
&lt;?php

} else {

?&gt;
&lt;div class=&quot;entry&quot;&gt;
  &lt;div class=&quot;textBody&quot;&gt;
    &lt;p&gt;&lt;?php echo $DView-&gt;hide_mess; ?&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;!--end entry--&gt;
&lt;?php

}

?&gt;
//page.php フッター部分省略</code></pre>
				<p>これで、ページを作る際はカスタムフィールドを設定してあげれば『体験中の人にも公開するページ』、を簡単に作成する事が出来るようになった。<br />
				カスタムフィールド名を選択し、値にtrueと入力するだけの簡単なお仕事だが、これは技術的な話と無縁の人にはちょっと抵抗感のある作業だ。<br />
				しかし公開する内容を書く、しかも記事でなくページ、という作業を管理者になるであろう俺以外がやるケースはあまりなさそうなので、これでいくことに。<br />
				（本来はエディタにチェックボックスでも表示させて、チェックするかどうかだけで選択出来ると初心者でも抵抗ないんで、そのうちそんな感じのpluginを探す事に。どこかで見た気がする。）</p>
				<h3>アーカイブの閲覧制限</h3>
				<p>そもそも見る事の出来ない記事をアーカイブやトップに表示する必要はあまりない、にぎやかし的に「正式加入するとこんな記事が見れるのか～」という心理効果はありそうだけど。<br />
				というわけで次はトップページからそもそも閲覧権限のない記事を書き出さない方法を。<br />
				あれ、すると本文をフィルターで隠した意味がいよいよ無くなる気がするな…まぁいいか。</p>
				<pre><code class="prettyprint">if (have_posts()) :
  while (have_posts()) : the_post();</code></pre>
				<p>こんな感じのループの開始部分を、以下のようにしてあげる。</p>
				<pre><code class="prettyprint">if (have_posts()) :
  $DView = new DivergenceView(); //オブジェクト生成
  while (have_posts()) : the_post();
    if ( !$DView-&gt;in_cat() ) continue;</code></pre>
				<p>ユーザーレベルとカテゴリーをチェックし、そのループ回の記事が公開してはいけないものならcontinueでループを飛ばすだけ。<br />
				これを行うのは主にcategory.php・index.php・search.php・archive.php・tag.php等になる、勿論使用しているテーマの構成によって変わる場合はある。<br />
				これによってカテゴリー、トップページ、検索結果、月ごとの投稿、同じタグの付いた投稿などの一覧表示が最適化された事になる。</p>
				<h3>サイドバーの修正</h3>
				<p>これまたテーマによるが、多くのテーマでサイドバーが1つか2つほど採用されており、そこにはページ一覧やカテゴリー・タグ一覧・最近の記事10件、といった内容があったりする。<br />
				ここまでの作業でなるべく閲覧権限の無いものは目に触れないように手を加えてきたので、当然ここもやっておく。</p>
				<h4>ページ一覧</h4>
				<p>サイドバーにページの一覧を載せる場合、<code>wp_list_pages()</code>っていうテンプレートタグを使う場合が多いと思うので、これの修正方法。<br />
				ちなみにwordpress2.7から<code>wp_page_menu()</code>というテンプレートタグも追加されたが、上記タグと比較してホームへのリンクを追加できる点とulも書き出す、くらいしか差異が見つからない、よくわからないのでこっちは今回は考えない事に。<br />
				<code>wp_list_pages()</code>にはオプションで<strong>includeパラメータ</strong>があり、これに表示したいページのIDを渡すと他を除外してくれるので、閲覧してもよいページのIDを全部調べて返すメソッドを先ほど作ったclassに追加する事にする。</p>
				<pre><code class="prettyprint">class DivergenceView {
  var $hide_cat = array(3); //表示OKなカテゴリーIDの配列
  var $hide_mess = &quot;&lt;p&gt;この内容は今の権限では見れません！&lt;p&gt;&quot;; //非表示化した際置き換える文字列
  function lv() { //ユーザーレベルの確認結果を格納する
    global $user_level;
    return ( 0 != $user_level )?true:false;
  }
  function in_cat() { //現在表示中の場所が除外カテゴリーかをチェックし、非表示にする必要がないならtrueを返す
    if ( $this-&gt;lv() ) return true; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせずtrue返す
    foreach ( $this-&gt;hide_cat as $k =&gt; $v ) {
      if ( in_category( $v ) ) return true;
    }
    return false;
  }
  function page_cf() { //ページのカスタムフィールドをチェックし表示すべきかを返す
    if ( $this-&gt;lv() ) return true; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせずtrue返す
    $cfv = get_post_custom_values(&quot;provisional&quot;);//カスタムフィールドの値取得
    $cfv = $cfv[0];//配列なので代入しなおし
    return ( $cfv )?true:false;
  }
  function hide_page_lis() { //表示可能なページのみサイドバーなどのリストに表示する
    if ( $this-&gt;lv() ) return; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせず返す
    $r = &apos;&amp;include=&apos;;
    $pages = get_pages(); //全ページの情報取得
    for ( $i = 0,$c = count( $pages ); $i &lt; $c; ++$i ) { //取得したページの数だけループ
      $cfv = get_post_meta( $pages[$i]-&gt;ID, &apos;provisional&apos;, true ); //ページのIDを取得し、そのIDのページのカスタムフィールドの値を取得
      if ( $cfv ) $r .= $pages[$i]-&gt;ID . &quot;,&quot;; //カスタムフィールドの値がtrueの場合、ページIDとカンマを連結
    }
    $r = substr( $r, 0, -1); //余分に付いたカンマを除去
    return $r;
  }
}</code></pre>
				<p>一番下に追加した<strong>hide_page_lis()</strong>がそれにあたる。<br />
				流れとしてはまずいつもどおり準備としてユーザーレベルをチェックし、返す値を格納する変数に“&#038;include=”を先にいれる。<br />
				全ページの情報を取得したらループでまわし、get_post_meta()を利用してページのIDを指定しカスタムフィールドの値を取得する。<br />
				あとは取得した値がtrueならカンマを付けて格納変数に継ぎ足していき、ループ後に最後の余分なカンマを除去し返す。<br />
				これを利用するSidebar.phpの該当部分はこんなかんじ。</p>
				<pre><code class="prettyprint">&lt;?php
$DView = new DivergenceView();
if ($pages = &amp;get_pages(&apos;&apos;)) : ?&gt;
    &lt;dt&gt;ページ&lt;/dt&gt;
    &lt;dd&gt;
      &lt;ul class=&quot;pages&quot;&gt;
&lt;?php wp_list_pages( &apos;sort_column=menu_order&amp;title_li=0&apos; . $DView-&gt;hide_page_lis() ); ?&gt;
      &lt;/ul&gt;
    &lt;/dd&gt;
&lt;?php
endif;
?&gt;</code></pre>
				<p>これで閲覧制限のかかった記事は、サイドバーのページ一覧に顔を出さなくなる。<br />
				ところでメソッドのほうで全ページの情報取得、なんかしてるけどこれを格納した変数って開放しなくていいのかな…よくわからないんでやってないけど。</p>
				<h4>最新の記事一覧</h4>
				<p>いわゆる<em>Recent Entries</em>とかの事、最新投稿記事を5～20くらい表示されてる、これもサイドバーの定番。<br />
				何かこういうの表示するためのpluginとかもあった気がするけど、とりあえず<code>wp_get_archives(()</code>ってテンプレートタグで出力してるケースが多いと思うんで、それへの対応。</p>
				<p>最新5件の投稿記事を表示する場合、以下のようなテンプレートタグを出力したい部分に記述する形になると思う。</p>
				<pre><code class="prettyprint">&lt;?php wp_get_archives(&apos;type=postbypost&amp;limit=5&apos;); ?&gt;</code></pre>
<p>このテンプレートタグでは指定や除外が出来ないので、頑張れば可能だけどちょっと面倒臭い。<br />
公開可能か不可能かはどのカテゴリーに属しているかで決めているので、この際このテンプレートタグではなく普通にループを利用して書き出していく事に。<br />
やり方はアーカイブ系のループをやった時と同じ、今回はリストとしてタイトルとリンクを書き出せばいい。</p>
<pre><code class="prettyprint">&lt;dt&gt;Recent Entries&lt;/dt&gt;
&lt;dd&gt;
  &lt;ul class=&quot;recentEntries&quot;&gt;
&lt;?php
if (have_posts()) :
  while (have_posts()) : the_post();
    if ( !$DView-&gt;in_cat() ) continue;
?&gt;
    &lt;li&gt;&lt;a href=&apos;&lt;?php the_permalink() ?&gt;&apos; title=&apos;&lt;?php the_title(); ?&gt;&apos;&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;&lt;/li&gt;
&lt;?php
    endwhile;
  endif;
?&gt;
  &lt;/ul&gt;
&lt;/dd&gt;</code></pre>
				<p>classからオブジェクト作るのは一回でいいんで、さっきやったページ一覧でオブジェクト作ってたら別にやらなくておｋ。<br />
				こんな感じで大概のものは専用のテンプレートタグを諦めればループか、生データ持って来て自力加工でどうにでもなる。</p>
				<h4>カテゴリー一覧</h4>
				<p>これを表示させるかが非常に迷う…。<br />
				たった一つのカテゴリーのみ閲覧可能なら、そもそも見れないカテゴリーばかり並ぶ一覧を表示する必要はない、と前提に立てれるなら単純にユーザーレベルでカテゴリー一覧の表示非表示を切り替えればいい。<br />
				ただ1つの投稿記事に複数のカテゴリーを付けれるので、決して閲覧可不可を決定するカテゴリー以外役に立たない訳でもない。<br />
				逆に体験者にとって体験者カテゴリー内の記事しか見れないのなら、体験者カテゴリーというもの自体が見えている必要がない。なにせ目に付く記事全部がそのカテゴリー内なわけだし、そもそもこのカテゴリーの役目が本来のものではなくむしろ管理制御用なのだから。<br />
				というわけで、体験者権限のみカテゴリーリストから体験者カテゴリーを取り除く形にする。<br />
				（カテゴリーが複雑にネストしだすと結構面倒な事になりそうだが、今回はそれは考慮外とした。）</p>
				<p>カテゴリーの表示には<code>wp_list_categories()</code>テンプレートタグが利用される。（たまにドロップダウンを使う所もあるが基本は同じ）<br />
				このテンプレートタグには指定・除外が出来るオプションがあるので、ページ一覧と同様に引数を作って渡してあげればいい。</p>
				<dl>
				<dt>functions.php</dt>
				<dd>
				<pre><code class="prettyprint">class DivergenceView {
  var $hide_cat = array(3); //表示OKなカテゴリーIDの配列
  var $hide_mess = &quot;&lt;p&gt;この内容は今の権限では見れません！&lt;p&gt;&quot;; //非表示化した際置き換える文字列
  function lv() { //ユーザーレベルの確認結果を格納する
    global $user_level;
    return ( 0 != $user_level )?true:false;
  }
  function in_cat() { //現在表示中の場所が除外カテゴリーかをチェックし、非表示にする必要がないならtrueを返す
    if ( $this-&gt;lv() ) return true; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせずtrue返す
    foreach ( $this-&gt;hide_cat as $k =&gt; $v ) {
      if ( in_category( $v ) ) return true;
    }
    return false;
  }
  function page_cf() { //ページのカスタムフィールドをチェックし表示すべきかを返す
    if ( $this-&gt;lv() ) return true; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせずtrue返す
    $cfv = get_post_custom_values(&quot;provisional&quot;);//カスタムフィールドの値取得
    $cfv = $cfv[0];//配列なので代入しなおし
    return ( $cfv )?true:false;
  }
  function hide_page_lis() { //表示可能なページのみサイドバーなどのリストに表示する
    if ( $this-&gt;lv() ) return; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせず返す
    $r = &apos;&amp;include=&apos;;
    $pages = get_pages(); //全ページの情報取得
    for ( $i = 0,$c = count( $pages ); $i &lt; $c; ++$i ) { //取得したページの数だけループ
      $cfv = get_post_meta( $pages[$i]-&gt;ID, &apos;provisional&apos;, true ); //ページのIDを取得し、そのIDのページのカスタムフィールドの値を取得
      if ( $cfv ) $r .= $pages[$i]-&gt;ID . &quot;,&quot;; //カスタムフィールドの値がtrueの場合、ページIDとカンマを連結
    }
    $r = substr( $r, 0, -1); //余分に付いたカンマを除去
    return $r;
  }
  function hide_cats_lis() {
    if ( $this-&gt;lv() ) return; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせず返す
    $r = &apos;&amp;exclude=&apos;;
    foreach ( $this-&gt;hide_cat as $k =&gt; $v ) $r .= $v . &apos;,&apos;;
    $r = substr( $r, 0, -1); //余分に付いたカンマを除去
    return $r
  }
}</code></pre>
				</dd>
				<dt>sidebar.php</dt>
				<dd>
				<pre><code class="prettyprint">&lt;dt&gt;Categories&lt;/dt&gt;
&lt;dd&gt;
  &lt;ul class=&quot;category&quot;&gt;
&lt;?php wp_list_categories( &apos;title_li=&apos; . $DView-&gt;hide_cats_lis() ); ?&gt;
  &lt;/ul&gt;
&lt;/dd&gt;</code></pre>
				</dd>
				</dl>
				<p>やってる事はページ一覧と大差ない。<br />
				classが長大になってきたな…大差ない事やってるならもう少しメソッドを抽象化できりゃいいんだけどうーん。</p>
				<h3>feedの閲覧制限</h3>
				<p>feedへのリンクやheadタグ内のメタタグは分岐してやりゃいいだけなのですぐ終わる。<br />
				分岐させて非表示にした所でfeedは存在するという点で、画像への直アクセスに似ているが、これは対処可能だった。</p>
				<p>参考：<img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://weblog.atl-r.net/blog/tipstomake_communitysite1/comment-page-1/#comment-155" /><a href="http://weblog.atl-r.net/blog/tipstomake_communitysite1/comment-page-1/#comment-155" title="wordpressで非公開コミュニティサイトを作る（1）認証機能をつける - atl*weblog" class="topic">wordpressで非公開コミュニティサイトを作る（1）認証機能をつける &#8211; atl*weblog</a></p>
				<p>上記記事内ではheader.phpに直接処理を書いていたが、その後偶然<code>send_headers</code>というアクションフックがある事を知った。<br />
				このフックを利用する事で、header.phpに直接かかなくて済む上に、feedへのアクセスにもログインが必要になる。</p>
				<pre><code class="prettyprint">function op_auth() {
  if ( !is_user_logged_in() ) auth_redirect();
}
add_action(&apos;send_headers&apos;, &apos;op_auth&apos;);</code></pre>
				<p>これをfunction.phpにでも書いておけばOK。<br />
				ちなみにこの方法でも画像への直アクセスは防げないので注意。</p>
				<p>とりあえずここまでやったが、大事な問題がある。<br />
				このfeed、権限があるとして、どうやって見るのって話なのだｗ<br />
				…wordpressのログイン管理は当然cookieを利用してるんで、普通に考えたらcookieを利用出来ないfeedreaderじゃ見れないよなぁ。<br />
				今後解決策を考えていくけど、場合によってはタイトルと概要のみのfeedを認証が必要ない状態で吐き出すとか、妥協案も考える必要がありそうな雰囲気。<br />
				BASIC認証みたくhttp://username:password@example.com/feed/とか、こんな感じの方法ないかなぁ、なんか難しそうで解決しなそうな雰囲気を感じるな…；；</p>
				<h3>記事単位での所属カテゴリー表示の加工</h3>
				<p>もーないよな！と思いつつ色々見てたら、記事ごとにその記事がどのカテゴリーに属するかを表示するカテゴリー一覧があったんだった。<br />
				別に記事がどのカテゴリーのものかを表示する事自体はいいのだが、さっきサイドバーのカテゴリー一覧で体験用カテゴリー表示のみ消したのと同様に、こちらも消しておかないといけないだろう。<br />
				しょうがない、やるか！</p>
				<p>記事ごとの所属カテゴリー表示はテンプレートタグ<code>the_category()</code>を利用する、引数にはセパレートを指定できる。<br />
				この所属カテゴリー表示は記事単体表示のみならず、トップページやらアーカイブ系やら、ループでいくつも記事を表示する際にも必ず出てくる。<br />
				なのでテンプレートを直接いじるのではなく、functions.phpに処理を書いてフィルターする事に。</p>
				<p><code>the_category</code>というフィルターフックを使う事で、テンプレートタグ<code>the_category()</code>が吐き出すhtmlを表示する前に受け取って加工できる。<br />
				これを利用してこんな感じで書いてみた。</p>
				<pre><code class="prettyprint">function cat_fill( $htm ){
  $DView = new DivergenceView();
  if ( $DView-&gt;lv() ) return $htm; //ユーザーレベルもチェック、閲覧制限のないユーザーなら何もせず返す

  $r = &quot;&quot;;
  $sp = &quot;\|&quot;; //セパレート
  $lis = split( $sp, $htm ); //セパレートで分割し配列に格納
  for ( $i = 0,$l = count($lis); $i &lt; $l; ++$i ) {
    $FLG = true;
    //urlのパラメータの位置を探し、文字分を足した位置から後を切り出す
    $p = substr( $lis[$i], strpos( $lis[$i], &quot;?cat=&quot;) + 5);

    //切り出した文字列の頭からurl終りの位置までを格納（カテゴリーID）
    $p = substr( $p, 0, strpos( $p, &quot;\&quot;&quot;) );

    foreach ( $DView-&gt;hide_cat as $k =&gt; $v ) { //取り出したカテゴリーIDが閲覧禁止かチェック
      if ( $p == $v ) $FLG = false;
    }

    $r .= $FLG?$lis[$i].$sp:&quot;&quot;;

  }
  if ( strpos( $r, $sp ) ) $r = substr( $r, 0, -4); //カテゴリーが1つしかない場合、セパレート除去

  $htm = $r;
  return $htm;
}
add_filter(&apos;the_category&apos;, &apos;cat_fill&apos;);</code></pre>
				<p>フィルターから呼び出す関数の処理の流れは以下。</p>
				<ol>
				<li>関数スタート、引数$htmはテンプレートタグ<code>the_category()</code>が書き出すはずだったhtml</li>
				<li>オブジェクトを生成しユーザーレベルチェック、制限かからない権限だった場合そのまま返して終了</li>
				<li>各変数初期化、$rは一時格納、$spはセパレート、$lisには引数で渡されたhtmlをセパレートで分割し配列を格納</li>
				<li>$lisの配列をループ回し、始めにフラグ</li>
				<li>html内のurlのパラメータから後ろを切り出す（urlのカテゴリーIDの前部分を切捨て）</li>
				<li>切り出した文字列頭からurlの最後までを切り出す（カテゴリーIDから後ろ部分を切捨て）</li>
				<li>こうやって取り出したカテゴリーIDが閲覧制限のあるものかをチェック</li>
				<li>問題なければ格納変数$rに文字列連結</li>
				<li>ループ終了、複数項目があった場合、ケツに余計なセパレートが付いてるはずなんで切り捨て</li>
				<li>いじくりまわしたhtmlを返す（引数と同じ名前じゃないとダメだった気がして入れなおしてる、記憶おぼろげ）</li>
				</ol>
				<p>絶対もっとうまい方法があった気がする…カテゴリーIDは正規表現で取り出せるだろ、とかｗ<br />
				文字列いじりをするって個人的に最終手段というか、大概の場合悪手で他にいい手があったりするイメージなので気が引けるが、functions.phpのほうだけで済んだからまぁいいか。<br />
				（アクセス数が多い場合はちゃんと効率のいい方法でやらないときっとサーバに負担かかるんだと推測）</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/tipstomake_communitysite3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpressで非公開コミュニティサイトを作る（2）ユーザーレベルで表示内容を変更+plugin“Category Access”</title>
		<link>http://weblog.atl-r.net/blog/tipstomake_communitysite2/</link>
		<comments>http://weblog.atl-r.net/blog/tipstomake_communitysite2/#comments</comments>
		<pubDate>Sun, 19 Apr 2009 22:30:38 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2139</guid>
		<description><![CDATA[				
				認証は出来たので、今度はログインしたユーザーの権限をあらわすユーザーレベルで表示を変えたり、見る権限がない記事を表示しようとした場合は別のページへ飛ばす方法を探っていく。
				
				wordpr [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/01/090109-01.png" alt="wordpress!" title="wordpress!" width="345" height="85" class="alignnone size-full wp-image-221" /></p>
				<p>認証は出来たので、今度はログインしたユーザーの権限をあらわす<strong>ユーザーレベル</strong>で表示を変えたり、見る権限がない記事を表示しようとした場合は別のページへ飛ばす方法を探っていく。</p>
				<p><span id="more-2139"></span></p>
				<p>wordpress界（？）ではWordBenchという立派なソーシャルコミュニティが出来たらしく話題になっているが、残念ながらあそこまで立派なものはちょっと難しそうだし、そもそもwordpressではなくwordpressMUを使っていたり、一人一人のblogまで必要じゃないんでとりあえずこのままwordpressをベースとして考えていく。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://wordbench.org/" width="16" height="16" alt="" /><a href="http://wordbench.org/" title="WordBench">WordBench</a></p>
				<p>通常ユーザーによって見せる見せないをwordpressで選択する場合、記事投稿時にパスをつけたり非公開設定をつけたりという事はデフォルトの機能として備わっている。<br />
				今回もそれを使えばこんな面倒な事をする必要はないのだが、下記理由によりその手が使いにくい。</p>
				<ol>
				<li>wordpressになれて無い（かつ面倒事が嫌いな）ユーザーも記事投稿を行うため、記事書くたびに非公開やパス設定させるのに無理がある</li>
				<li>体験中の人でも見れる記事・ページのほうが更新頻度が少なく、公開範囲の狭いほうをデフォルトとしたい</li>
				</ol>
				<p>といった諸般の事情から、基本的な流れとしては全部の記事を見る権限の無いユーザーがログインしたら、そのユーザーレベル専用のフロントページへ飛ばす、見る権限の無い記事へ飛んだらフロントページへ戻す、サイドバーなり検索結果等で見る権限のない記事は非表示もしくは本文が見れないような感じでいこうかなと画策。</p>
				<h2>二つの対処法</h2>
				<p>上記の条件を満たすために、pluginによる制限とphpであれこれやるという二つの方法で対応していこうと考える。<br />
				最初は全てphpをいじってやろうと思っていたし、後々の事を考えるとそのほうが安全なのだが、これが俺程度のスキルではちょっと難しく、数日ハマった後pluginで出来る事はやってもらおうという方針に変更。<br />
				偶然ちょうど目的に合ったpluginを見つけたというのも大きいが。 </p>
				<h2>カテゴリー単位で閲覧制限をかけれるplugin “Category Access”</h2>
				<p class="img_R"><img src="http://capture.heartrails.com/400x400/border/shorten?http://www.coppit.org/code/" alt="David Coppit's Code Page" /></p>
				<p>で、そのpluginが<strong>Category Access</strong>。</p>
				<dl>
				<dt>試したwordpressのヴァージョン</dt>
				<dd>2.7.1</dd>
				<dt>試したヴァージョン</dt>
				<dd>0.8.2</dd>
				<dt>対応するwordpressの最新バージョン表記</dt>
				<dd>2.3.X, and not prior versions</dd>
				<dt>auther page</dt>
				<dd><img src="http://favicon.hatena.ne.jp/?url=http://www.coppit.org/code/" width="16" height="16" alt="" /><a href="http://www.coppit.org/code/" title="David Coppit's Code Page">David Coppit&#8217;s Code Page</a></dd>
				</dl>
				<p>wordpressといえば、という事でこちらから情報ゲット。<br />
				<img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://wp.tekapo.com/2007/07/07/category-access/" /><a href="http://wp.tekapo.com/2007/07/07/category-access/" title="Category Access - わーどぷれすっ！" class="topic">Category Access &#8211; わーどぷれすっ！</a></p>
				<p>分かりにくいのだが、<em>Code Page</em>ってところにこの開発者の作ったpluginとかがあれこれ置いてあるんで、下のほうにある<strong>Category Access 0.8.2</strong>ってリンクからDLする。<br />
				後はwordpressのpluginのインストール項目からDLしたzipを選択すればOK。</p>
				<p>このpluginは公式Plugin Directoryにも登録されてないし、まして最終更新日が2007年と、まず動かねーだろうなぁと思っていたが、多少怪しい部分はあれどすんなり動いた。<br />
				今後wordpressの大幅なアップデートに際しても動き続けれるかは不安だが、2.3時代から2.5、2.7と乗り気って動いている事になるので、案外いけるんじゃないかなと思っている。（ソースを見ろと言う話）<br />
				最悪動かなくなってもこのpluginのソースを参考に自力で作り直すという荒業も残っている、実力不足で不安だが今の時点で動くお手本があるのは心強い。</p>
				<p>なんていう話はともかくpluginについて。<br />
				このpluginはアクティブにするとwordpressの管理画面の設定に専用のオプションページ、さらに各ユーザーページの下部に幾つかの項目を追加する。</p>
				<h3>管理画面</h3>
				<p><img src="http://weblog.atl-r.net/wp-content/uploads/2009/04/02.png" alt="Category Access" title="Category Access" width="605" height="186" class="alignnone size-full wp-image-2199" /></p>
				<dl>
				<dt>Category Access for:</dt>
				<dd><strong>New Users</strong>と<strong>Anonymous Users</strong>の二種から選択。<br />
				Anonymous Usersはログインしていないユーザーを意味する、これの用法はシンプル。<br />
				今回俺が使うのはログインしたユーザーの権限で見れる範囲を指定なので、今回はNew Usersを選択。<br />
				実はNew Usersが何を表すかよくわからないのだが、恐らくはユーザーを新規登録した際、デフォルトで割り振られる権限の事なんだと思う。（詳細後述）<br />
				その下に幾つか出ているだろうチェックボックスは現在存在するカテゴリーにあたり、チェックを入れたカテゴリーは公開してもOK、という感じ。</dd>
				<dt>Check all categoriesボタン・Uncheck all categoriesボタン</dt>
				<dd>上に表示されるカテゴリーを全てチェックする・全てのチェックを外すボタン。カテゴリー数がやたら多い場合に使えるかもしれない。</dd>
				</dl>
				<h4>Protected Posts in the Blog</h4>
				<p>blogの閲覧制限の設定<br />
				<img src="http://weblog.atl-r.net/wp-content/uploads/2009/04/03.png" alt="Protected Posts in the Blog" title="Protected Posts in the Blog" width="605" height="228" class="alignnone size-full wp-image-2204" /></p>
				<dl>
				<dt>Hide entire post.</dt>
				<dd>閲覧限定されたユーザーから、記事のタイトル・本文・コメント本文を隠す。ただし<strong>公開用カテゴリーアーカイブページでの“最新の投稿”等では非公開カテゴリー記事のタイトルが表示されてしまう。</strong>テーマの作り方次第でどうにかなるとは思う。</dd>
				<dt>Show title, but a private message for the body text.</dt>
				<dd>閲覧限定されたユーザーから、記事のタイトルのみを表示し、本文・コメント本文を隠す。本文の代わりに指定したメッセージ（<em>private post message</em>）を表示することも出来る。</dd>
				<dt>Show a private message for the title and nothing for the body text.</dt>
				<dd>閲覧限定されたユーザーから、記事のタイトル・本文・コメント本文を隠し、タイトルの代わりに指定したメッセージ（<em>private post message</em>）を表示する。表示出来ない記事を開くとタイトルの他に同じく指定メッセージが妙な位置に配置される。</dd>
				<dt>The private post message:</dt>
				<dd>上記選択肢で三項目目を選んだ際、タイトルの代わりに表示させるメッセージを入力する</dd>
				<dt>Show a padlock icon on the private post message.</dt>
				<dd><em>private post message</em>を表示する際、南京錠のアイコンを表示する</dd>
				<dt>Consider a message to be visible if the user can view any of its categories (rather than all of its categories).</dt>
				<dd>このチェックボックスをONにすると、1つの記事が複数のカテゴリーに属する場合、そのうち1つでも公開OKなカテゴリーが含まれていれば公開する。</dd>
				</dl>
				<h4>Protected Posts in Feeds</h4>
				<p>フィードの閲覧制限の設定<br />
				<img src="http://weblog.atl-r.net/wp-content/uploads/2009/04/04.png" alt="Protected Posts in Feeds" title="Protected Posts in Feeds" width="605" height="141" class="alignnone size-full wp-image-2203" /></p>
				<dl>
				<dt>Show the title and links (but not the summary or content) instead of hiding posts.</dt>
				<dd>非公開の投稿を隠す代わりに、タイトルとリンクのみ表示させる。<br />
				これはcookieによるログイン判別をしているので、cookieを読み取らないfeed reader等を制限する事が難しいため、ならfeedのタイトルとリンクは隠さずに吐き出して、アクセスしてきたら閲覧制限がかかるよ、的な手なんだと思う。なので基本はチェックを入れておく。</dd>
				</dl>
				<h4>The Category List</h4>
				<p><img src="http://weblog.atl-r.net/wp-content/uploads/2009/04/05.png" alt="The Category List" title="The Category List" width="605" height="91" class="alignnone size-full wp-image-2202" /><br />
				閲覧許可をしていないカテゴリーを表示するかとか、表示出来ないカテゴリーに南京錠のアイコンを表示するか、といった選択肢なのだが、これは働いてなく、<strong>チェックを入れてアクセスするとエラーか何かが出て表示されなくなってしまう</strong>。<br />
				ちなみに表示されるメッセージは以下の通り。</p>
				<p>Unknown column &apos;wp_term_relationships.term_taxonomy_id.term_taxonomy_id&apos; in &apos;where clause&apos;</p>
				<p>内容からいって、このpluginが作られた当時とDBの構成が変わっているため、わからんカラムが存在するよとか、そういう事なのかな。</p>
				<h4>下の2つのボタン</h4>
				<p><img src="http://weblog.atl-r.net/wp-content/uploads/2009/04/06.png" alt="Update Options" title="Update Options" width="137" height="43" class="alignnone size-full wp-image-2201" /><img src="http://weblog.atl-r.net/wp-content/uploads/2009/04/07.png" alt="Reset All Options" title="Reset All Options" width="137" height="43" class="alignnone size-full wp-image-2200" /></p>
				<p>特筆する必要もない、設定更新とリセットボタン。<br />
				なんだけど、似たような位置に配置されているんで、クセで設定変更したあと一番したのボタン…を押すと見事にリセットがかかったりする。</p>
				<h3>ユーザーページ</h3>
				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/04/08.png" alt="user page options" title="user page options" width="338" height="172" class="alignnone size-full wp-image-2208" /></p>
				<p><strong>Category Access</strong>という項目が各ユーザーページの項目に表示される。ちなみに管理者のユーザーページには表示されない。</p>
				<p>ここには現存するカテゴリーとcheck all、uncheck allのボタンがある。ここで個別ユーザーごとに公開範囲を指定する事が出来る。</p>
				<h3 style="clear:both">実際の動作</h3>
				<p><em>New Users</em>でユーザーを新規登録すると、設定をいじってなければ通常権限は<em>購読者</em>になる。<br />
				この状態だと当然デフォの設定のまま、指定したカテゴリーの記事しか閲覧する事が出来ない。<br />
				当初New Usersとはこのデフォルトで割り振られる権限の事だと思っていた。<br />
				ところがこの新規登録したユーザーの権限を購読者の上の<em>投稿者</em>にしても、さらにその上の<em>作成者</em>にしても閲覧制限がかかったままなのだ。<br />
				その上の<em>編集者</em>にしてやっと<q>As a category manager, this user can view all categories.</q>というメッセージがユーザーページのカテゴリー選択部分に表示され、全カテゴリーを閲覧できる状態になった。（勿論管理者権限になれば当然全部観れる）<br />
				<strong>そして編集者権限から下に再度変更すると、カテゴリーのチェックボックスが復活するのだが、このチェックが全て外れているのだ！</strong><br />
				つまり常にではないものの、このpluginを使用した状態で権限をいじる場合には個別の手直しを前提で使う必要がある事になる。<br />
				権限を上下に頻繁に変更する事は俺の今回の想定利用環境ではありえないが、ちょっとこれは面倒な気がしてしまう。<br />
				カテゴリーが大量にあって、細かく分類している場合なんかは結構しんどそう。</p>
				<p>なので、このpluginは複雑大量のカテゴリーをユーザーごとに細かく閲覧設定したい、みたいなヘビーなユーザー管理には向かない。<br />
				今回の俺の用途のように、低い権限だとこのカテゴリーしか見れないよ、程度なら耐えれる程度のものだろう。（古いしね）</p>
				<h2>自力で権限・ユーザーレベルで振り分け</h2>
				<p>さて上記pluginを利用すれば記事（post）の保護は出来る、けどページにはカテゴリーが無いためpluginではどうこう出来ない。<br />
				さらにトップページなりサイドバーなりで閲覧出来ないんだから本来見える必要もない項目も出てくる。（カテゴリー1つ分しか閲覧許可出さない場合、カテゴリーリストを表示する部分は不要、だとか）<br />
				アクセス時に最初に飛ばしたい、体験者用ページなんかも作るかもしれないし、既に説明したとおり、ちょっとpluginが不安定なんで今後の事も考えると、やっぱり自力で振り分けする方法も把握して、部分的にでも使っていく必要がありそう。</p>
				<h3>ユーザーレベルを取得する</h3>
				<p>これをするには当然、今ログインして見てる人の権限を取得しないといけない。</p>
				<p>権限っていうとwordpressの管理画面で言う<strong>管理者</strong>とか<strong>編集者</strong>とかの事なんだけど、実は内部処理的には0～10の11段階の<strong>ユーザーレベル</strong>ってのが設定されていて、こっちを使って判別する。<br />
				ちなみに管理者はユーザーレベル10、閲覧者はユーザーレベル0、と内部で振られていて、数字が上がるほど権限が増える感じぽい。（ここで言う権限は使う事が出来るwordpressの機能、設定の数や種類の事）</p>
				<p>で、見てる人のユーザー情報を取得するには<strong>global $user_level</strong>とするだけで取得できる。</p>
				<h3>実際に振り分けてみる</h3>
				<p>仮に管理者をユーザーレベル10、一般メンバーを編集者とするとユーザーレベル7、で体験中のメンバーを閲覧者でユーザーレベル0と設定する。（デフォなんで設定する必要ないんだけど）<br />
				このケースで閲覧者とその他、で処理を分けたい場合こんな風にすればいいっぽい。</p>
				<pre><code class="prettyprint">&lt;?php
global $user_level;
if ( $user_level &gt; 0 ) {

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

} else {

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

}
?&gt;</code></pre>
				<p>あら簡単。<br />
				これで例えば体験中の人にはサイドバーのこの項目は表示させなくていいな、とかそういう事がテーマ内で出来るようになるね！</p>
				<h3>トップページを変えたい場合のやり方</h3>
				<p>トップページを体験用と一般用に分けたい場合のやり方もついでにメモっておく。<br />
				と言っても既にユーザーレベルで分岐できているんで終わったようなものなのだが。</p>
				<p>header.phpの一番上に以下のコードを挿入すればいい。</p>
				<pre><code class="prettyprint">global $user_level;
if ( is_home() &amp;&amp; $user_level == 0 ) {
        wp_redirect( get_option(&apos;siteurl&apos;) . &apos;飛ばし先のパス&apos; );
}</code></pre>
				<p>頑張ってheader送信しようとあれこれやってたんだけど、んもう全然出来なくて半泣きであれこれ調べてたら<strong>wp_redirect()</strong>なんていう関数を発見したのだったりする。</p>
				<p><img width="16" height="16" alt="" src="http://favicon.hatena.ne.jp/?url=http://codex.wordpress.org/Function_Reference/wp_redirect" /><a href="http://codex.wordpress.org/Function_Reference/wp_redirect" title="Function Reference/wp redirect « WordPress Codex" class="topic">Function Reference/wp redirect « WordPress Codex</a></p>
				<p><q title="Function Reference/wp redirect « WordPress Codex" cite="http://codex.wordpress.org/Function_Reference/wp_redirect">Redirects the user to a specified absolute URI.</q>とあるように、絶対URIで書く必要があるようだ。</p>
				<p>という事で、前回のアクセス制限のコードとあわせてheaderの頭に以下のコードを突っ込む事になる。</p>
				<pre><code class="prettyprint">&lt;?php
if ( !is_user_logged_in() ) auth_redirect();
global $user_level;
if ( is_home() &amp;&amp; $user_level == 0 ) wp_redirect( get_option(&apos;siteurl&apos;) . &apos;飛ばし先のパス&apos; );
echo &apos;&lt;?xml version=&quot;1.0&quot; encoding=&quot;&apos;. get_bloginfo(&apos;charset&apos;) . &apos;&quot; ?&gt;&apos;;
?&gt;</code></pre>
				<p>関数化されているとはいえリダイレクトには変わらないようなので、echoより先に。</p>
				<p>後は飛び先となるページを作り、それ用のテンプレートを用意すればいい。</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/tipstomake_communitysite2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>wordpressで非公開コミュニティサイトを作る（1）認証機能をつける</title>
		<link>http://weblog.atl-r.net/blog/tipstomake_communitysite1/</link>
		<comments>http://weblog.atl-r.net/blog/tipstomake_communitysite1/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 19:13:18 +0000</pubDate>
		<dc:creator>daruman</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://weblog.atl-r.net/?p=2126</guid>
		<description><![CDATA[				
				wordpressを使い会員のみのコミュニティサイトを作るべく、それに必要そうな部分をメモがてら。
				まずは一番肝要な、認証制度から。
				
				まえおき
				長い事やっているMMOR [...]]]></description>
			<content:encoded><![CDATA[				<p class="img_R"><img src="http://weblog.atl-r.net/wp-content/uploads/2009/01/090109-01.png" alt="wordpress!" title="wordpress!" width="345" height="85" class="alignnone size-full wp-image-221" /></p>
				<p>wordpressを使い会員のみのコミュニティサイトを作るべく、それに必要そうな部分をメモがてら。<br />
				まずは一番肝要な、認証制度から。</p>
				<p><span id="more-2126"></span></p>
				<h2>まえおき</h2>
				<p>長い事やっているMMORPGの仲間内用のサイトをリニュするタイミングがあったので、wordpressで構築してみようかなと。<br />
				一度チャレンジしてほぼ完成まで持っていったものの、wordpress自体のバージョンがすでに0.2ほどアップしてしまい、汎用性のあるように作れてなかったために半お蔵入りになった過去を踏まえ、もう一度チャレンジする事に。<br />
				今回は以前の反省を踏まえ、<em>基本機能のみ完成した時点で速攻公開し使ってもらう</em>（とはいえここで公開はしないが）、<em>後でwordpressアップデートや機能拡張に対応できるようなつくりを意識する</em>、この二点を意識しておく。（手馴れた人なら当たり前なんだろうけど、前回始めてwordpress使ったので何も考えてなかった）</p>
				<p>んでまずは基本であるユーザー認証をつける事になる。<br />
				認証周りに関する条件はユーザー管理関係も含めて以下。</p>
				<ol>
				<li>ユーザー登録は全部俺がやる</li>
				<li>大まかに管理者、一般、体験中、の三段階の権限構成</li>
				<li>管理者は俺なので全権限onで特に何も無し</li>
				<li>一般は記事作成とかは出来るけどwordpress自体の設定は出来ない</li>
				<li>体験中は体験中の人専用のコンテンツしか見れない</li>
				<li>注意すべきは体験中専用とは、記事は書けるけど編集出来ない、ではなく、それ用のページしか見れない、つまり権限判別で振り分けする</li>
				</ol>
				<p>こんな感じかな。<br />
				ポイントは体験中の扱いで、書いたとおり権限、無いしユーザーレベル（後述）による振り分けを行うのが少し面倒。<br />
				けどこうしないとwordpressでユーザーアカウントの一元管理が出来ないので面倒ってのと、wordpress側で記事やページ作成して体験中の人に公開すべきかどうかを判別するだけで記事内容のコピペとか無駄手間を減らしたい、という理由から。</p>
				<p>余談だがなんだよ“体験中”って、と感じる人が大半だと思うが、なにぶん使用想定環境がMMORPGの仲間内用なので、いわゆるギルドとかゲームによってはクラン？、この手の集団に一時的に加入して正式加入するかを判断する時期の事だったりする。<br />
				ゲームごときに認証ｗｗｗｗｗというのはもっともな話だけど、ゲームだけに妬み嫉み荒らし秘密情報だとかあれこれあったりするのだ。</p>
				<h2>.htaccessでBASIC認証も作れないのださ～ぃ！</h2>
				<p>ユーザー管理に関してwordpressを知らないけど俺よりプログラムとか詳しい人に言うと、.htaccessつくりゃすぐじゃん的回答があるのだが、wordpressでの.htaccessによるBASICとかの認証は、不可能ではないにせよちょっとむずかしいようだ。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://nursery.s8.xrea.com/d/20070928.html" width="16" height="16" alt="" /><a href="http://nursery.s8.xrea.com/d/20070928.html" title="未定... - WordPress の .htaccess 書き換えを止めたい (前置き) , WordPress の .htaccess 書き換えを止めたい (改変内容) , 最近">未定&#8230; &#8211; WordPress の .htaccess 書き換えを止めたい (前置き) , WordPress の .htaccess 書き換えを止めたい (改変内容) , 最近</a></p>
				<p>つまるところ、wordpressが.htaccessを自動生成・書き換えをしているという話だ。<br />
				この方法だとwordpress本体のプログラムの書き換えが発生する、つまりwordpress自体のアップデートのたびに書き直すハメになる可能性が出る。<br />
				これは面倒なので別の方法でいく。</p>
				<h2>pluginで何かねーの？</h2>
				<p>検索すると結構hitするように、以前はこれを使っていた。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://blog.taragana.com/index.php/archive/angsumans-authenticated-wordpress-plugin-password-protection-for-your-wordpress-blog/" width="16" height="16" alt="" /><a href="http://blog.taragana.com/index.php/archive/angsumans-authenticated-wordpress-plugin-password-protection-for-your-wordpress-blog/" title="Angsuman’s Authenticated WordPress Plugin - Password Protection for Your WordPress Blog">Angsuman’s Authenticated WordPress Plugin &#8211; Password Protection for Your WordPress Blog</a></p>
				<p>んだけどすでに更新されておらず（有料版にサポートが移行したのか、標準で関数実装したからなのかわからないが）、以前使っていたwp2.5時代ですら結構な書き換えが必要だった事から、今回はさすがに無しで。</p>
				<p>他にも認証周りのpluginは結構ありそうなのだが、特定権限のユーザーのみあれこれ変えるという特殊な目的があるので、今回はpluginの利用は見送る事に。<br />
				普通に認証だけできりゃいいよって人はPlugin Directoryで<strong>Authentication</strong>とかで検索すれば色々出ると思う、ちなみにplugin検索精度がこないだやっとマトモになったので助かる。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://wordpress.org/extend/plugins/search.php?q=Authentication" width="16" height="16" alt="" /><a href="http://wordpress.org/extend/plugins/search.php?q=Authentication" title="WordPress › WordPress Plugins">WordPress › WordPress Plugins</a></p>
				<h2>ログインしてないと閲覧出来ないようにするには</h2>
				<p>じゃ本題へ。</p>
				<p>wordpressでのログインというと普通にblogを使用している人にとっては、記事を書いたりする管理画面に行くためにはパスが必要でそれがログイン、だと思う。<br />
				間違ってないんだけど、wordpress的には上記のログイン動作をしないでblogを見ている状態と、ログインしてから管理画面からblogに戻って見ている状態では、見た目には同じでもちゃんと区別をつけている。<br />
				この感覚が最初wordpressをいじりだした時は分かりにくかったが（主にloginを意識させないテーマが多いせいで）、ログインした状態じゃないと見れない記事を書いたり（非公開記事）、以前書いたログインした状態ではGoogle Analyticsにトラッキングさせないpluginだとか、あれこれあるんで、こーゆーの使い出すとつかめてくる。</p>
				<p>参考：<img src="http://favicon.hatena.ne.jp/?url=http://weblog.atl-r.net/memo/google-analytics09/" width="16" height="16" alt="" /><a href="http://weblog.atl-r.net/memo/google-analytics09/" title="Google Analyticsの勉強メモ(9) Wordpress pluginの検討 - atl*weblog">Google Analyticsの勉強メモ(9) Wordpress pluginの検討 &#8211; atl*weblog</a></p>
				<p>で、今回やる認証ってのはこの<em>ログイン</em>をしてないとblogが見れないようにする。<br />
				具体的な遷移は、blog自体のトップページだろうが記事単体だろうがどこのアドレスに移動しようとしても、まずログイン画面に飛ばされて、ログインしたら見れるようになる、というよくある流れ。<br />
				そのやり方はめちゃ簡単で<strong>auth_redirect()</strong>って専用の関数があった。</p>
				<p><img src="http://favicon.hatena.ne.jp/?url=http://codex.wordpress.org/Function_Reference/auth_redirect" width="16" height="16" alt="" /><a href="http://codex.wordpress.org/Function_Reference/auth_redirect" title="Function Reference/auth redirect « WordPress Codex">Function Reference/auth redirect « WordPress Codex</a></p>
				<p>こんなの昔からあったっけかなぁ、なんだよ簡単すぎんじゃん。</p>
				<p>実際の使い方は<em>is_user_logged_in()</em>っていう、ログインしてるかどうか確認する関数と一緒に利用して</p>
				<pre><code class="prettyprint">
&lt;?php
if (!is_user_logged_in()) {
	auth_redirect();
}
?&gt;</code></pre>
				<p>こんな感じで書くと、ログインしてない場合はログイン画面に飛ばされるようになる、これをテンプレートのheader.phpの最初のほうにでも書いてあげるといいと思う。<br />
				なんか調べてるとwp-blog-header.phpっていうファイルに書いている人もいるようなんだけど、これだと確かに楽なんだけどwordpress本体のプログラム部分だから、やっぱwordpressのアップロードとかあった時消えちゃう可能性あると思うんだけどどーなんだろ。</p>
				<p>テンプレート構成で、header.phpを読み込まない部分があるなら別だけど、普通記事だろうがページだろうがheader.phpは読み込むと思うんで、header.phpでいいんじゃないかなぁ、自信ないけど。</p>
				<p>と思ったら、画像直リンとかってケースもあるんだった。<br />
				うーんどうしたもんかな。</p>
				<p>とりあえずwp-blog-header.phpに記述する方法を試してみたら…あれ？画像そのまま出んじゃん。<br />
				てことは画像直リンは別の方法で対策する必要がある、そしてwp-blog-header.phpに書こうがheader.phpに書こうがかわらなそうだなぁ。<br />
				画像以外でheader.phpに書かれてるんじゃ防げないアクセスってなんだろうなぁ、思いつかないしそこまで完全にアクセス禁止する事もないんでいいか。<br />
				どうしてもマズいなら.htaccess書けばなんとかなりそうだし。</p>
]]></content:encoded>
			<wfw:commentRss>http://weblog.atl-r.net/blog/tipstomake_communitysite1/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
