<?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>AKIBE</title>
	<atom:link href="http://akibe.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://akibe.com</link>
	<description>akibe&#039;s gallery and work notes.</description>
	<lastBuildDate>Wed, 18 Apr 2012 00:03:13 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>ソーシャルライブラリの読込みをコンパクトに</title>
		<link>http://akibe.com/compact-social-loader/</link>
		<comments>http://akibe.com/compact-social-loader/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 02:39:06 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[Social]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=863</guid>
		<description><![CDATA[最近はソーシャル系のウィジットを読み込む事が多くなりました。場合によっては1ページにいくつも表示する場合があると思います。 それぞれのサービスの貼付けコードをそのまま拾って来てもいいのですが、注意してコーディングしないと...]]></description>
			<content:encoded><![CDATA[<p>最近はソーシャル系のウィジットを読み込む事が多くなりました。場合によっては1ページにいくつも表示する場合があると思います。<br />
それぞれのサービスの貼付けコードをそのまま拾って来てもいいのですが、注意してコーディングしないと、同じライブラリを重複して読み込んだり、fb-rootのidが多重に配置されたりしてしまいます。</p>

<p>また、最近は大手のライブラリはほとんど非同期読み込みに対応しているので、なるべくそちらを使ったほうがいいのですが、これもまた似たようなコードばかりで無駄が多くなってしまいます。</p>

<p>そこで、「まとめ非同期読み込み」が一時期流行ったのですが、自分用に少し改造したコードをいつも忘れそうになるので、メモがわりに投稿しておきます。</p>

<h3>読込みコード</h3>

<pre class="javascript"><span class="sy0">&lt;</span>div id<span class="sy0">=</span><span class="st0">&quot;fb-root&quot;</span><span class="sy0">&gt;&lt;/</span>div<span class="sy0">&gt;</span>
<span class="sy0">&lt;</span>script type<span class="sy0">=</span><span class="st0">&quot;text/javascript&quot;</span> src<span class="sy0">=</span><span class="st0">&quot;script/ga_social_tracking.js&quot;</span><span class="sy0">&gt;&lt;/</span>script<span class="sy0">&gt;</span>
<span class="sy0">&lt;</span>script<span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span>t<span class="sy0">,</span>d<span class="sy0">,</span>s<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw2">var</span> j<span class="sy0">,</span>f<span class="sy0">=</span>d.<span class="me1">getElementsByTagName</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">,</span>a<span class="sy0">=</span><span class="kw2">function</span><span class="br0">&#40;</span>u<span class="sy0">,</span>i<span class="sy0">,</span>o<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw1">if</span><span class="br0">&#40;</span>d.<span class="me1">getElementById</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><span class="kw1">return</span><span class="sy0">;</span><span class="br0">&#125;</span>
j<span class="sy0">=</span>d.<span class="me1">createElement</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span><span class="sy0">;</span>j.<span class="me1">src</span><span class="sy0">=</span>u<span class="sy0">;</span>j.<span class="me1">id</span><span class="sy0">=</span>i<span class="sy0">||</span>null<span class="sy0">;</span>j.<span class="kw3">onload</span><span class="sy0">=</span>o<span class="sy0">||</span>null<span class="sy0">;</span>j.<span class="me1">async</span><span class="sy0">=</span><span class="kw2">true</span><span class="sy0">;</span>f.<span class="me1">parentNode</span>.<span class="me1">insertBefore</span><span class="br0">&#40;</span>j<span class="sy0">,</span>f<span class="br0">&#41;</span><span class="sy0">;</span><span class="br0">&#125;</span><span class="sy0">;</span>
&nbsp;
t._gaq<span class="sy0">=</span><span class="br0">&#91;</span><span class="br0">&#91;</span><span class="st0">&quot;_setAccount&quot;</span><span class="sy0">,</span><span class="st0">&quot;UA-XXXXXXX-X&quot;</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="st0">&quot;_trackPageview&quot;</span><span class="br0">&#93;</span><span class="sy0">,</span><span class="br0">&#91;</span><span class="st0">&quot;_trackPageLoadTime&quot;</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="sy0">;</span> <span class="co1">// GoogleAnalytics Setting</span>
a<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&quot;https:&quot;</span><span class="sy0">==</span>location.<span class="me1">protocol</span><span class="sy0">?</span><span class="st0">&quot;//ssl&quot;</span><span class="sy0">:</span><span class="st0">&quot;//www&quot;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;.google-analytics.com/ga.js&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>　<span class="co1">// GoogleAnalytics</span>
a<span class="br0">&#40;</span><span class="st0">'https://apis.google.com/js/plusone.js'</span><span class="sy0">,</span><span class="st0">'gplus1js'</span><span class="br0">&#41;</span><span class="sy0">;</span>t.___gcfg<span class="sy0">=</span><span class="br0">&#123;</span>lang<span class="sy0">:</span><span class="st0">&quot;ja&quot;</span><span class="br0">&#125;</span><span class="sy0">;</span> <span class="co1">// Google+</span>
a<span class="br0">&#40;</span><span class="st0">'//connect.facebook.net/ja_JP/all.js#xfbml=1'</span><span class="sy0">,</span><span class="st0">'fbjssdk'</span><span class="sy0">,</span>_ga.<span class="me1">trackFacebook</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Facebook</span>
a<span class="br0">&#40;</span><span class="st0">'//platform.twitter.com/widgets.js'</span><span class="sy0">,</span><span class="st0">'tweetjs'</span><span class="sy0">,</span>_ga.<span class="me1">trackTwitter</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Twitter</span>
a<span class="br0">&#40;</span><span class="st0">&quot;//b.st-hatena.com/js/bookmark_button_wo_al.js&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Hatena</span>
a<span class="br0">&#40;</span><span class="st0">&quot;//static.mixi.jp/js/share.js&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// Mixi</span>
&nbsp;
<span class="br0">&#125;</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="sy0">,</span>document<span class="sy0">,</span><span class="st0">'script'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;&lt;/</span>script<span class="sy0">&gt;</span></pre>

<p>これを body ダグの最後尾に追加しておきます。</p>

<p>2行目の「ga_social_tracking.js」は、ボタンが押されたイベントを Google Analytics に反映させるスクリプトで、<a href="http://code.google.com/p/analytics-api-samples/source/browse/trunk/src/tracking/javascript/v5/social/ga_social_tracking.js">analytics-api-samplesのページ</a>に有ります。<a href="http://analytics-api-samples.googlecode.com/svn/trunk/src/tracking/javascript/v5/social/ga_social_tracking.js">Raw Source</a>のURLで、そのまま読み込んでもいいかもしれません。</p>

<p>8行目からの a ファンクションで各ライブラリを読み込みます。これ以外のサービスも、同じような非同期読み込みに対応してる物ならば、この行の追加で対応できるかと思います。<br />
また、必要のないサービスは1行づつコメントアウトさせるだけ(Google Analyticsの場合はSettingの行も)で無効にできます。</p>

<pre><code>a( jsライブラリのURL , 生成されるタグのid , onloadで実行させるコールバック );
</code></pre>

<h3>ボタン表示コード サンプル</h3>

<pre class="html4strict"><span class="sc2">&lt;<a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a> <span class="kw3">id</span><span class="sy0">=</span><span class="st0">&quot;social-shares&quot;</span>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;g-plusone&quot;</span> data-<span class="kw3">size</span><span class="sy0">=</span><span class="st0">&quot;medium&quot;</span> data-count<span class="sy0">=</span><span class="st0">&quot;false&quot;</span> data-<span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;http://example.com&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;&lt;<a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;fb-like&quot;</span> data-send<span class="sy0">=</span><span class="st0">&quot;false&quot;</span> data-layout<span class="sy0">=</span><span class="st0">&quot;button_count&quot;</span> data-<span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;http://example.com&quot;</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/div.html"><span class="kw2">div</span></a>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;&lt;<a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a> data-<span class="kw3">text</span><span class="sy0">=</span><span class="st0">&quot;&quot;</span> data-url<span class="sy0">=</span><span class="st0">&quot;http://example.com&quot;</span> data-count<span class="sy0">=</span><span class="st0">&quot;none&quot;</span> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;http://twitter.com/share&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;twitter-share-button&quot;</span> data-<span class="kw3">lang</span><span class="sy0">=</span><span class="st0">&quot;ja&quot;</span> &gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;&lt;<a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;http://mixi.jp/share.pl&quot;</span> data-key<span class="sy0">=</span><span class="st0">&quot;XXXXXXX&quot;</span> data-url<span class="sy0">=</span><span class="st0">&quot;http://example.com&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;mixi-check-button&quot;</span>&gt;</span>mixiチェック<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
    <span class="sc2">&lt;<a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;&lt;<a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;http://b.hatena.ne.jp/entry/&quot;</span> <span class="kw3">class</span><span class="sy0">=</span><span class="st0">&quot;hatena-bookmark-button&quot;</span> data-hatena-bookmark-layout<span class="sy0">=</span><span class="st0">&quot;standard&quot;</span>&gt;&lt;<a href="http://december.com/html/4/element/img.html"><span class="kw2">img</span></a> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">&quot;http://b.st-hatena.com/images/entry-button/button-only.gif&quot;</span> <span class="kw3">alt</span><span class="sy0">=</span><span class="st0">&quot;Add Bookmark&quot;</span> <span class="sy0">/</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/li.html"><span class="kw2">li</span></a>&gt;</span>
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/ul.html"><span class="kw2">ul</span></a>&gt;</span></pre>

<p>ここでは自分の趣味で、なるべく XML名前空間 を使わずに記述しています。</p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/compact-social-loader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Livefyre 導入</title>
		<link>http://akibe.com/livefyre/</link>
		<comments>http://akibe.com/livefyre/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 18:37:15 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[Livefyre]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=845</guid>
		<description><![CDATA[以前、コメントシステムをDISQUSからFacebookに変えたのですが、それからすっかりコメントが減ってしまっていたのが気になっていたのと、新し物好きな性格が災いして、またまたコメントシステムを変えてしまいました。 L...]]></description>
			<content:encoded><![CDATA[<p>以前、コメントシステムをDISQUSからFacebookに変えたのですが、それからすっかりコメントが減ってしまっていたのが気になっていたのと、新し物好きな性格が災いして、またまたコメントシステムを変えてしまいました。</p>

<p><a href="http://www.livefyre.com/">Livefyre</a> というコメントサービスです。</p>

<p>特徴は以下のとおりです。</p>

<ul>
<li>XMPPでのリアルタイム通信</li>
<li>ソーシャルサービスとの密な連携</li>
<li>スパムをしづらい評価システム</li>
<li>今ならまだ表示が軽い</li>
</ul>

<p>サイトからのユーザー登録をした後、自分のサイトのシステムに合わせてインストールします。Wordpressは公式のプラグイン「<a href="http://wordpress.org/extend/plugins/livefyre-comments/">Livefyre Realtime Comments</a>」があるのでインストールも簡単です。<br />
ただ、インストール後、Wordpress側のコメントをLivefyreが読み込んで同期する必要があるので、既存コメントが多いサイトは最初に時間がかかるかもしれません。</p>

<p>また、プラグインがコメントテンプレートの読込みにフィルターをかけていて、その説明も詳しく書いていないので、カスタムテーマを使ってる場合等でコメント欄が表示されない場合は、テンプレートに  <code>comments_template();</code> の記述があるか確認してみましょう。</p>

<p>表示のカスタマイズは有料プランになるとフルカスタムできるらしいのですが、無料プランでもJavascriptが生成した後のHTMLソースを見ながらスタイルを当てれば多少の変更は可能なようです。</p>

<p>またそのうち変えるかもしれませんが、しばらくはこれを試してみようかと思います。</p>

<h3>追記 (2012.02.17)</h3>

<p>WordPressのプラグインで導入すると、WordPressの標準のコメントにも保存してくれて便利なのですが、なぜか現時点では IE9.js との相性が悪く（他にも原因があるかも）、IEで見た時にブラウザが固まる場合があるようなので、解決策がみつかるまでプラグインを使わずに Livefyre のコードをテンプレートに直接書いて対応してます。</p>

<pre class="html4strict"><span class="sc-1">&lt;!-- START: Livefyre Embed --&gt;</span>
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">'text/javascript'</span> <span class="kw3">src</span><span class="sy0">=</span><span class="st0">'http://zor.livefyre.com/wjs/v1.0/javascripts/livefyre_init.js'</span>&gt;&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span>
<span class="sc2">&lt;<a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">'text/javascript'</span>&gt;</span>
    var fyre = LF({
        site_id: XXXXXX,
        article_id: <span class="sc2">&lt;?php the_ID<span class="br0">&#40;</span><span class="br0">&#41;</span>; ?&gt;</span>
    });
<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/script.html"><span class="kw2">script</span></a>&gt;</span>
<span class="sc-1">&lt;!-- END: Livefyre Embed --&gt;</span></pre>

<p>LivefyreのWordPressプラグインはまだまだ完成度が低いような気がします。設定も少ないし、スクリプトもスタイルも読込みや生成が多くて整理されていない感じがします。これからに期待ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/livefyre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>パーマリンクを変えてみた</title>
		<link>http://akibe.com/change-permalink-setting/</link>
		<comments>http://akibe.com/change-permalink-setting/#comments</comments>
		<pubDate>Sat, 07 Jan 2012 18:35:42 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=797</guid>
		<description><![CDATA[そういえば WordPress 3.3 から、パーマリンクのパフォーマンス問題が解決したんだっけなー？ と思い出したので、新年改まったのを機にパーマリンク設定を変えてみました。 以前のパーマリンクのパフォーマンス問題とは...]]></description>
			<content:encoded><![CDATA[<p>そういえば WordPress 3.3 から、パーマリンクのパフォーマンス問題が解決したんだっけなー？ と思い出したので、新年改まったのを機にパーマリンク設定を変えてみました。</p>

<p>以前のパーマリンクのパフォーマンス問題とは、パーマリンクのカスタム設定で、パスの最初が定型の文字列や数字ではなく、不規則な文字列が来るような設定にすると、固定ページとの判別の為にルーティングテーブルがふくれあがりパフォーマンスが落ちるというものでした。</p>

<p>詳しい内容は <a href="http://www.warna.info/archives/1933/">Simple Colors さんの記事</a> で、これまでの状況とバージョンアップ後の結果を丁寧に解説されていますので、ご覧下さい。</p>

<h3>パーマリンク設定</h3>

<p>今までの設定</p>

<pre><code>/%year%/%monthnum%/%postname%/
</code></pre>

<p>新しい設定</p>

<pre><code>/%postname%/
</code></pre>

<h3>Nginx での rewrite 設定</h3>

<p>最後に忘れちゃいけないのが、旧URLから新URLへのリダイレクトです。これは上記の設定の時、新しいURLにリダイレクトさせるNginxでの設定です。いままでの設定に「%postname%」が無い場合は、「/?p=記事ID」にリダイレクトさせればいいでしょう。</p>

<pre><code>rewrite ^/\d{4}/\d{2}/([^/]+)/$ http://akibe.com/$1 permanent;
</code></pre>

<h3>まとめ</h3>

<p>ちょっとやり過ぎかもしれませんが、シンプルにしちゃいました。
今はカスタム投稿や、カスタム分類があってURL構成に自由度があるので、メインコントローラーがシンプルでも問題ないかなと。</p>

<p>あと、<a href="http://yoast.com/wordpress-seo-url-permalink/">WordPress向けのSEOプラグインの作者も、推奨しているようなので</a>、しばらくこれでいってみようと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/change-permalink-setting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress用のNginxのサイト設定を見直し</title>
		<link>http://akibe.com/wordpress%e7%94%a8%e3%81%aenginx%e3%81%ae%e3%82%b5%e3%82%a4%e3%83%88%e8%a8%ad%e5%ae%9a%e3%82%92%e8%a6%8b%e7%9b%b4%e3%81%97/</link>
		<comments>http://akibe.com/wordpress%e7%94%a8%e3%81%aenginx%e3%81%ae%e3%82%b5%e3%82%a4%e3%83%88%e8%a8%ad%e5%ae%9a%e3%82%92%e8%a6%8b%e7%9b%b4%e3%81%97/#comments</comments>
		<pubDate>Fri, 06 Jan 2012 16:35:55 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=754</guid>
		<description><![CDATA[かなり今更な感じもしますが、最近いろんなサイトでWordpress用のNginxのサイト設定の書き方の流行が変わって来ているようなので、改めて変更点をメモしておきます。 変更点は以下のとおりです。 パフォーマンスを重視し...]]></description>
			<content:encoded><![CDATA[<p>かなり今更な感じもしますが、最近いろんなサイトでWordpress用のNginxのサイト設定の書き方の流行が変わって来ているようなので、改めて変更点をメモしておきます。</p>

<p>変更点は以下のとおりです。</p>

<ul>
<li>パフォーマンスを重視して、fast-cgiはなるべくsocketを使うように設定。</li>
<li>最近のNginx(0.8.30以降？）は、SCRIPT_FILENAME の値が既に定義済みらしい。<br />
環境によって、fastcgi_params には無いけど、 fastcgi.conf にはあったりするので、それぞれ要確認。</li>
<li>php.ini の cgi.fix_pathinfo を 0 にするのを推奨し、それに対応。</li>
<li>RFC 3875の仕様に沿って、PATH_INFO と PATH_TRANSLATED を追加。</li>
<li>セキュリティの為、 /wp-content/uploads/ 内は PHP を起動しない。</li>
</ul>

<h3>設定サンプル</h3>

<pre><code>upstream php {
    server unix:/tmp/php-cgi.socket;
    server 127.0.0.1:9000;
}

server {
    server_name domain.tld;
    root /var/www/wordpress;
    index index.php;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_intercept_errors on;
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_script_name;
        if ($uri !~ "^/wp-content/uploads/") {
            fastcgi_pass php;
        }
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }

    location ~ /\.ht {
        deny all;
        access_log off;
        log_not_found off;
    }
}
</code></pre>

<h3>ルートじゃない場合の設定</h3>

<pre><code>location /wordpress {
    try_files $uri $uri/ /wordpress/index.php;
}
location ~ \.php$ {
    fastcgi_split_path_info ^(/wordpress)(/.*)$;
    ...
    if ($uri !~ "^/wordpress/wp-content/uploads/") {
        fastcgi_pass php;
    }
}
</code></pre>

<hr />

<p>マルチサイトの設定等も最近はよく見かけますが、自分は検証用のマルチサイトを持っていないので、紹介は控えます。</p>

<h2>追記</h2>

<p>書き忘れましたが、何らかの理由で PATHINFO パーマリンク の設定にしている場合は以下の設定が必要です。</p>

<pre><code>location ~ \.php$ {
    #下記の1行を追加
    fastcgi_split_path_info  ^(.+\.php)(.*)$;
    ...
}
</code></pre>

<h2>参考サイト</h2>

<p><a href="http://wiki.nginx.org/WordPress">http://wiki.nginx.org/WordPress</a> 他</p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/wordpress%e7%94%a8%e3%81%aenginx%e3%81%ae%e3%82%b5%e3%82%a4%e3%83%88%e8%a8%ad%e5%ae%9a%e3%82%92%e8%a6%8b%e7%9b%b4%e3%81%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>あけました。おめでたい。</title>
		<link>http://akibe.com/%e3%81%82%e3%81%91%e3%81%be%e3%81%97%e3%81%9f%e3%80%82%e3%81%8a%e3%82%81%e3%81%a7%e3%81%9f%e3%81%84%e3%80%82/</link>
		<comments>http://akibe.com/%e3%81%82%e3%81%91%e3%81%be%e3%81%97%e3%81%9f%e3%80%82%e3%81%8a%e3%82%81%e3%81%a7%e3%81%9f%e3%81%84%e3%80%82/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 15:00:12 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[NOTE]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=764</guid>
		<description><![CDATA[今年も宜しくお願いします。]]></description>
			<content:encoded><![CDATA[<p>今年も宜しくお願いします。</p>

<p><a href="http://akibe.com/wp-content/uploads/2012/01/NEW2012_akibe_iphone.jpg"><img src="http://akibe.com/wp-content/uploads/2012/01/NEW2012_akibe_iphone-200x300.jpg" alt="" title="NewYear2012" width="200" height="300" class="aligncenter size-medium wp-image-765" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/%e3%81%82%e3%81%91%e3%81%be%e3%81%97%e3%81%9f%e3%80%82%e3%81%8a%e3%82%81%e3%81%a7%e3%81%9f%e3%81%84%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FuelPHPをNginxで動かしてみる</title>
		<link>http://akibe.com/fuelphp%e3%82%92nginx%e3%81%a7%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/</link>
		<comments>http://akibe.com/fuelphp%e3%82%92nginx%e3%81%a7%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 22:20:17 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[FuelPHP]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=675</guid>
		<description><![CDATA[本当に勢いだけで参加させて頂いた FuelPHP Advent Calendar 2011 23日目 担当 @akibe です。 昨日22日は @kenji_s さんの「 FuelPHP でのセキュリティ対策(2) 」で...]]></description>
			<content:encoded><![CDATA[<p>本当に勢いだけで参加させて頂いた <a href="http://atnd.org/events/22380">FuelPHP Advent Calendar 2011</a> 23日目 担当 <a href="http://twitter.com/akibe/">@akibe</a> です。</p>

<p>昨日22日は <a href="http://twitter.com/kenji_s/">@kenji_s</a> さんの「 <a href="http://d.hatena.ne.jp/Kenji_s/20111222/1324526139">FuelPHP でのセキュリティ対策(2)</a> 」でした。</p>

<hr />

<p>丁度 Nginx に FuelPHP入れる時、あまり纏まった情報が見つからなかったので、<br />
今回はその設定と手順をメモしてみました。</p>

<h2>インストール</h2>

<p>FuelPHPのインストールはNginxとか関係ないので、通常通りインストールします。<br />
インストールには、公式サイトのマニュアル通り、oil を使ったインストールが簡単です。<br />
尚、ユーザーに sudo 権限があることと、Gitがインストールされている必要があります。</p>

<p>FuelPHPはコマンドライン無しでインストールも稼働も可能ですが、使える場合は使った方が楽です。</p>

<pre><code>$ curl get.fuelphp.com/oil | sh

   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
   100   244  100   244    0     0    396      0 --:--:-- --:--:-- --:--:--     0
   [sudo] password for username: 
</code></pre>

<p>これで oil コマンドがインストールされました。<br />
次に、サーバのウェブディレクトリに行って、oilコマンドでFuelPHPのプロジェクトを作成します。</p>

<pre><code>$ cd /var/www/
$ oil create hogehoge
</code></pre>

<p>これで /var/www/hogehoge にFuelPHPがインストールされました。</p>

<h3>手動でファイルをインストールする場合</h3>

<p>sudo権限とかGitとか無い場合は、手動でもインストール可能です。</p>

<ol>
<li><p>フレームワークをダウンロードします。<br />
<a href="http://docs.fuelphp.com/installation/download.html">http://docs.fuelphp.com/installation/download.html</a></p></li>
<li><p>zipファイルを解凍します。</p></li>
<li><p>以下のディレクトリとファイルをサーバにアップロードします。</p>

<pre><code>fuel/
    app/
    core/
    packages/
public/
    .htaccess
    assets/
    index.php
oil
</code></pre></li>
<li><p>以下のディレクトリの権限を書き込み可能にします。</p>

<pre><code>fuel/app/cache
fuel/app/logs
fuel/app/tmp
fuel/app/config
</code></pre></li>
</ol>

<p>これで完了です。</p>

<h2>Nginxの設定</h2>

<p>FuelPHPに含まれる .htaccess ファイルのrewrite設定等を、<br />
Nginx用のホスト設定に try_files で書き換えて設定してあげます。<br />
ドメインやディレクトリパスは適宜変更してください。</p>

<pre><code>server {
    listen 80;
    server_name hogehoge.example.com;
    access_log /var/log/nginx/hogehoge.access.log;
    error_log /var/log/nginx/hogehoge.error.log;
    root /var/www/hogehoge/public;
    charset utf-8;
    index index.php;

    # すべてのアクセスをindex.phpに振ります。
    location / {
        try_files $uri /index.php?$uri&amp;$args;
    }

    # phpを実行できるようにします。
    location ~ .*\.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        #fastcgi_param  FUEL_ENV production; #リリース時にはコメントを外して有効にします。
        include        fastcgi_params;
    }

    # すべての不可視ファイルをアクセス不可にします。
    location ~ /\. {
        access_log off;
        log_not_found off;
        deny all;
    }
}
</code></pre>

<h3>publicをルートにできない場合</h3>

<p>サーバの都合でpublicをルートにできない場合は、
上のコードの <code>location / {…}</code> のブロックを以下のようにします。</p>

<pre><code># すべてのアクセスをindex.phpに振ります。
location / {
    try_files $uri /public/index.php?$uri&amp;$args;
}

# FuelPHPの実行ファイルをアクセス不可にします。
location /fuel/ {
    deny all;
}
</code></pre>

<p>これで、ルートにアクセスしても、public/index.php を呼び出してくれます。<br />
また、この配置だとFuelPHPの実行ファイルが見えてしまうので、アクセス不可にします。</p>

<h3>サブディレクトリに置く場合</h3>

<p>さらに、既存サイトの一部分に使う等で、サブディレクトリに入れる場合は、以下のようになります。</p>

<pre><code>location ~ ^/sub_directory/(.*)$ {
    try_files $uri /sub_directory/public/$1 /sub_directory/public/index.php?$1;
}
location /sub_directory/fuel/ {
    deny all;
}
</code></pre>

<p>この場合、設定ファイル「fuel/app/config/config.php」の base_url の設定も必要です。</p>

<pre><code>'base_url'  =&gt; null,
    ↓
'base_url'  =&gt; '/sub_directory/',
</code></pre>

<h2>リリース時の環境変数の変更</h2>

<p>FuelPHPはデフォルトの設定で、詳細なエラー表示や、デバッグ用の設定ができるように、開発モードにセットされています。
リリース時にはこれを切り替える為に、環境変数 FUEL_ENV に production を設定する必要があります。<br />
Nginxで記述する場合は、<code>location ~ .*\.php$ {…}</code> のブロックに <code>fastcgi_param</code> で設定します。</p>

<pre><code>location ~ .*\.php$ {
    ...
    fastcgi_param  FUEL_ENV production;
}
</code></pre>

<h2>動作チェック</h2>

<p>rewrite がちゃんと動いているか確認する為に、 /hello/akibe にアクセスしてみましょう。</p>

<pre><code>http://hogehoge.example.com/hello/akibe
</code></pre>

<p><img src="http://akibe.com/wp-content/uploads/2011/12/fuelphp-img01-300x93.png" alt="" title="fuelphp-img01" width="300" height="93" class="size-medium wp-image-694" /></p>

<p>「Hello,akibe!」と表示されればOKです。</p>

<h2>最後に</h2>

<p>基本的にApache向けのシステムをNginxで動かす時に変更しなくちゃいけないのはrewriteの設定なのですが、慣れないうちは意外と悩み所なので、参考になればと思います。<br />
FuelPHPはやっと触り始めた段階ですが、サクリと何か作るには非常にレスポンスが良くていいフレームワークのような気がします。 scaffoldとか使いこなせるようになれば、かなり素早く開発ができそう。</p>

<p>あと、開発にCodeIgniterの開発者も参加してるそうですが、ネーミングが点火装置とかオイルとか燃料とか、。<br />
このノリは嫌いじゃないです。;-P</p>

<hr />

<p>いよいよ <a href="http://atnd.org/events/22380">FuelPHP Advent Calendar 2011</a> もあと2日。</p>

<p>明日24日は <a href="http://twitter.com/kenji_s/">@kenji_s</a> さんの「 <a href="http://d.hatena.ne.jp/Kenji_s/20111224/1324731427">FuelPHP でのセキュリティ対策(3)</a> 」です。</p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/fuelphp%e3%82%92nginx%e3%81%a7%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DropboxでSSLにも対応したfacebookのタブページを作る</title>
		<link>http://akibe.com/dropbox%e3%81%a7facebook%e3%83%9a%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e3%82%8b/</link>
		<comments>http://akibe.com/dropbox%e3%81%a7facebook%e3%83%9a%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e3%82%8b/#comments</comments>
		<pubDate>Wed, 21 Sep 2011 19:16:36 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=654</guid>
		<description><![CDATA[Facebookページに新たなタブを作成するには、StaticFBML等のページ作成アプリを使うと簡単便利ですが、要件に合わなかった場合に自分で作る事も多いと思います。 その場合、コンテンツは自分のサーバーでホスティング...]]></description>
			<content:encoded><![CDATA[<p>Facebookページに新たなタブを作成するには、StaticFBML等のページ作成アプリを使うと簡単便利ですが、要件に合わなかった場合に自分で作る事も多いと思います。<br />
その場合、コンテンツは自分のサーバーでホスティングする必要があります。</p>

<p>また、最近はSSL接続が必須になってきているので、ホスティングするサーバーはSSL対応である必要があります。<br />
SSL対応のサーバを借りるのも設定するのも慣れていない人には大変ですが、実はDropboxのファイル共有を使う事で、静的ファイルのみですが条件に叶ったホスティングをすることができます。</p>

<p><a href="http://db.tt/syiCqwT">Dropboxの登録はコチラから</a></p>

<h2>DropboxでFacebookページを作成する利点と欠点</h2>

<h3>利点</h3>

<ul>
<li>2Gまで無料で使える。</li>
<li>共有ファイルは、http://~ からも、https://~ からもアクセス可能。</li>
<li>ローカルで編集すれば、自動でFacebookページも更新される。</li>
<li>Dropboxのバージョン管理機能でうっかりミスしても戻せて安心。</li>
<li>クラウドなので、災害にも強い。</li>
<li>静的ファイルはなんでも置けるので、Javascript で Facebook API に接続可能。</li>
</ul>

<h3>欠点</h3>

<ul>
<li>動的なサーバーサイドプログラムは使えない。</li>
</ul>

<h2>テストコンテンツの作成</h2>

<p>まず、Dropbox上の「Public」フォルダか、新たにフォルダを作成して共有設定したフォルダに html ファイルを作成します。</p>

<pre><code>~/Dropbox/Public/fb/index.html
</code></pre>

<p>次にhtmlを書いていきます。<br />
Facebookのページと言ってもiFrameにWebページを表示させてるだけなので、なんでもOKですが、最低限<code>fb-root</code>というidのエレメントを作っておきましょう。</p>

<pre><code>&lt;!DOCTYPE html&gt;&lt;html lang="ja"&gt;
&lt;head&gt;&lt;meta charset="UTF-8"&gt;
&lt;title&gt;fbpage&lt;/title&gt;
&lt;/head&gt;&lt;body&gt;
&lt;div id="fb-root"&gt;&lt;/div&gt;
&lt;/body&gt;&lt;/html&gt;
</code></pre>

<p>これだけだと最低限すぎるので、基本形のメモとして、以下を追加します。</p>

<h3>コンテンツに応じてiFrameの高さをそろえる</h3>

<p>通常iFrameは表示するコンテンツの高さが固定されてしまいますが、Facebookのスクリプトにコンテンツの高さを計算して自動調節するコマンドがあるので、これを適用します。<br />
また、読み込むFacebookのjavascriptライブラリは本来はプロトコルを出し分けするべきですが、ここでは「https」で読み込んでいます。</p>

<pre><code>&lt;script type="text/javascript" src="https://connect.facebook.net/ja_JP/all.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
    FB.Canvas.setAutoResize();
&lt;/script&gt;
</code></pre>

<h3>ページ遷移時にページトップに移動</h3>

<p>コンテンツに応じてiFrameの高さをそろえた時、縦に長くなったiFrame内のコンテンツからリンクした時に、
親ページのスクロールは移動しない為に一瞬迷子になることがあります。これを解決する為に、iFrame内コンテンツの最上部のアンカーにリンクする事で
親ページも含めてスクロールさせることができます。いちいちリンクを書き換えるのも面倒なので、「http」から始まらないリンクに「#fb-root」を自動で付加します。</p>

<pre><code>&lt;script type="text/javascript"&gt;
(function (anchors) {
    for (var i = 0, l = anchors.length; i &lt; l; i++) {
        var link = anchors[i].getAttribute("href")+"#fb-root";
        anchors[i].setAttribute("href",link);
    }
})(document.querySelectorAll("a:not([href^='http'])"));
&lt;/script&gt;
</code></pre>

<p>これらをフッターに追加して、適当なコンテンツを入れた基本形は以下のとおりです。</p>

<pre><code>&lt;!DOCTYPE html&gt;&lt;html lang="ja"&gt;
&lt;head&gt;&lt;meta charset="UTF-8"&gt;
&lt;title&gt;fbpage&lt;/title&gt;
&lt;/head&gt;&lt;body&gt;
&lt;div id="fb-root"&gt;
&lt;p&gt;Hello World!!&lt;/p&gt;
&lt;/div&gt;
&lt;script type="text/javascript" src="https://connect.facebook.net/ja_JP/all.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
    (function (anchors) {
        for (var i = 0, l = anchors.length; i &lt; l; i++) {
            var link = anchors[i].getAttribute("href")+"#fb-root";
            anchors[i].setAttribute("href",link);
        }
    })(document.querySelectorAll("a:not([href^='http'])"));
    FB.Canvas.setAutoResize();
&lt;/script&gt;
&lt;/body&gt;&lt;/html&gt;
</code></pre>

<h2>Facebookページの登録</h2>

<p>Facebookの<a href="https://developers.facebook.com/apps">開発者ページ</a>へアクセスして、新しいアプリを作成します。
最低限設定すべき項目は以下のとおりです。</p>

<ul>
<li>設定 > Basic > 基本情報 > App Display Name
アプリの名称を記入</li>
<li>設定 > Basic > Page Tab > Page Tab Name
タブの初期名</li>
<li>設定 > Basic > Page Tab > Page Tab URL
Dropboxの共有ファイルのURL</li>
<li>設定 > Basic > Page Tab > Secure Page Tab URL
Dropboxの共有ファイルのURL(https)</li>
</ul>

<p>Dropboxの共有ファイルのURLは、先程作成したhtmlファイルのパブリックリンクURLを入力します。<br />
「Page Tab URL」のほうは http://〜 のURL</p>

<pre><code>例）　http://dl.dropbox.com/u/000000/fb/index.html
</code></pre>

<p>「Secure Page Tab URL」のほうは https://～ のURL（上記と同じURLでプロトコルをhttpsに変えるだけ）</p>

<pre><code>例）　https://dl.dropbox.com/u/000000/fb/index.html
</code></pre>

<h2>Facebookページへのタブの追加</h2>

<p>アプリの設定のページの左カラムの下のほうにある「アプリケーションのプロフィールページを見る」リンクから、アプリページを開きます。
アプリページの左カラムの下のほうにある「マイページへ追加」リンクをクリックして自分のFacebookページへ追加します。</p>

<p>これで自分のFacebookページにタブが追加されます。</p>

<h2>Dropboxの登録</h2>

<p>下記のリンクからDropboxに登録すると、最初から 500MB 増量ボーナス付きで登録できます。<br />
私にも少しボーナスがありますので、是非是非ご利用ください。</p>

<p><a href="http://db.tt/syiCqwT">Dropboxの登録はコチラから</a></p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/dropbox%e3%81%a7facebook%e3%83%9a%e3%83%bc%e3%82%b8%e3%82%92%e4%bd%9c%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 管理画面のカスタマイズ</title>
		<link>http://akibe.com/wordpress-%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba/</link>
		<comments>http://akibe.com/wordpress-%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba/#comments</comments>
		<pubDate>Sun, 18 Sep 2011 12:34:55 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=621</guid>
		<description><![CDATA[ここで書かれている内容はWP3.2での内容です。WP3.3以降は管理画面のスタイル等、多くが変更になったので、きちんと適用されない記述があります。 WordPressで作成したサイトをクライアントに納品する際、管理画面を...]]></description>
			<content:encoded><![CDATA[<p class="alertbox">ここで書かれている内容はWP3.2での内容です。WP3.3以降は管理画面のスタイル等、多くが変更になったので、きちんと適用されない記述があります。</p>

<p>WordPressで作成したサイトをクライアントに納品する際、管理画面を色々とカスタマイズしなくてはいけない場合があります。Wordpressで管理画面をカスタマイズする場合、プラグインを使う方法とfunction.phpに手動で登録する方法があります。</p>

<p>簡単便利なプラグインは検索すればすぐに見つかると思いますので、今回は手動で設定をする方法をメモしておきます。</p>

<p>WordPressでのカスタム処理は、アクセスからページ出力までの間に設定されている様々なイベントに対して、その時処理する関数を設定することで実現しています。その為、1つの処理毎に2つの命令文が必要になります。</p>

<ul>
<li>アクションフックやフィルターに、カスタム関数を登録する。</li>
<li>登録したカスタム関数を定義する。</li>
</ul>

<p>これらのコードはすべて、利用するテンプレートの function.php に記述します。</p>

<h2>ログイン画面のロゴを変更する</h2>

<p>ログイン画面のヘッダー生成のアクションフックにスタイルシートを出力する関数を登録します。<br />
ログイン画面のロゴは h1 > a のバックグラウンド画像で指定します。</p>

<pre><code>add_action('login_head', 'login_custom');
function login_custom() {
    echo '&lt;style type="text/css"&gt;h1&gt;a{background-image:url('.get_bloginfo('template_directory').'/images/login-logo.png);}&lt;/style&gt;';
}
</code></pre>

<p>カスタムロゴにして wordpress.org へのリンクを無効にするには、h1タグにロゴを貼って、aタグを消してしまうのが簡単です。</p>

<pre><code>add_action('login_head', 'login_custom');
function login_custom() {
    echo '&lt;style type="text/css"&gt;h1{background:url('.get_bloginfo('template_directory').'/images/login-logo.png) top center no-repeat;} h1&gt;a{display:none;}&lt;/style&gt;';
}
</code></pre>

<p>要はヘッダーにタグを追加しているだけなので、何でもできます。cssファイルやjavascriptファイルを読み込んで、色々とカスタマイズ可能です。<br />
ただ、外部ファイルを読み込むなら、なるべく「wp_enqueue_style」や「wp_enqueue_script」を使いましょう。</p>

<h2>管理画面のロゴを変更する</h2>

<p>管理画面のカスタマイズも、ログイン画面の変更と同じ方法で可能です。管理画面のヘッダー生成のアクションフックは「admin_head」になります。</p>

<pre><code>add_action('admin_head', 'admin_custom');
function admin_custom() {
    echo '&lt;style type="text/css"&gt;#header-logo{background-image:url('.get_bloginfo('template_directory').'/images/login-logo.png);}&lt;/style&gt;';
}
</code></pre>

<p>最近の管理画面はロゴは16&#215;16と小さめなので、新たに画像をつくらなくても、faviconを貼るだけでもいいかもしれません。</p>

<pre><code>add_action('admin_head', 'admin_custom');
function admin_custom() {
    echo '&lt;style type="text/css"&gt;#header-logo{background-image:url(/favicon.ico);}&lt;/style&gt;';
}
</code></pre>

<p>ここでは「admin_head」で直接CSSを出力していますが、「admin_print_scripts」や「admin_print_styles」といったアクションフックもあります。似たような用途でも、アクションフックの種類によって出力される位置がかわりますので、問題があった場合はいろいろ試してみましょう。</p>

<h2>管理画面のフッターテキストを変更する</h2>

<p>管理画面の最下部に、「WordPress のご利用ありがとうございます。 • ドキュメンテーション • 自由について • バグ報告と提案 • クレジット」とあります。
この表記も、クライアントに納品した場合はふさわしくない場合があります。<br />
このテキストを変更する為に、「admin_footer_text」というフィルターフックが用意されています。</p>

<pre><code>add_filter('admin_footer_text', 'custom_admin_footer');
function custom_admin_footer() {
    echo 'お困りの際は、株式会社〇〇 担当「〇〇」までお気軽にご連絡ください。 E-mail:&lt;a href="mailto:xxx@akibe.com"&gt;XXXXX&lt;/a&gt; TEL:00-0000-0000';
}
</code></pre>

<h2>余計なメニューを非表示にする</h2>

<p>サイトによってはリンクやコメントを利用しない場合もありますが、そんな時に管理画面のメニュー項目を操作できる
アクションフック「admin_menu」が用意されています。</p>

<pre><code>add_action('admin_menu', 'remove_menus');
function remove_menus () {
    global $menu;
    unset($menu[15]);//リンク
    unset($menu[25]);//コメント
}
</code></pre>

<p>どのメニューがどの項目かは、/wp-admin/menu.php を見れば解ります。</p>

<h2>プロフィールの項目を増やす</h2>

<p>プロフィールの項目って今の日本のユーザー的には微妙ですよね。<br />
そこで最近メジャーな項目を増やして、使わなそうな項目を削除します。</p>

<pre><code>add_filter('user_contactmethods','my_new_contactmethods',10,1);
function my_new_contactmethods( $contactmethods ) {
    $contactmethods['twitter'] = 'Twitter';
    $contactmethods['facebook'] = 'Facebook';
    $contactmethods['hatena'] = 'はてな';
    $contactmethods['mixi'] = 'mixi';
    $contactmethods['Flickr'] = 'Flickr';
    $contactmethods['YouTube'] = 'YouTube';
    $contactmethods['Tumblr'] = 'Tumblr';

    unset($contactmethods['aim']);
    unset($contactmethods['jabber']);

    return $contactmethods;
}
</code></pre>

<p>追加項目を表示させるには、以下のコードのように「the_author_meta」にキーを指定してテンプレートに追加します。</p>

<pre><code>&lt;?php the_author_meta('twitter'); ?&gt;
</code></pre>

<h2>デフォルトアバターを変更する</h2>

<p>標準のアバター画像も、フィルターで変更可能です。</p>

<pre><code>add_filter('avatar_defaults','avatar_custom');
function avatar_custom($avatar_defaults) {
    $myavatar = get_bloginfo('template_directory') . '/images/guest.jpg';
    $avatar_defaults[$myavatar] = "Guests";
    return $avatar_defaults;
}
</code></pre>

<h2>ビジュアルエディターに拡張ボタンを追加表示する</h2>

<p>ビジュアルエディターを利用する場合、標準では非表示になっているボタンがあります。<br />
中には便利なボタンもあるので、クライアントが使いそうなボタンをデフォルト表示にしてしまいましょう。</p>

<pre><code>add_filter("mce_buttons", "mce_custom");
function mce_custom($buttons){
    array_push($buttons, "backcolor", "copy", "cut", "paste", "fontsizeselect", "cleanup");
    return $buttons;
}
</code></pre>

<h2>管理画面のメニューカラーの変更</h2>

<p>管理画面のメニューカラーを変えるにはカスタムCSSをヘッダーに追加します。<br />
ソースを見ながらCSSを上書きすればOKですが、修正箇所が多いので以下に例を記します。</p>

<pre><code>add_action('admin_head', 'admin_custom');
function admin_custom() {
echo '&lt;style type="text/css"&gt;

/*サイドバー全体の背景と右線の色*/
#adminmenuback {
    background-color: #333;
    border-color: #222;
}

/*メニュー項目の背景と右線の色*/
#adminmenuwrap {
    background-color: #333;
    border-color: #222;
}

/* メニュー項目の上線と下線の色 */
#adminmenu a.menu-top,
.folded #adminmenu li.menu-top,
#adminmenu .wp-submenu .wp-submenu-head {
    border-top-color: #444;
    border-bottom-color: #222;
}

/* メニュー内セパレーターの背景と下線の色 */
#adminmenu li.wp-menu-separator {
    background: #222;
    border-top-color: #333;
    border-bottom-color: #111;
}
/* 上記設定で不必要になった線を削除 */
#adminmenu div.separator {
    border: none;
}

/* メニュー項目の文字色 */
#adminmenu a {
    color: #999;
}

/* アクティブなメニュー項目の文字色 */
#adminmenu a:hover {
    color: #eee;
}

/* サブメニュー項目の背景色と文字色 */
#adminmenu .wp-submenu a {
    background-color: #222;
    color: #666;
}

/* アクティブなサブメニュー項目の背景色と文字色 */
#adminmenu .wp-submenu a:hover {
    background-color: #333 !important;
    color: #eee !important;
}

/* カレントなサブメニュー項目の文字色 */
#adminmenu .wp-submenu li.current,
#adminmenu .wp-submenu li.current a,
#adminmenu .wp-submenu li.current a:hover {
    color: #aaa;
}

/* 開いたサブメニューの下線の色 */
#adminmenu li.wp-menu-open {
    border-color: #111;
}

/* カレントメニューの背景色と上下の線の色 */
#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
#adminmenu li.current a.menu-top,
.folded #adminmenu li.wp-has-current-submenu,
.folded #adminmenu li.current.menu-top,
#adminmenu .wp-menu-arrow,
#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {
    background-color: #c00;
    background-image: -ms-linear-gradient(bottom,#900,#c00);
    background-image: -moz-linear-gradient(bottom,#900,#c00);
    background-image: -o-linear-gradient(bottom,#900,#c00);
    background-image: -webkit-gradient(linear,left bottom,left top,from(#900),to(#c00));
    background-image: -webkit-linear-gradient(bottom,#900,#c00);
    background-image: linear-gradient(bottom,#900,#c00);
    border-top-color: #c00;
    border-bottom-color: #900;
}

/* カレントメニューの矢印画像 */
#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
    background: transparent url(/wp-admin/images/arrows.png) no-repeat -1px 6px;
}

/* アップデート数表示の背景色と文字色 */
#adminmenu .awaiting-mod, #adminmenu .update-plugins, #sidemenu a .update-plugins, #rightnow .reallynow {
    background-color: #666;
    color: #fff;
    -moz-box-shadow: none;
    -khtml-box-shadow: none;
    -webkit-box-shadow: none;
    box-shadow: none;
}

&lt;/style&gt;';
}
</code></pre>

<p>上記のコードを適用すると、以下のような表示になります。</p>

<p><a href="http://akibe.com/wp-content/uploads/2011/09/blog20110919.png"><img src="http://akibe.com/wp-content/uploads/2011/09/blog20110919-300x170.png" alt="" title="blog20110919" width="300" height="170" class="alignnone size-medium wp-image-636" /></a></p>

<h2>管理ページを追加する</h2>

<p>クライアントにWordpressサイトを納品する際、操作マニュアルを提供しないといけない場合があります。<br />
そんな場合には、新たにページを追加してメニューに組み込んでしまったほうが、利用しやすくなります。</p>

<pre><code>// メニューを追加
add_action('admin_menu', 'add_custom_menus');
function add_custom_menus() {

    // 新しいトップレベルメニューを追加:
    add_menu_page('マニュアル', 'マニュアル', 8, __FILE__, 'page_manual');

    // カスタムのトップレベルメニューにサブメニューを追加:
    add_submenu_page(__FILE__, '新規投稿手順', '新規投稿手順', 8, 'sub-page', 'page_manual_newpost');

    // カスタムのトップレベルメニューに二つ目のサブメニューを追加:
    add_submenu_page(__FILE__, 'コメントの管理', 'コメントの管理', 8, 'sub-page2', 'page_manual_comment');
}

// 追加したトップレベルメニューのコンテンツを表示
function page_manual() {
    echo "&lt;h2&gt;マニュアル&lt;/h2&gt;";
}

// 追加したサブメニューのコンテンツを表示
function page_manual_newpost() {
    echo "&lt;h2&gt;新規投稿手順&lt;/h2&gt;";
}

// 追加した二つ目のサブメニューのコンテンツを表示
function page_manual_comment() {
    echo "&lt;h2&gt;コメントの管理&lt;/h2&gt;";
}
</code></pre>

<p>コンテンツの量にもよりますが、実際に追加ページを作成する時は、関数で表示させるよりも、外部PHPファイルを作成するか、プラグインにしたほうがいいでしょう。<br />
詳しくは<a href="http://wpdocs.sourceforge.jp/Adding_Administration_Menus">公式ドキュメント</a>をご覧ください。</p>

<h2>リンク</h2>

<ul>
<li><a href="http://wpdocs.sourceforge.jp/プラグイン_API">プラグインAPI</a></li>
<li><a href="http://wpdocs.sourceforge.jp/プラグイン_API/アクションフック一覧">アクションフック一覧</a></li>
<li><a href="http://wpdocs.sourceforge.jp/プラグイン_API/フィルターフック一覧">フィルターフック一覧</a></li>
</ul>

<!--
## 余計なヘッダータグを削除する

    wp_deregister_script('l10n');
    remove_action('wp_head', 'wlwmanifest_link');
    remove_action('wp_head', 'rsd_link');
    remove_action('wp_head', 'wp_generator');
    remove_action('wp_head', 'feed_links', 2);
    remove_action('wp_head', 'feed_links_extra', 3);
    remove_action('wp_head', 'index_rel_link');
    remove_action('wp_head', 'parent_post_rel_link', 10);
    remove_action('wp_head', 'start_post_rel_link', 10);
    remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10);
    remove_action('wp_head', 'locale_stylesheet');
    remove_action('wp_head', 'wp_shortlink_wp_head', 10);
-->
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/wordpress-%e7%ae%a1%e7%90%86%e7%94%bb%e9%9d%a2%e3%81%ae%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Comments の導入</title>
		<link>http://akibe.com/facebook-comments-%e3%81%ae%e5%b0%8e%e5%85%a5/</link>
		<comments>http://akibe.com/facebook-comments-%e3%81%ae%e5%b0%8e%e5%85%a5/#comments</comments>
		<pubDate>Thu, 18 Aug 2011 01:48:21 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[WEB]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=569</guid>
		<description><![CDATA[Disqusのコメントプラグインを外して Facebook Comments に変更しました。 今までコメントしてくれた皆さんすいません。 DisqusはWordpressのコメントに同期してくれたりTwitterの発言...]]></description>
			<content:encoded><![CDATA[<p>Disqusのコメントプラグインを外して Facebook Comments に変更しました。
今までコメントしてくれた皆さんすいません。<br />
DisqusはWordpressのコメントに同期してくれたりTwitterの発言まで取得できて非常に便利だったんですが、スクリプトの読み込みとレンダリングが遅くて、最近は特に読み込み自体がエラーになることが頻発していました。</p>

<p>標準のコメント機能を使うのは嫌だったので、いろいろ検討した結果、スクリプトの読み込みとレンダリングが遅いのは変わりませんが、仕事で必要な気がしたので、Facebook Commentsを導入してみることにしました。<br />
というわけで、導入メモを残しておきます。</p>

<h2>簡単導入</h2>

<p>簡単に導入したい場合はプラグインがオススメです。<br />
設定も豊富で、OGPにも対応のプラグインがあるので、すぐに導入可能です。</p>

<p><a href="http://wordpress.org/extend/plugins/facebook-comments-for-wordpress/">Facebook Comments for WordPress</a></p>

<p>アプリIDを取得して、高度なセットアップをする事も可能ですし、簡単な設定ですぐに始める事も可能です。</p>

<p>ただ、これでは面白くないので、全部手動で設定してみます。</p>

<h2>コードの取得</h2>

<p>コードの取得は以下のURLから取得できます。</p>

<p><a href="https://developers.facebook.com/docs/reference/plugins/comments/">Comments &#8211; Facebook Developers</a></p>

<p>これを元に、WordpressテンプレートのPostループの中に入れてパーマリンクのタグを入れるとこんな感じです。</p>

<pre><code>&lt;?php while (have_posts()) : the_post(); ?&gt;
...
&lt;div id="fb-root"&gt;&lt;/div&gt;&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;
&lt;fb:comments href="&lt;?php the_permalink() ?&gt;" num_posts="2" width="500"&gt;&lt;/fb:comments&gt;
...
&lt;?php endwhile; ?&gt;
</code></pre>

<p>ここから、必要ない物を除いていきます。</p>

<ul>
<li><code>&lt;div id="fb-root"&gt;&lt;/div&gt;</code><br />
これは無くても動きます。というより、同画面内で「いいね」ボタンとかある場合に、生成したコードをそのまま使っていたらidカブります。</li>
<li><code>&lt;script src="http://connect.facebook.net/en_US/all.js#xfbml=1"&gt;&lt;/script&gt;</code><br />
これも、一度読み込めばよいので、ループ外のヘッダーかフッターに入れましょう。</li>
<li><code>num_posts="2" width="500"</code><br />
num_postsはデフォルトでいいや、とか。幅は後で100%指定したいからいいや、とか。で消してしまいます。</li>
</ul>

<p>ということで、必要なコードがシンプルになりました。</p>

<pre><code>&lt;fb:comments href="&lt;?php the_permalink() ?&gt;"&gt;&lt;/fb:comments&gt;
</code></pre>

<p>次に headタグ 内、もしくは bodyタグ内の最後 にスクリプトの読み込みコードを入れます。<br />
日本語環境なので、「en_US」は「ja_JP」にしましょう。</p>

<pre><code>&lt;script src="http://connect.facebook.net/ja_JP/all.js#xfbml=1"&gt;&lt;/script&gt;
</code></pre>

<p>最後に html タグの属性にネームスペースを追加します。</p>

<pre><code>&lt;html lang="ja" xmlns:fb="https://www.facebook.com/2008/fbml"&gt;
</code></pre>

<h2>横幅をコンテンツ幅に合わせる</h2>

<p>このサイトは横幅が一定範囲内で可変に作ってあるので、横幅をピクセルで指定すると都合がよくありません。またiPad等のタブレットから見る場合もあります。<br />
「width=&#8221;100%&#8221;」とか書ければいいのですが、出来ないので CSS で対応します。</p>

<pre><code>&lt;style type="text/css"&gt;
    #comment-block iframe, #comment-block .fb_iframe_widget { width: 100% !important; }
&lt;/style&gt;
&lt;div id="comment-block"&gt;
    &lt;fb:comments href="&lt;?php the_permalink() ?&gt;"&gt;&lt;/fb:comments&gt;
&lt;/div&gt;
</code></pre>

<p>これで #comment-block の幅にフィットします。</p>

<h2>iPhone対応</h2>

<p>このサイトではiPhoneへの対応に WPtouch を使っています。WPtouchはプラグイン内に専用のテンプレートを使っているのでその対応をします。
ただ、アップデートの度にテンプレートファイル全体が入れ替わってしまうので、直接編集するのは避けたいところです。<br />
そこでプラグインの設定画面の「Adsense, Stats &amp; Custom Code」の中の Stats &amp; Custom Code にコードを書きます。</p>

<p>ここに書かれた内容はHTMLのまま Bodyタグ内の最後に追加されますので、Facebookのスクリプトファイルの読み込みと、fbタグを生成するjavascriptを記述します。</p>

<pre><code>&lt;style type="text/css"&gt;
#comment-block iframe, #comment-block .fb_iframe_widget { width: 100% !important; }
&lt;/style&gt;
&lt;script src="http://connect.facebook.net/ja_JP/all.js#xfbml=1"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
(function() {
    var newdiv=document.createElement("div");
    newdiv.id = 'comment-block';
    newdiv.className = 'post';
    newdiv.innerHTML = '&lt;fb:comments href="'+location.href+'" width="300"&gt;&lt;/fb:comments&gt;';
    document.getElementById("bookmark-box").parentNode.appendChild(newdiv);
})();
&lt;/script&gt;
</code></pre>

<h2>コメントの管理</h2>

<p>Facebookでアプリケーション登録して以下のメタタグを追加すると、禁止ワードでのコメント管理や、通知機能が使えます。</p>

<pre><code>&lt;meta property=”fb:app_id” content=”{アプリケーションID}”&gt;
&lt;meta property=”fb:admins” content=”{ユーザーID}”&gt;
</code></pre>

<p>また、OGP仕様のメタタグを設定することでウォールに表示される画像を変えたりできますので、是非設定しましょう。</p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/facebook-comments-%e3%81%ae%e5%b0%8e%e5%85%a5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>サイト更新</title>
		<link>http://akibe.com/%e3%82%b5%e3%82%a4%e3%83%88%e6%9b%b4%e6%96%b0/</link>
		<comments>http://akibe.com/%e3%82%b5%e3%82%a4%e3%83%88%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 23:29:27 +0000</pubDate>
		<dc:creator>akibe</dc:creator>
				<category><![CDATA[NOTE]]></category>

		<guid isPermaLink="false">http://akibe.com/?p=541</guid>
		<description><![CDATA[このサイトも作ってから1年近くたったので、サイトをブラッシュアップしてみました。 といっても大きく変えたのは裏側なので、表側は細かい画像の変更や表示速度の最適化等であまり変わったようには見えないかもしれませんが、サーバに...]]></description>
			<content:encoded><![CDATA[<p>このサイトも作ってから1年近くたったので、サイトをブラッシュアップしてみました。<br />
といっても大きく変えたのは裏側なので、表側は細かい画像の変更や表示速度の最適化等であまり変わったようには見えないかもしれませんが、サーバに優しくなって、表示も早くなったような気がします。</p>
]]></content:encoded>
			<wfw:commentRss>http://akibe.com/%e3%82%b5%e3%82%a4%e3%83%88%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

