<?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>高橋文樹.com &#187; プログラミング</title>
	<atom:link href="http://takahashifumiki.com/topics/web/programing/feed/" rel="self" type="application/rss+xml" />
	<link>http://takahashifumiki.com</link>
	<description>小説家高橋文樹が自ら情報を発信するブログです。小説・Web制作などの話があります。</description>
	<lastBuildDate>Mon, 30 Jan 2012 04:12:12 +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>ソート考（WordPressの検索結果を絞り込み）</title>
		<link>http://takahashifumiki.com/web/programing/1829/</link>
		<comments>http://takahashifumiki.com/web/programing/1829/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 23:00:36 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[サイト運営]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1829</guid>
		<description><![CDATA[僕のブログには一覧ページというものがあるのですが、ここに最近素敵なフォームをつけました。なんと、一覧ページのソート順を変更できるんですね。誰かが羨ましがったら教えてあげようと思ったのですが、誰も聞いてこないので自分で書き [...]]]></description>
			<content:encoded><![CDATA[<p>僕のブログには一覧ページというものがあるのですが、ここに最近素敵なフォームをつけました。なんと、一覧ページのソート順を変更できるんですね。誰かが羨ましがったら教えてあげようと思ったのですが、誰も聞いてこないので自分で書きました。</p>
<p>このフォームのソースはこんな感じです。</p>
<pre class="brush: php; title: ; notranslate">
&lt;form method=&quot;get&quot; id=&quot;sorter&quot; class=&quot;dark_bg center&quot;&gt;
	&lt;p&gt;
		&lt;?php if(is_search()): ?&gt;
		&lt;label&gt;検索&lt;input type=&quot;text&quot; name=&quot;s&quot; value=&quot;&lt;?php the_search_query(); ?&gt;&quot; /&gt;&lt;/label&gt;
		&lt;?php endif; ?&gt;
		&lt;select name=&quot;order&quot;&gt;
			&lt;option value=&quot;ASC&quot;&lt;?php if(isset($_REQUEST['order']) &amp;&amp; $_REQUEST['order'] == 'ASC') echo ' selected=&quot;selected&quot;';?&gt;&gt;昇順&lt;/option&gt;
			&lt;option value=&quot;DESC&quot;&lt;?php if(!isset($_REQUEST['order']) || $_REQUEST['order'] != 'ASC') echo ' selected=&quot;selected&quot;';?&gt;&gt;降順&lt;/option&gt;
		&lt;/select&gt;
		&lt;select name=&quot;orderby&quot;&gt;
			&lt;option value=&quot;date&quot;&lt;?php if(!isset($_REQUEST['orderby']) || $_REQUEST['orderby'] == 'date') echo ' selected=&quot;selected&quot;';?&gt;&gt;公開日&lt;/option&gt;
			&lt;option value=&quot;modified&quot;&lt;?php if(isset($_REQUEST['orderby']) &amp;&amp; $_REQUEST['orderby'] == 'modified') echo ' selected=&quot;selected&quot;';?&gt;&gt;最終更新日&lt;/option&gt;
			&lt;option value=&quot;title&quot;&lt;?php if(isset($_REQUEST['orderby']) &amp;&amp; $_REQUEST['orderby'] == 'title') echo ' selected=&quot;selected&quot;';?&gt;&gt;タイトル&lt;/option&gt;
			&lt;option value=&quot;comment_count&quot;&lt;?php if(isset($_REQUEST['orderby']) &amp;&amp; $_REQUEST['orderby'] == 'comment_count') echo ' selected=&quot;selected&quot;';?&gt;&gt;コメント数&lt;/option&gt;
		&lt;/select&gt;
		&lt;input type=&quot;submit&quot; class=&quot;submit button&quot; value=&quot;SORT!&quot; /&gt;
	&lt;/p&gt;
&lt;/form&gt;
</pre>
<p>ちょっとselected属性を出すのがめんどくさいですが、ようするにGETリクエストで色々値を渡しているだけです。</p>
<h2>なんでこんなことが可能なのか</h2>
<p>この他にも色々できることはあるのですが、基本的に知っておけばいいのは、以下の2点です。</p>
<ol>
<li>WordPressはURLから求められるコンテンツを類推して表示している</li>
<li>URLはごにょごにょ解析され、最終的にquery_postsに渡される</li>
</ol>
<p>とりあえずこれを理解し、以下の例を見てみましょう。</p>
<h3>ex.1 どの一覧ページでも検索してみる</h3>
<p>たとえば、僕のブログにおいてカテゴリーWeb制作のURLは以下になります。</p>
<p>http://takahashifumiki.com/topics/web/</p>
<p>これの尻尾に検索クエリをつけてmootollsを含むURLにしてみます。</p>
<p>http://takahashifumiki.com/topics/web/?s=mootools</p>
<p>そうすると、mootoolsを含む投稿だけが表示されます。不思議ですね！</p>
<div id="attachment_1831" class="wp-caption alignnone" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/query.png"><img class="size-medium wp-image-1831" title="検索結果が表示された！" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/query-300x229.png" alt="検索結果が表示された！" width="300" height="229" /></a><p class="wp-caption-text">検索結果が表示された！</p></div>
<h3>ex.2 日付一覧を古い順にしてみる</h3>
<p>僕のブログの2011年10月のエントリー一覧は以下のURLです。</p>
<p>http://takahashifumiki.com/date/2011/10/</p>
<p>これを古い順にしてみます。</p>
<p>http://takahashifumiki.com/date/2011/10/?order=ASC</p>
<p>どうでしょう、 古い順になってますよね。</p>
<div id="attachment_1830" class="wp-caption alignnone" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/order-asc.png"><img class="size-medium wp-image-1830" title="順番が変わった！" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/order-asc-300x249.png" alt="順番が変わった！" width="300" height="249" /></a><p class="wp-caption-text">順番が変わった！</p></div>
<p>このように、WordPressはURLに色んなクエリ（?key1=value1&amp;key2=value2）を渡すことで、表示される結果がコントロールできるということです。このkeyとvalueに何を使えるかは、Codexを参考にしてください。色々あります。</p>
<h2>絞り込み検索を実装してみる</h2>
<p>おそらく需要が高いであろう絞り込み検索もそんなにめんどくさくありません。ためしに僕のサイトで、カテゴリーが「その他（ID:10）」または「文芸活動（ID:3）」に属していて、なおかつ「web」という単語を含むページの一覧を表示するためには以下のURLでOKです。</p>
<p>http://takahashifumiki.com/?s=web&#038;cat=3,10</p>
<div id="attachment_1832" class="wp-caption alignnone" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/search.png"><img class="size-medium wp-image-1832" title="検索結果で特定のカテゴリーのみ出力" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/search-300x240.png" alt="検索結果で特定のカテゴリーのみ出力" width="300" height="240" /></a><p class="wp-caption-text">検索結果で特定のカテゴリーのみ出力</p></div>
<p>つまり、こういう値を渡してくれるフォームを作ればいいだけですね。ただし、カンマ区切りで値を渡してくれるインターフェースはないので、Javascriptでサポートする必要があります。</p>
<pre class="brush: php; title: ; notranslate">

&lt;form id=&quot;search-form&quot; method=&quot;get&quot; action=&quot;&lt;?php bloginfo('url');?&gt;&quot;&gt;
   &lt;label&gt;&lt;input type=&quot;text&quot; name=&quot;s&quot; value=&quot;&lt;?php the_search_query(); ?&gt;&quot; /&gt;&lt;/label&gt;
   &lt;p&gt;
   &lt;?php
      //登録されたカテゴリーを名前の昇順で取得
      $cats = get_categories(array('orderby' =&gt; 'name', 'order' =&gt; 'asc'));
      foreach($cats as $cat){
         //ループ処理でカテゴリーを全部出力
         printf('&lt;label&gt;&lt;input class=&quot;cat&quot; type=&quot;checkbox&quot; value=&quot;%d&quot; /&gt;%s&lt;/label&gt;', $cat-&gt;term_id, $cat-&gt;name);
      }
   ?&gt;
   &lt;/p&gt;
   &lt;input type=&quot;hidden&quot; name=&quot;cat&quot; value=&quot;&quot; /&gt;
   &lt;input type=&quot;submit&quot; value=&quot;検索&quot; /&gt;
&lt;/form&gt;
</pre>
<p>本当は現在設定されているカテゴリーを選択済みにする処理などあるのが望ましいですが、割愛。<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/get_categories" target="_blank">get_categoriesについてはCodexを確認</a>してください。</p>
<p>上記で出力されたフォームだけだとcatが常に空っぽになってしまうので、こんなJavascriptを読み込みます。</p>
<pre class="brush: jscript; title: ; notranslate">
jQuery(document).ready(function($){
      //フォーム送信直前に実行
     $('#search-form').submit(function(e){
          //チェックボックスのチェック済みをすべて取得
          var cats = [];
          $('input.cat:checked').each(function(index, elt){
               cats.push($(elt).val());
          });
          //1つ以上チェックされていたら隠しinputに格納
          //なかったら削除
          if(cats.length &gt; 0){
               $('input[name=cat]').val(cats.join(','));
          }else{
               $('input[name=cat']).remove();
          }
     });
});
</pre>
<p>これでカテゴリーによる絞り込み検索は実装できます。他にもタグとかカスタムフィールドとかもできるので、色々試してみてください。ポイントはCodexをよく読むことです。</p>
<h2>さらなるカスタマイズは茨の道</h2>
<p>よくWordPressを導入した場合に言われるのが「Googleみたいに便利な検索機能をつけられないか」ということなのですが、これが難しいのは技術的な問題もさることながら、もっと高次な問題があるように思います。「ゆらぎ検索」や「低レイテンシ」などの様々な技術的難題を突破したとしても、最後に「どんな基準で表示するか」という最大の難問が発生するからです。逆に言えば、これさえわかってしまえば答えは出たも同然です。</p>
<p>Googleが便利なのは「どんな順番で検索結果を表示するとユーザーが便利だと思うか」ということだけを考えているからです。基準もちゃんと持ってます。</p>
<ul>
<li>たくさんのサイトからリンクされているWebページはいいページ</li>
<li>いいサイトからリンクされているWebページはいいページ</li>
<li>東京の人は東京の店舗情報を知りたいに違いない</li>
<li>友達が進めているWebページは気に入るに違いない</li>
</ul>
<p>最近はどんどんパーソナライズの方向へ向かっているので、Googleならびに各種検索エンジン・SNSはこうしたデータをやっきになって集めているのですね。便利さはあくまで結果でしかないわけです。</p>
<p>翻ってWordPressのことを考えてみると、よくも悪くもブログシステムが元になっているので、発想の根本がブログ（つまり日記）です。このエントリーで紹介しているソート機能というのは、突き詰めれば「コンテンツをどう評価するかの基準」ということになります。WordPressは日記が元なので、時系列がデフォルトのソート順になっています。</p>
<p>WordPressはデフォルトのままだと「いまこのサイトを誰が見ているか」も知らないし、「このページがどれだけアクセスされたか」もわかりません。評価しようにも評価するべき基準がないのです。この基準を集めるのは結構大変です。ちょっと幾つか具体例を考えてみました。</p>
<h3>ケーススタディ１ PVでソート</h3>
<p>PVというWordPressが持っていない外部的な指標によってコンテンツをソートする場合を考えてみます。これはMySQL知らなくてもできますね。僕もまだ実践したわけではなく、今度こういうのを作ろうと思っているだけなので、概要だけサラッと。</p>
<ol>
<li><a href="http://code.google.com/intl/ja/apis/analytics/docs/gdata/home.html" target="_blank">Google AnalyticsでAPIを叩いて</a>特定のURLを取得する</li>
<li>取得したPVをカスタムフィールドに保存する</li>
<li>上記の処理をwp_cronなどで毎週実行する</li>
</ol>
<p>こんな感じでPVという情報を投稿に不可することは可能です。とりあえずこれでWordPressに「どれだけの人は見たか」ということを教え込ませることはできたので、色々ソートできます。まあ、この程度のことしかやらないなら、Jetpackに入ってるstats使った方が楽ですね。</p>
<h3>ケーススタディ2 はてなブックマーク方式</h3>
<p>ここからMySQLの知識が必要になります。WordPressはデフォルトだと、タグと投稿は1対1の関係になります。これをテーブル構造的に見るとこうなります。</p>
<div id="attachment_1833" class="wp-caption alignnone" style="width: 610px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/terms1.png"><img class="size-large wp-image-1833" title="通常のタクソノミー関係構造" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/terms1-600x266.png" alt="通常のタクソノミー関係構造" width="600" height="266" /></a><p class="wp-caption-text">通常のタクソノミー関係構造</p></div>
<p>これだと、タグはあくまで投稿のメタデータにしかならず、あんまり有用な情報ではありません。日付とかと一緒ですね。</p>
<p>一方、はてなブックマークはタグとURLは紐づいていますが、さらにそのタグとURLに対する関係にユーザーが入ってきます。「誰がどのURLにどんなタグをつけたか」ということですね。これをテーブル構造的に見るとこうなります。</p>
<div id="attachment_1834" class="wp-caption alignnone" style="width: 610px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/terms2.png"><img class="size-large wp-image-1834" title="はてぶっぽいテーブル構造" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/terms2-600x255.png" alt="はてぶっぽいテーブル構造" width="600" height="255" /></a><p class="wp-caption-text">はてぶっぽいテーブル構造</p></div>
<p>これはWordPressのテーブル構造にないので、作らないといけなくなります。これは単にデータベースをphpMyAdminで作ればいいというだけのことではなく、CRUDというデータの保存・検索・更新・削除の機能をつけなくてはいけないですし、一覧ページをどうやって出力するかも考えなくてはなりません。ここら辺になるとフレームワークを使った方が早いんじゃないかなーと思い始める人が出てきますね。</p>
<p>ただ、コンテンツを漫然と並べ立てるだけでは飽き足らなくなった場合、これは避けて通れない道だと思います。Web制作業についているだけであれば、学習コストや開発工数をトレードオフして「やらない」という結論もぜんぜんアリだとは思うのですが、コストを度外視してでも実現したいものがある人は、ぜひMySQLを勉強してみることをオススメします。そうじゃないと、新しいものを作れないような気がします。その理由は次節。</p>
<h2>凡庸・オア・ダイ</h2>
<p>最近破滅派をリニューアル作業をしていてとみに思うのが、データをどのように蓄積してどのように評価するかが結局キモでありコンテンツなんだなーということです。ちょっと前ですが、はてなからGREEに移籍した<a href="http://naoya.hatenablog.com/entry/2011/11/22/234059" target="_blank">伊藤直也さんが古巣に提言した内容</a>もそうなんですが、最近ちょっとエッジの効いたサービスをやろうと思ったら、ユーザー最適化などは避けて通れないですね。ロラン・バルトが言ってた作者の死ってこういうことだったんですかね。</p>
<p>PVや「いいね!」「はてぶ」の数などの外部的な指標を上述したような単純なやり方で自分のサイトに持ち込んでも、結局は同じ結果になると思います。伊藤直也さんは「衆愚」という言葉を使っていましたが、<q cite="セオドア・スタージョン">たしかにSFの90%はクズだが、そもそもあらゆるものの90%はクズである</q>とか、<q cite="マルセル・プルースト『失われた時を求めて』">どこに国に行っても馬鹿の数が一番多い</q>とか、<q cite="ウィンストン・チャーチル">民主主義は最悪の政治制度だ、ただしこれまで試みられたあらゆる政治制度を除けば</q>と言い換えてもいいかもしれません。はてなブックマークのトップを見ていると、「いつまで部屋片付けてんだ？」「何年TOEIC勉強してんだ？」って思うことしきりですからね。こんなこと書くと炎上しますかね。</p>
<p>ともかく、集計＆ソーティングというのはすでに陳腐な技術であり、そこらへんのフリーソフトでサクッと実現できてしまいます。その結果、どんな指標を使ったにせよ、出来上がるものは大体似たようなものになってしまいまそうな予感。このままいったら僕らはみんなマトリックスにつながれて、偽物の幸福な夢を見ながらGoogleの餌になるしかないですよ。</p>
<p>ちょっと話が大きくなりましたが、ますます便利になりつつあるインターネッツの世界でエッジの効いたデータ提示をしたかったら、茨の道だけどMySQLいじるようにした方がいろいろ捗るぞというメッセージでした。</p>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/%E3%83%9E%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9-%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AB%E3%83%BB%E3%82%A8%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%90%E5%AD%97%E5%B9%95%E7%89%88%E3%80%91-VHS-%E3%82%A2%E3%83%B3%E3%83%87%E3%82%A3%E3%83%BB%E3%82%A6%E3%82%A9%E3%82%B7%E3%83%A3%E3%82%A6%E3%82%B9%E3%82%AD%E3%83%BC/dp/B00005HCUI%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00005HCUI" target="_blank"><img src="http://ecx.images-amazon.com/images/I/5166SZSKV0L._SL160_.jpg" border="0" alt="マトリックス スペシャル・エディション【字幕版】 [VHS]" /></a></p>
<p><a href="http://www.amazon.co.jp/%E3%83%9E%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9-%E3%82%B9%E3%83%9A%E3%82%B7%E3%83%A3%E3%83%AB%E3%83%BB%E3%82%A8%E3%83%87%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%90%E5%AD%97%E5%B9%95%E7%89%88%E3%80%91-VHS-%E3%82%A2%E3%83%B3%E3%83%87%E3%82%A3%E3%83%BB%E3%82%A6%E3%82%A9%E3%82%B7%E3%83%A3%E3%82%A6%E3%82%B9%E3%82%AD%E3%83%BC/dp/B00005HCUI%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3DB00005HCUI" target="_blank">マトリックス スペシャル・エディション【字幕版】 [VHS] <small>[ビデオ]</small></a></p>
<p><em>価格: </em>￥ 4,179</p><p><em>監督: </em>アンディ・ウォシャウスキー, ラリー・ウォシャウスキー</p><p><em>出演者: </em>キアヌ・リーブス</p><p><em>出版社: </em>ワーナー・ホーム・ビデオ</p><p><em>商品カテゴリー: </em>VHS</p>
<hr class="tmkm-amazon-clear" />
</div>
<div id="fastlookup_top" style="display: none;"></div>
	<ol>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1440/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/06/amazon-review-150x100.png" class="attachment-thumbnail" alt="Amazonのレビュー機能" title="Amazonのレビュー機能" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">66%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.06.25</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1440/" rel="bookmark">WordPressでデータベースを使ったプラグインを作成する</a><br />
				<p>WordPressのプラグインシステムはわりと充実しているので、テンプレートタグとフックを組み合わせれば結構簡単に作れま[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1348/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/04/options-e1302541852468-150x100.png" class="attachment-thumbnail" alt="DBの情報は取得済" title="DBの情報は取得済" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">52%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.04.12</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1348/" rel="bookmark">WordPressでbloginfoなくしてもDB負荷は減らないんじゃないかという話</a><br />
				<p>たいしたことではないのですが、WordPressのフォーラムを漁っていたら、Possible improvement o[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1266/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/01/contactmethod-150x100.png" class="attachment-thumbnail" alt="AIMとか誰も使わない" title="AIMとか誰も使わない" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">43%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.01.28</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1266/" rel="bookmark">WordPressで会員制サイトを作るときの勘所</a><br />
				<p>半ば放置ぎみだったミニコme!の開発を再開したことと、４月に控えている破滅派大リニューアルに向けてWordPressの会[...] </p>
			</div>
		</li>
			</ol>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1829/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress使ってても巨人の肩に乗れ</title>
		<link>http://takahashifumiki.com/web/programing/1821/</link>
		<comments>http://takahashifumiki.com/web/programing/1821/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 13:44:31 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[プラグイン]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1821</guid>
		<description><![CDATA[さて、先日「忠実なファンは1000人で足りるか〜電子書籍時代の皮算用〜」というエントリーをアップしてもさして話題になっていない不肖高橋ですが、己の電子書籍売上をアップすべく、またWordPressのプラグインを作って公開 [...]]]></description>
			<content:encoded><![CDATA[<p>さて、先日「<a title="忠実なファンは1000人で足りるか〜電子書籍時代の皮算用〜" href="http://takahashifumiki.com/literature/reading/1813/">忠実なファンは1000人で足りるか〜電子書籍時代の皮算用〜</a>」というエントリーをアップしてもさして話題になっていない不肖高橋ですが、己の電子書籍売上をアップすべく、またWordPressのプラグインを作って公開しました。プラグイン名を間違ったまま公開するという大チョンボをやらかしましたが、まだ9人しかダウンロードしてないしいいよね。</p>
<h2>新プラグインGianism</h2>
<p><a href="http://wordpress.org/extend/plugins/gianism/" target="_blank">http://wordpress.org/extend/plugins/gianism/</a></p>
<p>プラグイン名は「ジャイアニズム」と読みます。これは簡単に言うと、WordPressにTwitterやFacebookでログインできるようにするものです。詳しくはこのサイトの<a href="https://takahashifumiki.com/login/">ログインページ</a>を見てみてください。</p>
<div id="attachment_1824" class="wp-caption alignnone" style="width: 610px"><img class="size-large wp-image-1824" title="ログインページにボタン追加" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/a1e0bbe0d11e529f4a022c3f8d9f650f-600x422.png" alt="ログインページにボタン追加" width="600" height="422" /><p class="wp-caption-text">ログインページにボタン追加</p></div>
<p>実は<a href="http://wordpress.org/extend/plugins/social-connect/" target="_blank">Social Connect</a>というほぼ同じ機能を提供するプラグインがあったりしますが、おそらく100年待ったところで日本のサービスには対応しないだろうなと思ったので、作りました。ただ、作ってはみたものの、OAuthで接続する場合のライブラリがあったりなかったり（あってもPEARだったり）でめんどくさくなったので、mixiなどにはまだ対応していません。すいません。「mixiのヘビーユーザーってどうせ電子書籍買わないんじゃないの」という邪推があったのは内緒です。こちらもあわせてすいません。</p>
<h2>Gianismの見所</h2>
<p>というわけで、機能的に特に目新しいところはないのですが、お勉強のために車輪の再発名をしたわけではありません。このプラグインはそもそも僕のサイト用に作ったので、「Twitterやmixiのように外部サイトに対して認証機能を提供しているが、メールアドレスは渡さないサービス」向けの機能を備えています。まあ、他のプラグインをよく見ていないので、もしかしたらそういう機能があったのかもしれませんが。</p>
<p>で、どうなるかというと、GianismはWordPressで内部的に使われるメール送信関数wp_mailをフックし、そのメッセージを保存します。送信されるはずだったメールはユーザーのプロフィールページに一覧として表示され、ちょど簡易Webメールのような感じになります。</p>
<div id="attachment_1825" class="wp-caption alignnone" style="width: 610px"><img class="size-large wp-image-1825" title="プロフィールページにメッセージ一覧" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/8b83db6aced85ee00601cfad36fb4c49-600x429.png" alt="プロフィールページにメッセージ一覧" width="600" height="429" /><p class="wp-caption-text">プロフィールページにメッセージ一覧</p></div>
<p>そしてさらに、登録した外部サービスを経由して、「高橋文樹.comだけど、あなたにメッセージがあるよ http://example.jp/wp-admin/profile.php 」という具合にメッセージがある旨を教えます。</p>
<div id="attachment_1822" class="wp-caption alignnone" style="width: 547px"><img class="size-full wp-image-1822" title="TwitterにDM送信" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/a63c8a201787e1940fdd9af8fc9d9ff6.png" alt="TwitterにDM送信" width="537" height="498" /><p class="wp-caption-text">TwitterにDM送信（日本語化は完了してます）</p></div>
<p>僕が作っている電子書籍販売用プラグイン<a href="http://wordpress.org/extend/plugins/literally-wordpress/" target="_blank">Literally WordPress</a>は振込にも対応しているため、メール送信が必須です。というより、振込先をメールしないとほぼ確実に振り込んでもらえません。かといってTwitterは140文字以内という制限があるためメール全文をそのままDMも無理…というわけで、こんな仕様になりました。</p>
<p class="message notice">一応、検証してはいますが、届かない場合もあるみたいです。この機能はβ版という位置づけにしておきます。</p>
<p>あと、地味な機能ですが、FacebookのファンページでWordPressを使っている場合、その人がファンかどうかも判別できる関数もつけときました。<a href="https://www.facebook.com/TakahashiFumiki.Page" target="_blank">僕のファンページ</a>はこちらです。</p>
<p>ECショップ系のプラグインを使っている方は、うまくいけば連携できると思います。</p>
<h2>Gianismの名前の由来</h2>
<p><a title="「Facebookアプリ開発徹底入門」ePub買ってみた雑感" href="http://takahashifumiki.com/web/programing/1699/">「Facebookアプリ開発徹底入門」ePub買ってみた雑感</a>でもちょろっと書きましたが、「お前のものは俺のもの」というジャイアニズムと、プログラミングの世界でよく言われる格言「巨人の肩に乗れ」の二つをかけました。その結果としてずいぶん滑った名前になりましたが、もう出しちゃったからしょうがないです。</p>
<h2>Gianismの今後</h2>
<p>とりあえずログインまではできたのですが、なるべくよそのメディアでバズを作るような機能を盛り込んでいきたいと思います。と同時に、国産サービスでOAuthを公開しており、なおかつ良さげなAPIを備えているところも追加していきます。こんなのがあると便利ですかね。</p>
<ol>
<li>WordPress内の特定のURLをいいねしてくれたかどうかわかる</li>
<li>twitterでURLを含んだツイートが合計100RTされたかどうかわかる</li>
<li>上記の指標を累計して、ファンの忠誠度を計る</li>
</ol>
<p>なんか嫌らしい機能ばっかりですが、がんばって実装したいと思います。</p>
<h2>困ったときは</h2>
<p>使ってみて動かなかったら、この記事にコメントしてください。メールでも一応お答えするようにしますが、コメントで公開した方が同じ問題で困っている人に役立つので。</p>
<h2>その他雑感</h2>
<p>先述した「千人の忠実なファン」モデルですが、僕個人にはあんまり向いてないかなーという気もしています。僕と親しい人にはバレているのですが、ファンサービスに向いている人間ではないのです。</p>
<ul>
<li>人からメールが来ても応えない場合が結構ある</li>
<li>誘われたら行くけど自分から誘わないし誘ってくれとも言わない</li>
<li>自分が持っている名刺全部にBCCでメール送らない</li>
</ul>
<p>軽く列挙しただけでもこれだけの悪習を備えていますし、もう30歳も超えて矯正する気もないので、「高橋文樹のことを大好きで出すものを何でも買ってくれるファン」を増やすのは正直難しいんじゃないかと思っています。</p>
<p>ただそうはいってもファンを増やさないことには飢えてしまうので、「高橋文樹のことがちょっと気になっていて、何か出したら買ってみようかなと思ってくれるファン」を増やすことにしました。</p>
<p>ファンとのリレーションを保つために「自分のマメさ」とかは信頼できないので、なるべくプログラムなどで外部化したいと思います。乞うご期待。</p>
<div id="fastlookup_top" style="display: none;"></div>
	<ol>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1801/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/12/IMG_0796-150x100.png" class="attachment-thumbnail" alt="PayPalでのクレジットカード決済" title="PayPalでのクレジットカード決済" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">44%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.12.15</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1801/" rel="bookmark">Literally WordPress 0.8.8で定期購読とスマートフォン対応</a><br />
				<p>Literally WordPressを0.8.8にアップデートしました。 http://wordpress.org/e[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/919/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2010/08/wp-yomigana-150x100.png" class="attachment-thumbnail" alt="WP-Yomiganaの見栄え" title="WP-Yomiganaの見栄え" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">43%</small>
			</div>
			<div class="detail">
				<span class="mono">2010.08.20</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/919/" rel="bookmark">WordPressでrubyタグを挿入できるプラグイン作った</a><br />
				<p>というわけで、WordPressでrubyタグを挿入できるプラグインを作りました。 WP-Yomiganaのダウンロード[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1766/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/11/bank-transfer-150x100.png" class="attachment-thumbnail" alt="クレジットカード持ってない人あつまれー！" title="クレジットカード持ってない人あつまれー！" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">43%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.11.19</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1766/" rel="bookmark">Literally WordPressを0.8.6に更新</a><br />
				<p>Literally WordPressを更新しました。バージョンは0.8.6です。変更点は以下の通りです。 銀行振込に対[...] </p>
			</div>
		</li>
			</ol>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1821/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Literally WordPress 0.8.8で定期購読とスマートフォン対応</title>
		<link>http://takahashifumiki.com/web/programing/1801/</link>
		<comments>http://takahashifumiki.com/web/programing/1801/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 03:00:37 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[プラグイン]]></category>
		<category><![CDATA[電子書籍]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1801</guid>
		<description><![CDATA[Literally WordPressを0.8.8にアップデートしました。 http://wordpress.org/extend/plugins/literally-wordpress/ 変更点は以下の通りです。 定期 [...]]]></description>
			<content:encoded><![CDATA[<p>Literally WordPressを0.8.8にアップデートしました。</p>
<p><a href="http://wordpress.org/extend/plugins/literally-wordpress/" target="_blank">http://wordpress.org/extend/plugins/literally-wordpress/</a></p>
<p>変更点は以下の通りです。</p>
<ol>
<li>定期購読に対応しました。<a href="http://www.moongift.jp/" target="_blank">MOONGIFT</a>さんのようなサービスが展開可能です。</li>
<li>スマートフォンの決済画面に対応しました。iPhoneやAndroidなどでPayPalにリダイレクトした場合、専用の画面が出るようにしました。</li>
<li>決済方法を選ぶ画面を追加しました。銀行振込が追加された上に、今後もなんらかの決済方法が追加される可能性があるので。</li>
<li>ファイルをアップロード後、修正できなくなるバグを直しました。</li>
</ol>
<h2>新機能の詳しい解説</h2>
<h3>定期購読について</h3>
<p>これまでのLiterally WordPressでは、「特定の投稿に対して支払う」という機能を持っていました。定期購読というのはこれと異なり、サイトに対する「会費」のような位置づけです。</p>
<p>このサイトでも試しに実装してみましたので、お金に余裕がある方はページ末尾のリンクから試してみてください。</p>
<p>念のため書いておきますが、このサイトにおける会費は単にプラグインの動作を確認するためのものなので、会員になったからといっていいことはありません。高橋文樹.comで売っているのは電子書籍だけです。</p>
<p>MOONGIFTさんがわかりやすいのですが、同サイトは<a href="http://www.moongift.jp/moongift_premium/" target="_blank">月額500円の有料会員制</a>を敷いています。ただし、単なるアクセス権のコントロールではなく、提供しているサービスは結構多いです。</p>
<ul>
<li>記事の先行配信</li>
<li>プレミアム会員専用記事</li>
<li>記事のePubダウンロード</li>
<li>各記事が3割増（「MOONGIFTはこうみる」などのコラム的なものが追加される）</li>
</ul>
<p>Literally WordPressで実装している定期購読者用の機能は「コンテンツの指定した部分（moreタグ以降またはnextpageで区切った2ページ目以降）を表示／非表示にする」しかないので、もうちょっと工夫していく必要があります。一応、「現在のユーザーが購読者か否か」を判別する関数はあるので、ある程度プログラミングが得意な方なら色々提供できると思いますが。</p>
<h3>スマートフォンの決済画面に対応</h3>
<p><div id="attachment_1803" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/IMG_0797.png"><img class="size-medium wp-image-1803" title="PayPalでのログイン" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/IMG_0797-300x450.png" alt="PayPalでのログイン" width="300" height="450" /></a><p class="wp-caption-text">PayPalでのログイン</p></div><br />
<div id="attachment_1802" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/IMG_0796.png"><img class="size-medium wp-image-1802" title="PayPalでのクレジットカード決済" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/IMG_0796-300x450.png" alt="PayPalでのクレジットカード決済" width="300" height="450" /></a><p class="wp-caption-text">PayPalでのクレジットカード決済</p></div></p>
<p class="clrL">これはプロパティーをちょろっと追加するだけで済んだのですが、PayPalのランディングページにはスマートフォン対応のものがあったので、それを表示するようにしました。</p>
<p>あと、以前はパラメーターを間違えていたためにランディングページで価格が表示されない状態になっていましたが、それも直しました。</p>
<h3>支払い方法を選択できるように</h3>
<p><div id="attachment_1804" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/39c4621e4191546ddfb84353a7788599.png"><img class="size-medium wp-image-1804" title="支払い方法選択画面" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/39c4621e4191546ddfb84353a7788599-300x314.png" alt="支払い方法選択画面" width="300" height="314" /></a><p class="wp-caption-text">支払い方法選択画面</p></div></p>
<p>これまでは「今すぐ購入」をクリックした場合に問答無用でPayPalへリダイレクトしていましたが、ワンステップ置くようにしました。いきなりリダイレクトされるとビックリしてキャンセルしちゃうことが多いというのがアクセス解析でわかりましたゆえ。</p>
<p>今後は支払い方法が増えることも考えられますし、色んなオプションも増えて行くのでワンステップあった方がいいかなーと思います。</p>
<h2 class="clrL">今後の予定</h2>
<h3>ワンクリック購入の実装</h3>
<p>今後はgihyo.jpやVoyager Storeでも採用されているPayPal Digital Goodsを採用しようと思います。PayPalアカウントをお持ちのユーザーに対して、ワンクリック購入を実現する機能です。これにより「チャリンチャリン・ビジネス」を可能にしていたガラケー公式サイトのキャリア決済と同じように、一度ユーザーの承認を得たらすぐに決済できるようになります。これは多分Adaptive Paymentという機能を使っているので、会費の自動引き落としもできるはずです。</p>
<h3>評判を集める方法を考える</h3>
<p>有料コンテンツの難しいところなのですが、「有料だとアクセスが増えないので評判が高まらない」という問題があり、いまこれをどうやって解決したらいいのか考えています。とりあえず思いついたのは、「コンテンツリリース直後に購入してくれたユーザーがブログなりなんなりで書いてくれて、ある程度のアクセスが集まったら返金する」というのはどうかなーと考えています。アフィリエイトタグ的なものをつけて集計する必要があるかもしれませんが、はじめは適当でもいいでしょう。有名人に献本して一本釣りみたいなやり方はあんまりWebっぽくないですし、なんかズルっこしいので、最終手段にしたいと思います。まあ、一回ぐらいTwitter砲食らってみたいですが。</p>
<p>というわけで、ご興味のある方は<a href="http://wordpress.org/extend/plugins/literally-wordpress/" target="_blank">公式リポジトリ</a>からダウンロード＆インストールしてください。動かなかったらごめんなさい。</p>
<p>ちなみに、最近達人出版界さんから無料配布されている<a href="http://tatsu-zine.com/books/kk1" target="_blank">ケヴィン・ケリー著作集１</a>を読んで「1000人の忠実なファン」モデルについて色々と思うことがあったので、これについてまた後日エントリーを書く予定です。</p>
<div class="lwp-invitation"><p class="message notice">このコンテンツの続きを読むためには定期購読をする必要があります。続きが気になる方はぜひ<a href="https://takahashifumiki.com/?lwp=subscription" class="">こちらから定期購読</a>をお願いいたします。気になるお値段は<a class="" href="https://takahashifumiki.com/?lwp=pricelist&amp;popup=true" onclick="if(window.open(this.href, 'lwpPricelist', 'width=640, height=450, menubar=no, toolbar=no, scrollbars=yes, location=no')) return false;">こちら</a>！！</p></div>	<p class="message warning">
		関連する投稿はありませんでした。
	</p>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1801/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>SSLありのWordPressだけど高速化したいからCloudFlareのCDNを無料で使う</title>
		<link>http://takahashifumiki.com/web/programing/1795/</link>
		<comments>http://takahashifumiki.com/web/programing/1795/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 03:00:56 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[サーバ]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1795</guid>
		<description><![CDATA[最近WordPress界隈では高速化の話題が多いですが、僕もちょくちょく試しています。静的キャッシュのプラグインとかYahooの人が提唱している14の秘訣は昔から有名ですが、最近のホットトピックは以下の2つじゃないでしょ [...]]]></description>
			<content:encoded><![CDATA[<p>最近WordPress界隈では高速化の話題が多いですが、僕もちょくちょく試しています。静的キャッシュのプラグインとかYahooの人が提唱している14の秘訣は昔から有名ですが、最近のホットトピックは以下の2つじゃないでしょうか。</p>
<ol>
<li>nginx（特にproxy cache）による高速化</li>
<li>CDNの導入</li>
</ol>
<p>nginxのproxy cacheは<a href="http://dogmap.jp">dogmap.jp</a>か<a href="http://sakuratan.biz/archives/4582">さくらたんどっとび〜ず</a>を見れば設定できると思います。今回は2番目のCDN導入ですね。</p>
<h2>CDNとは？</h2>
<p>CDNとはコンテンツ・デリバリー・ネットワークの略でして、社長秘書みたいなものですね。普通WebサイトというのはHTML・JS・CSS・画像・その他（Flashとか）から構成されています。WordPressのようなPHPアプリケーションは最終的にHTMLを吐き出すので、ネットワーク的にはHTMLと同質になりますが、吐き出される内容は都度変わります。Amazonの「こんにちは、◯◯さん」の部分などがそうです。</p>
<p>PHPはサーバがごちゃごちゃ計算して返す必要がありますが、画像ファイルやCSSなどは単に求められているものをそのまま返せば済むので、大してリソースはいりません。</p>
<div id="attachment_1796" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/cdn-e1323379886129.jpg"><img class="size-medium wp-image-1796" title="CDNの仕組み" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/cdn-300x224.jpg" alt="CDNの仕組み" width="300" height="224" /></a><p class="wp-caption-text">CDNの仕組みはこんな感じ</p></div>
<p>社長「大事なお客さんだったら俺に教えて、どうでもいい情報だったら適当に返事しておいて」</p>
<p>秘書「御意」</p>
<p>という状況ですね。</p>
<p>で、このCDNというのは高価だったのでGoogleやAdobeという膨大なアクセスを誇るサイトしか導入できなかったのですが、最近は<a href="https://www.cloudflare.com/" target="_blank">CloudFlare</a>という無料でもオッケーなCDNが誕生してしまったのでかなり敷居が低くなってきました。設定も簡単です。<a href="http://www.ideaxidea.com/archives/2011/04/cloudflare.html" target="_blank">百式さんのサイトに導入方法が書いて</a>あります。</p>
<h2 class="clrL">CloudFlareはSSLありだと有料</h2>
<p>さて、問題はこの<a href="http://support.cloudflare.com/kb/pro-accounts/how-do-i-add-ssl-support-to-a-domain" target="_blank">CloudFlare無料版がSSLに対応していない</a>ということですね。SSLの場合はPro版（月額$20）利用者のみCloudFlareから証明書が代理で発行されるという仕様です。</p>
<p>Facebookみたいにサイト全体がSSLの場合はそれでもいいかもしれませんが、僕のサイトみたいに部分的にSSLという場合、そのためだけに年額$240払うのは嫌だなーという気分になってしまいます。まあ、ある程度収益を上げているサイトであれば、年額$240なんてタダみたいなものですが、僕のサイトはまだそうなっていないので……</p>
<h2>対応方法</h2>
<p>さて、ではどうやって対応するかです。基本的な理念は以下の通りです。</p>
<ol>
<li>SSLの場合はCDNを経由しない</li>
<li>SSLを利用しない通常のページにおいて、画像・JS・CSSはサブドメイン（ex. s.example.jp）経由で読み込む</li>
<li>CloudFlareはs.example.jpのみキャッシュする</li>
</ol>
<h3>1. サブドメインを作成する</h3>
<p>まず静的ファイルを読み込むサブドメインを作成します。example.jpであれば、s.example.jpとかでいいと思います。サブドメインの作成方法は環境によって異なるので、がんばってください。今回は下記のようなケースを想定します。</p>
<pre class="brush: perl; title: ; notranslate">
/var/www/example.jp #http://example.jpのドキュメントルート
/var/www/s.example.jp #http://s.example.jpのドキュメントルート
</pre>
<p>で、この静的ファイル用サブドメインからメインドメインへシンボリックリンクを張ります。「シンボリックリンクってなあに？」という方はググってください。SSH（黒い画面）が使えないサーバではこの方法は使えません。</p>
<pre class="brush: bash; title: ; notranslate">
cd /var/www/s.example.jp
#シンボリックリンク作成
ln -s /var/www/example.jp/wp-admin ./wp-admin
ln -s /var/www/example.jp/wp-includes ./wp-includes
ln -s /var/www/example.jp/wp-content ./wp-content
</pre>
<p>Apacheの場合は Options FollowSymLinks とかが必要ですが、よくわからない人はググってみてください。</p>
<p>さて、サーバの設定がきちんとしていれば、これでexample.jpとs.example.jpの静的ファイルは同じファイルを参照することになります。WordPressはデフォルトだと/wp-content/uploads/2011/12/photo.jpgといった具合に画像を保存しますが、下記のURLはまったく同じファイルを参照することになります。以下の2つのURLで同じ画像が表示されれば、上手く設定できているということになります。</p>
<ol>
<li>http://example.jp/wp-content/uploads/2011/12/photo.jpg</li>
<li>http://s.example.jp/wp-content/uploads/2011/12/photo.jpg</li>
</ol>
<p>これでとりあえずオーケーです。</p>
<h3>2. URLを書き換える</h3>
<p>さて、続いてURLの書き換えです。ここが一番めんどくさいんですが、がんばりましょう。</p>
<p>WordPressにおいて静的URLを読み込む方法は沢山ありますが、今回はAPIに準拠しているものみ読み込むという男前なルールで行きたいと思います。以前<a title="WordPressでbloginfoなくしてもDB負荷は減らないんじゃないかという話" href="http://takahashifumiki.com/web/programing/1348/" target="_blank">bloginfo削るメソッド意味ない</a>ということを書きましたが、なんかよくわからないURLの書き方をすると対応できないので、そういうのは切り捨てます。ob_startでなんとかするというのもありますが、やりたい人はやってみてください。</p>
<p>WordPressで静的ファイルを読み込まれるケースはだいたい以下の通りですね。</p>
<ul>
<li>テーマにbloginfo(&#8216;template_directory&#8217;)とか書いてる</li>
<li>投稿内に画像等の静的ファイルが記載される（メディアップローダでimgタグが書き込まれる場合）</li>
<li>プラグインなどによってJSやCSSがwp_headおよびwp_footerで出力される</li>
</ul>
<p>これらのURLをSSLでない限りにおいてhttp://s.example.jpに書き換えてしまえばいいんですね。テーマのfunctions.phpにこんなのを書き込みます。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * 投稿内のsrc属性をCDN対応にする
 * @param string $content
 * @return string
 */
function _my_cdn_content($content){
     if(!is_ssl()){
          $upload_dir = wp_upload_dir();
          $upload_dir_url = $upload_dir['baseurl'];
          $upload_dir_cdn_url = str_replace('http://', 'http://s.', $upload_dir_url);
          $content = str_replace($upload_dir_url, $upload_dir_cdn_url, $content);
     }
     return $content;
}
add_filter('the_content', '_my_cdn_content');

/**
 * テーマディレクトリのURLをCDN対応にする
 * @param string $url
 * @return string
 */
function _my_static_url($url){
     if(!is_ssl()){
          //SSLじゃなかったらCDN用URLに変える
          $root_uri = home_url();
          $static_uri = str_replace('http://', 'http://s.', $root_uri);
          $url = str_replace($root_uri, $static_uri, $url);
     }
     return $url;
}
add_filter('template_directory_uri', '_my_static_url');

/**
 * wp_enqueue_scriptで読み込まれたJavascriptのSRC属性をCDN対応
 * @param type $src
 * @return type
 */
function _my_script_loader_src($src){
     $home_url = home_url();
     if(!is_ssl() &amp;&amp; false !== strpos($src, $home_url)){
          $src = str_replace('http://', 'http://s.', $src);
     }
     return $src;
}
add_filter('script_loader_src', '_my_script_loader_src');

/**
 * CSSのURLを書き換える
 * @param string $tag
 * @return string
 */
function _my_style_loader_tag($tag){
     $home_url = home_url();
     if(!is_ssl() &amp;&amp; false !== strpos('href=&quot;'.$home_url, $tag)){
          $tag = str_replace('href=&quot;http://', 'href=&quot;http://s.', $tag);
     }
     return $tag;
}
add_filter('style_loader_tag', '_my_style_loader_tag');
</pre>
<p>これでサイトを確認してみて、CSSやJSのURLがhttp://s.example.jpになっていれば問題ありません。</p>
<p>なお、プラグインによってはwp_enqueue_scriptなどのAPIを使っていないことがあるので、その場合はCDNの恩恵を受けられないことになります。</p>
<h3>3. CloudFlareの設定を行う</h3>
<div id="attachment_1797" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/12/cloudflare.png"><img class="size-medium wp-image-1797" title="CloudFlareのDNS設定" src="http://s.takahashifumiki.com/wp-content/uploads/2011/12/cloudflare-300x198.png" alt="CloudFlareのDNS設定" width="300" height="198" /></a><p class="wp-caption-text">CloudFlareのDNS設定</p></div>
<p>これで問題がなければCloudFlareの設定を行います。基本的には百式さんが紹介されている方法で問題ありませんが、DNSレコードの設定だけが異なります。</p>
<p>僕のサイトの場合で紹介しますが、http://takahashifumiki.comはCDNを使いません。雲マークをクリックして、曇り空にしておきます。</p>
<p>http://s.takahashifumiki.comだけはCDNを使いたいので、これだけ晴れにしておきます。これで設定完了です。お疲れさまでした。</p>
<h2 class="clrL">CDNを導入してみて</h2>
<p><a href="http://stocker.jp/" target="_blank">Stocker.jp</a>さんに「CDNお勧めですよ」と言われてはじめたのですが、当のCloudFlareに「SSL有料だよ！」と言われて一度は絶望しかけました。でも、やればなんとかなりますね。</p>
<p>一番いいのは「月額$20なんて無料と同じやでガハハ！」というぐらいこのサイトがアクセスを稼ぐことなんですが、ぜんぜんそうなっていないので、こういう地味な工夫をせざるを得ないという事実。貧乏暇less（古館伊知郎）とはよくいったものですよ。</p>
<h2>他にできそうなWordPressの高速化</h2>
<p>このサイトはnginxなんですが、ログインがあったりするので、Proxy Cacheを導入していません。ただ、クッキー見れば「ログインしているユーザーにはキャッシュを提供しない」ということも可能ですので、がんばって設定したいと思います。できたらまたブログ書きます。</p>
<p>そういえば、<a href="http://dogmap.jp/" target="_blank">dogmap.jp</a>のをかもとさんと<a href="http://blog.gaspanik.com/about" target="_blank">こもりまさあき</a>さんがWordPress高速化の本を近々に上梓されるそうなので、この記事読んで意味わからんという人はそれを読んでみるといいかもしれません。</p>
	<ol>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1679/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_0-1-150x100.png" class="attachment-thumbnail" alt="SSL、ぼくのユーザーを守って" title="SSL、ぼくのユーザーを守って" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">171%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.11</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1679/" rel="bookmark">ぼくのユーザーを守って〜Tips on WordPress + SSL〜</a><br />
				<p>またWordPressのTips兼メモ書きです。いま色々と制作している途中なので、あと一週間はメモ書きが続きます。Web[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1667/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/tinymce-button-150x100.png" class="attachment-thumbnail" alt="選べるタグを変更" title="選べるタグを変更" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">80%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.09</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1667/" rel="bookmark">WordPressのTinyMCEをチキチキにカスタマイズする</a><br />
				<p>最近続いているWordPressエントリーの続きです。ところでみなさん、HTMLタグは好きですか？　僕はというと、特に好[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1645/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/R0010774-150x100.jpg" class="attachment-thumbnail" alt="辞書の横にあるツメ" title="辞書の横にあるツメ" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">64%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.04</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1645/" rel="bookmark">WordPressで大規模データを扱う場合のTips</a><br />
				<p>ここひと月ほどお仕事が忙しくて更新できなかったのですが、やっと一段落しました。その際、WordPressでわりと大きめの[...] </p>
			</div>
		</li>
			</ol>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1795/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Literally WordPressを0.8.6に更新</title>
		<link>http://takahashifumiki.com/web/programing/1766/</link>
		<comments>http://takahashifumiki.com/web/programing/1766/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 02:27:36 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[プラグイン]]></category>
		<category><![CDATA[電子書籍]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1766</guid>
		<description><![CDATA[Literally WordPressを更新しました。バージョンは0.8.6です。変更点は以下の通りです。 銀行振込に対応。振込で購入された場合、ユーザーのトランザクションはペンディング状態になり、入金を確認し次第管理者 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordpress.org/extend/plugins/literally-wordpress/" target="_blank">Literally WordPress</a>を更新しました。バージョンは0.8.6です。変更点は以下の通りです。</p>
<div id="attachment_1768" class="wp-caption alignright" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/11/bank-transfer.png"><img class="size-medium wp-image-1768" title="クレジットカード持ってない人あつまれー！" src="http://s.takahashifumiki.com/wp-content/uploads/2011/11/bank-transfer-300x186.png" alt="クレジットカード持ってない人あつまれー！" width="300" height="186" /></a><p class="wp-caption-text">クレジットカード持ってない人あつまれー！</p></div>
<ol>
<li>銀行振込に対応。振込で購入された場合、ユーザーのトランザクションはペンディング状態になり、入金を確認し次第管理者が手入力でステータスを変更するようになっています。</li>
<li>返金に対応。PayPalは60日以内なら支払いをキャンセルできるので、それを利用しました。銀行振込の場合は手動＆目視で対応して下さい。</li>
<li>データベース構造の変更。上記の返金機能実装にともなってデータベース構造が変更しました。dbdeltaが上手く走るか、ドキドキしてます。</li>
<li>デフォルトのファイル保護フォルダを変更。一応、デフォルトのまま使うなとは書いてありましたが、プラグインフォルダ内にあるとアップロード時に消去されてしまうので、wp-content/uploads/lwpをデフォルトにしました。ここら辺、どのプラグインも避難用フォルダを後から指定しているので、歴史は繰り返すというやつですかね。僕も自分で作ってみてはじめて気づきました。</li>
</ol>
<h2>今回の目玉機能</h2>
<p>今回の目玉機能はなんといっても銀行振込の対応でしょう。実は1週間ぐらい前に完成していたのですが、僕が個人口座のジャパンネット銀行のID＆パスワードを失効してしまったので、その再発行を待っていたため遅れたんですね。結局いまだ新しいIDは届かず、株式会社破滅派の口座を使うことにしました。</p>
<p>以前からクレジットカード以外の支払い方法を求める声は多かったので、がんばって対応しました。これで売上が全然増えなかったら、ぼくはもうテロリストになるしかないと思います。</p>
<h2>今後の予定</h2>
<p>今後は以下の機能に対応しようと思っています。</p>
<dl>
<dt>購入権に有効期限</dt>
<dd>現在、一度購入なりプレゼントなりをすると、ずっとファイルにアクセスできるようになっていますが、これに有効期限を儲けようかなと思ってます。買ってから一週間は好きなようにダウンロードできるけど、一週間経つとアクセスできなくなるという機能ですね。キャンペーンと組み合せるといいかなと。これは後述する機能に関係してます。</dd>
<dt>会費制</dt>
<dd>僕のブログなんかはあんまり関係ないですが、優良コンテンツを定期的に発信できて、ある程度のブランドがあり、無料と有料を出し分けできる編集能力がある方々におすすめです。「買ってから一週間はすべてのコンテンツにアクセスできる」というタイプですね。雑誌のようなものを出したい人に向いているんじゃないでしょうか。</dd>
<dt>成立型</dt>
<dd>CampFireとかGroupon系のサービスがそうなのですが、PayPalの返金機能が60日であることを利用し、「先にお金を集めておいて、必要額集まったらリリース」という機能に対応したいと思います。本来の利用法とは違いますし、PayPalには仮売上を計上する機能もあったとは思うのですが、どうやらPayPalアカウントを持っているユーザーにしか対応していないようなんです。返金機能は常に提供されているので、これを悪用してこの機能を実装してみようかと。60日以内に必要な金額が集まらなければバルク処理で返金を行うという凶悪仕様ですね。</dd>
<dt>UI改善</dt>
<dd>これまではユーザーが使っているテーマにフィットさせるためにカスタマイズ可能なフォームを出力するようにしていましたが、どうせみんなカスタマイズしないだろうということと、PayPalのWeb Payment Proがそもそもiframeであること、その２点を鑑みて、決済フローはiframeで提供した方がいいのかなと思うようになりました。僕はプラグインが勝手にモーダルボックスを読み込んだりするとうざいなーと思うタイプなのですが、ほとんどの人はそうではないと思うので、jQueryのいけてるモーダルボックス+iframeで決済フローを完結させたいと思っています。</dd>
</dl>
<p>というわけで、ご興味をお持ちの方は<a href="http://wordpress.org/extend/plugins/literally-wordpress/" target="_blank">公式リポジトリ</a>からダウンロードしてください。なんか電子書籍とだんだん関係なくなってきましたが、がんばって開発します。</p>
	<p class="message warning">
		関連する投稿はありませんでした。
	</p>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1766/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressショートコードの狂気と向き合う</title>
		<link>http://takahashifumiki.com/web/programing/1754/</link>
		<comments>http://takahashifumiki.com/web/programing/1754/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 15:00:06 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[プラグイン]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1754</guid>
		<description><![CDATA[Dealing with shortcode madnessというナイスエントリーを見つけたので、以前から思っていたことを。WordPressにはショートコードAPIというのがあります。以下のように書くといろんな機能を実 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://justintadlock.com/archives/2011/05/02/dealing-with-shortcode-madness" target="_blank">Dealing with shortcode madness</a>というナイスエントリーを見つけたので、以前から思っていたことを。WordPressにはショートコードAPIというのがあります。以下のように書くといろんな機能を実現してくれるというものです。Xoopsとかで使われていたBBcodeに似ていますね。</p>
<pre class="brush: xml; title: ; notranslate">
[hoge var=987923]
</pre>
<p>いまはショートコードを作りやすくするプラグインなどもあるので、使っている人も多いことでしょう。たとえば、このブログではtmkm-amazonというプラグインを使っていて、これはAmazonのアフィリエイトリンクを表示してくれます。こんな感じ。</p>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/%E9%80%94%E4%B8%AD%E4%B8%8B%E8%BB%8A-%E5%B9%BB%E5%86%AC%E8%88%8E%E6%96%87%E5%BA%AB-%E9%AB%98%E6%A9%8B-%E6%96%87%E6%A8%B9/dp/4344406850%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4344406850" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51V3PRYWQ0L._SL160_.jpg" border="0" alt="途中下車 (幻冬舎文庫)" /></a></p>
<p><a href="http://www.amazon.co.jp/%E9%80%94%E4%B8%AD%E4%B8%8B%E8%BB%8A-%E5%B9%BB%E5%86%AC%E8%88%8E%E6%96%87%E5%BA%AB-%E9%AB%98%E6%A9%8B-%E6%96%87%E6%A8%B9/dp/4344406850%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4344406850" target="_blank">途中下車 (幻冬舎文庫) <small>[書籍]</small></a></p>
<p><em>価格: </em>￥ 480</p><p><em>著者: </em>高橋 文樹</p><p><em>出版社: </em>幻冬舎</p><p><em>出版日: </em>2005-08</p><p><em>商品カテゴリー: </em>文庫</p><p><em>ページ数: </em>168</p><p><em>ISBN: </em>4344406850</p>
<hr class="tmkm-amazon-clear" />
</div>
<div id="attachment_1755" class="wp-caption alignright" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/11/tidy-shortcode.png"><img class="size-medium wp-image-1755" title="これだけのショートコードはいらない！" src="http://s.takahashifumiki.com/wp-content/uploads/2011/11/tidy-shortcode-300x240.png" alt="これだけのショートコードはいらない！" width="300" height="240" /></a><p class="wp-caption-text">これだけのショートコードはいらない！</p></div>
<p>さて、件のエントリーではだいたい以下のようなことが語られていました。</p>
<ul>
<li>最近<a href="http://themeforest.net/" target="_blank">Theme Forest</a>とかを見ていると、どうでもいいショートコードを搭載したテーマが増えているようだ</li>
<li>pタグにclass属性を付与するだけのショートコードになんの意味があるのか</li>
<li>テーマに付属のショートコードを使ってしまうとそのテーマに縛られるのでよくない！</li>
</ul>
<p>これに対し、コメントではこんな議論がありました。</p>
<ul>
<li>たしかにその通りだけど、ショートコード便利だよ！</li>
<li>テーマに縛られるって、テーマ開発者からすればおいしいよね</li>
<li>クライアントにそんなこと行っても意味ない</li>
<li>TinyMCEカスタマイズしてボタンつければ全部解決</li>
<li>いまなら同意できるけど、正直初心者のときはdivでくくるだけのショートコード作ってたよ！</li>
</ul>
<p>いわゆる「べき論」なので、意見はそれぞれだと思います。個人的に「divでくくるだけならTinyMCEのボタン作れや」という意見には賛成なので、手前味噌ですが、<a title="WordPressのTinyMCEをチキチキにカスタマイズする" href="http://takahashifumiki.com/web/programing/1667/">TinyMCEをチキチキにカスタマイズする</a>などを読んでください。</p>
<p>さて、人の書いたブログを紹介するだけではしょうがないので、これから僕が考えるショートコードの「べき論」を展開してみたいと思います。</p>
<h2>ショートコードのいいところと悪いところ</h2>
<p>ショートコードのいいところはもちろん便利なところですが、「誰にとって便利か」というと、<strong>作る人にとって便利</strong>ということですね。使う側にとってはHTMLもショートコードもマークアップの仕方が違うだけで大して変わらないので、上のエントリーで述べられているようにボタン作ってくれるのが一番いいんでしょうが、TinyMCEのボタンを作るのはけっこうめんどくさいです。ショートコード作って「はい、終り！」ってできるとすごい楽です。その結果として、沢山のショートコードが生まれましたね。「functions.phpに貼っておいてね！」で動くんですから。</p>
<p>一方、悪いところは投稿内に明らかなゴミデータが混入してしまうことです。これはよくあるケースですが、そのテーマやプラグインがWordPressコアのバージョンアップに追随しなくなったとき、これが露見します。テーマに引きずられてバージョンアップできなかったり、他のテーマを使えなかったりする場合もあれば、プラグイン作者が開発を停止してしまってむき出しのショートコードが投稿内に表示されることもあります。上述したWP Tmkm Amazonの場合はけっこう長い間使っていたのに開発者さんがモチベーションを失って開発を終了してしまったので、<a title="WP tmkm Amazonを動くように修正" href="http://takahashifumiki.com/web/programing/1712/">自分で修正</a>して使い続けています。</p>
<p>というわけで、「利便性」と「失ったときのリスク」をはかりにかけてショートコードを使う必要がありそうです。<strong>「とりあえず使ってみる」のは避けるべき</strong>かもしれません。</p>
<h2>ショートコードはどんなときに使うべきか</h2>
<p>これはテーマ・開発者側の視点です。次の2つぐらいしか思いつかないですね。</p>
<ol>
<li>動的に内容が変更されるもの（AmazonやTwitterのAPIを叩いたり、ユーザーによって表示を変えたり）</li>
<li>YoutubeやGoogleマップの埋め込みタグのように、出力されるコードの動的な変更は必要としないが、先方の都合で仕様が変わりうるもの</li>
</ol>
<p>2に関しては、外部APIよりもプラグイン・テーマ作者が力つきる方が先のような気もします。</p>
<h2>ショートコードを使わなくなったらどうする？</h2>
<p>テーマを変更したり、プラグインを停止したりして使われなくなったショートコードはそのまま出力されてしまいます。これでは困るので、表示されないようにしましょう。</p>
<pre class="brush: php; title: ; notranslate">
function _abandoned_shortcodes($atts, $content=''){
     return $content;
}
//ショートコードの数だけ登録。hogeの部分をショートコードに
add_shortcode('hoge', '_abandoned_shortcodes');
add_shortcode('fuga', '_abandoned_shortcodes');
</pre>
<p>これで囲み型も独立型もいけるんじゃないかと思います。場合によっては空行ができてしまったりするとは思いますが、しょうがないですね。もしショートコードを一括削除するプラグインとかあったら、教えてください。</p>
<h2>WordPressのプラグインとテーマは分離できるのか</h2>
<p>この問題の原因は、プラグインとテーマの役割がかぶっていることにつきると思います。WordPressはウィジェットやショートコード、管理画面の作成など、ほとんどのことをテーマから出来てしまいます。</p>
<p>テーマがいわゆるMVCモデルのビューファイルのようなものであれば、こうした問題は発生しなかったでしょう。ただ、その場合はここまで普及したか疑問ですね。PHP自体がそもそもそういう言語ですが、あまりスキルの高くない人でもそれなりのことができてしまうというのがWordPressの魅力なので。</p>
<p>きちんとしたガイドラインがあれば嬉しいことは嬉しいのですが、正典なきWebの世界ではガイドラインを作ることも参加者の役割なので、いろんな人の書いたいろんな記事を参考にしていくしかないですね。この記事もその一助になることを祈って、筆を置きます。</p>
	<ol>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1712/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/tmkm-amazon-150x100.png" class="attachment-thumbnail" alt="Tmkm Amazonの管理画面" title="Tmkm Amazonの管理画面" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">70%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.29</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1712/" rel="bookmark">WP tmkm Amazonを動くように修正</a><br />
				<p>先日唐揚げを食べようとしていたら、親切な方から「おたくのWordPressさん、落ちてますよ」と教えてもらいました。どう[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1655/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/screenshot-1-150x100.png" class="attachment-thumbnail" alt="Never Let Me Go設定画面" title="Never Let Me Go設定画面" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">54%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.06</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1655/" rel="bookmark">GREEよりひどいWordPressの退会機能をなんとかするプラグイン</a><br />
				<p>GREEが退会できないというネタがちょっと話題になっていたので便乗しようと思ったのですが、今朝スティーブ・ジョブズが亡く[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1699/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/facebook-application-development-150x100.png" class="attachment-thumbnail" alt="Gihyoの電子書籍サイト" title="Gihyoの電子書籍サイト" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">50%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.20</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1699/" rel="bookmark">「Facebookアプリ開発徹底入門」ePub買ってみた雑感</a><br />
				<p>このサイトでも電子書籍は売ってますが、よそ様の電子書籍を買わないのも変な話なので、買ってみました。技術評論社の「Face[...] </p>
			</div>
		</li>
			</ol>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1754/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP tmkm Amazonを動くように修正</title>
		<link>http://takahashifumiki.com/web/programing/1712/</link>
		<comments>http://takahashifumiki.com/web/programing/1712/#comments</comments>
		<pubDate>Sat, 29 Oct 2011 08:37:25 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[プラグイン]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1712</guid>
		<description><![CDATA[先日唐揚げを食べようとしていたら、親切な方から「おたくのWordPressさん、落ちてますよ」と教えてもらいました。どうしたことかと思ってみて見ると、シングルページが中身からっぽになってしまいました。 色々調べると、Am [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1713" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/tmkm-amazon.png"><img class="size-medium wp-image-1713" title="Tmkm Amazonの管理画面" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/tmkm-amazon-300x199.png" alt="Tmkm Amazonの管理画面" width="300" height="199" /></a><p class="wp-caption-text">Tmkm Amazonの管理画面</p></div>
<p>先日唐揚げを食べようとしていたら、親切な方から「おたくのWordPressさん、落ちてますよ」と教えてもらいました。どうしたことかと思ってみて見ると、シングルページが中身からっぽになってしまいました。</p>
<p>色々調べると、Amazonの商品情報を出す<a href="http://wppluginsj.sourceforge.jp/wp-tmkm-amazon/" target="_blank">wp tmkm Amazonというプラグイン</a>がエラーを起こしてコケてたんですね。このサーバはnginxというのを使っているのですが、設定ミスでログを吐かなくなっているので、特定に時間がかかっちゃいました。</p>
<p>で、このプラグインは作者さんがすでに更新を停止されているので、待っていても直らないので、自分で直しました。</p>
<p>必要な方は以下からダウンロードしてください。</p>
<p><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/wp-tmkm-amazon.zip">WP Tmkm Amazonのダウンロード</a></p>
<p>変更点は以下になります。</p>
<ul>
<li>PHP4対応だったので書き直し、5.3でもエラーが出ないように</li>
<li>手元にあったファイルを直しただけなので、元が誰のかは不明。</li>
<li>よくわからないJSフォルダなどを消した</li>
<li>管理画面からアソシエイトIDなどを入力できるように</li>
<li>リクエストをキャッシュするように変更</li>
<li>リストを出力する関数があるが、ページネーションが変なので、そこはもう知らない。１ページにずらーっと出します。</li>
</ul>
<p>以前もフォーラムでこっそり配ったことがあるので、もし僕がつくったやつを使っている危篤かな方がいたら、以下の変更点に注意してください。</p>
<ul>
<li>PEAR依存をやめて、API叩く部分を自前のコードに書き換え</li>
<li>XMLパーサーをSimpleXMLElementに、キャッシュシステムをWordPressのTransient APIに</li>
<li>画像は24時間ぐらいキャッシュしなきゃいけないような気がしたけど、ドキュメントあさってもわかんなかった</li>
</ul>
<p>アップロード手順はこんな感じです。</p>
<ol>
<li>以前のプラグインを停止する</li>
<li>Amazon Web ServiceとAmazonアフィリエイトに登録して、アクセスIDなどを取得する。</li>
<li>wp-tmkm-amazonプラグインフォルダを全部削除する</li>
<li>ダウンロードしたzipを解凍してアップロード</li>
<li>プラグインを有効化する</li>
<li>管理画面の設定 &gt; WP Tmkm Amazonへ移動し、速攻でアクセスID、シークレットアクセスIDを入力する</li>
</ol>
<p>手順5から手順6の間にサイトを訪問されるとエラーになりますので急いでください。</p>
<p>このプラグインを緊急避難的にメンテナンスしてますが、他にもやってる人がいるっぽいですね。ランダムにアソシエイトIDを僕のに書き換えるような設定にすればやるき出るかなーと思いました。動作確認のため、「アフィリエイト」で検索して出てきた書籍をぺたぺた貼っておきますね。</p>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/%E3%82%A2%E3%83%95%E3%82%A3%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%88%E3%81%AE%E9%81%94%E4%BA%BA%E9%A4%8A%E6%88%90%E8%AC%9B%E5%BA%A7-%E4%BC%8A%E8%97%A4-%E5%93%B2%E5%93%89/dp/4798113719%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798113719" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41cUMSx54CL._SL160_.jpg" border="0" alt="アフィリエイトの達人養成講座" /></a></p>
<p><a href="http://www.amazon.co.jp/%E3%82%A2%E3%83%95%E3%82%A3%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%88%E3%81%AE%E9%81%94%E4%BA%BA%E9%A4%8A%E6%88%90%E8%AC%9B%E5%BA%A7-%E4%BC%8A%E8%97%A4-%E5%93%B2%E5%93%89/dp/4798113719%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798113719" target="_blank">アフィリエイトの達人養成講座 <small>[書籍]</small></a></p>
<p><em>価格: </em>￥ 1,764</p><p><em>著者: </em>伊藤 哲哉, 坂巻 隆之, 今村 仁彦</p><p><em>クリエーター: </em>鈴木 将司, 鈴木 将司</p><p><em>出版社: </em>翔泳社</p><p><em>出版日: </em>2007-08-28</p><p><em>商品カテゴリー: </em>単行本（ソフトカバー）</p><p><em>ページ数: </em>320</p><p><em>ISBN: </em>4798113719</p>
<hr class="tmkm-amazon-clear" />
</div>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/%E3%82%A2%E3%83%95%E3%82%A3%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%88%E3%81%AE%E7%8E%8B%E9%81%93-%E4%BC%8A%E8%97%A4-%E5%93%B2%E5%93%89/dp/479812169X%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D479812169X" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51mG-GdFBKL._SL160_.jpg" border="0" alt="アフィリエイトの王道" /></a></p>
<p><a href="http://www.amazon.co.jp/%E3%82%A2%E3%83%95%E3%82%A3%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%88%E3%81%AE%E7%8E%8B%E9%81%93-%E4%BC%8A%E8%97%A4-%E5%93%B2%E5%93%89/dp/479812169X%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D479812169X" target="_blank">アフィリエイトの王道 <small>[書籍]</small></a></p>
<p><em>価格: </em>￥ 1,575</p><p><em>著者: </em>伊藤 哲哉</p><p><em>出版社: </em>翔泳社</p><p><em>出版日: </em>2010-05-29</p><p><em>商品カテゴリー: </em>大型本</p><p><em>ページ数: </em>200</p><p><em>ISBN: </em>479812169X</p>
<hr class="tmkm-amazon-clear" />
</div>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%BB%E3%82%A2%E3%83%95%E3%82%A3%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%88%E3%81%B8%E3%81%AE%E9%81%93%E2%80%95%E3%81%82%E3%81%AA%E3%81%9F%E3%81%8C%E7%A8%BC%E3%81%92%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1%E6%95%99%E3%81%88%E3%81%BE%E3%81%99-%E6%A3%AE%E7%94%B0-%E6%85%B6%E5%AD%90/dp/4883374947%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4883374947" target="_blank"><img src="http://ecx.images-amazon.com/images/I/41STHJ4C5YL._SL160_.jpg" border="0" alt="プロフェッショナル・アフィリエイトへの道―あなたが稼げない理由教えます" /></a></p>
<p><a href="http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%83%BB%E3%82%A2%E3%83%95%E3%82%A3%E3%83%AA%E3%82%A8%E3%82%A4%E3%83%88%E3%81%B8%E3%81%AE%E9%81%93%E2%80%95%E3%81%82%E3%81%AA%E3%81%9F%E3%81%8C%E7%A8%BC%E3%81%92%E3%81%AA%E3%81%84%E7%90%86%E7%94%B1%E6%95%99%E3%81%88%E3%81%BE%E3%81%99-%E6%A3%AE%E7%94%B0-%E6%85%B6%E5%AD%90/dp/4883374947%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4883374947" target="_blank">プロフェッショナル・アフィリエイトへの道―あなたが稼げない理由教えます <small>[書籍]</small></a></p>
<p><em>価格: </em>￥ 1,680</p><p><em>著者: </em>森田 慶子</p><p><em>出版社: </em>ソシム</p><p><em>出版日: </em>2006-08</p><p><em>商品カテゴリー: </em>単行本</p><p><em>ページ数: </em>255</p><p><em>ISBN: </em>4883374947</p>
<hr class="tmkm-amazon-clear" />
</div>
	<p class="message warning">
		関連する投稿はありませんでした。
	</p>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1712/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「Facebookアプリ開発徹底入門」ePub買ってみた雑感</title>
		<link>http://takahashifumiki.com/web/programing/1699/</link>
		<comments>http://takahashifumiki.com/web/programing/1699/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 03:00:26 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[プラグイン]]></category>
		<category><![CDATA[電子書籍]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1699</guid>
		<description><![CDATA[このサイトでも電子書籍は売ってますが、よそ様の電子書籍を買わないのも変な話なので、買ってみました。技術評論社の「Facebookアプリ開発徹底入門」ePubです。 本来書評というモノは内容を云々するものですが、電子書籍に [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1700" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/facebook-application-development.png"><img class="size-medium wp-image-1700" title="Gihyoの電子書籍サイト" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/facebook-application-development-300x229.png" alt="Gihyoの電子書籍サイト" width="300" height="229" /></a><p class="wp-caption-text">Gihyoの電子書籍サイト</p></div>
<p>このサイトでも電子書籍は売ってますが、よそ様の電子書籍を買わないのも変な話なので、買ってみました。技術評論社の<a href="http://gihyo.jp/dp/ebook/2011/978-4-7741-4754-3" target="_blank">「Facebookアプリ開発徹底入門」ePub</a>です。</p>
<p>本来書評というモノは内容を云々するものですが、電子書籍に限ってはまだ内容以外の部分が重要かなと思いますので、そちらから雑感を書いてみます。</p>
<h2 class="clrL">購入に至った動機と価格について</h2>
<p>現在このサイトで電子書籍は売っていますが、いちいちユーザー登録してもらわないと買ってもらえない（電子書籍は大体そうだと思いますが）ので、FacebookとかTwitterでログインできるようにしたいと思っていました。</p>
<p>ただFacebookの場合はソーシャルグラフAPIとか、ファンゲートとか面白そうな機能が沢山あるので、もうちょっと体系的に学べる情報が欲しいなーと思っていたところでした。</p>
<p>色々ググった結果、<a href="http://www.h-fj.com/blog/" target="_blank">The blog of H.Fujimoto</a>というブログを発見。このブログにFacebookアプリ開発の情報は沢山書いてあったのですが、技術評論社の電子書籍販売サイト<a href="http://gihyo.jp/dp/ebook/2011/978-4-7741-4754-3" target="_blank">GIHYO DIGITAL PUBLISHING</a>から電子書籍を出しているというのでチェックしてみました。この手の専門書としては1,000円という低価格だったのでその場で購入。一応リアル書籍も調べてみましたが、大体2,000円代後半でした。この価格差は魅力的ですね。</p>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/facebook%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E9%B3%A5%E4%BA%BA%E9%96%93-%E9%83%B7%E7%94%B0%E3%81%BE%E3%82%8A%E5%AD%90/dp/4048703048%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4048703048" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51cpsfFs5YL._SL160_.jpg" border="0" alt="facebookアプリケーション開発ガイド" /></a></p>
<p><a href="http://www.amazon.co.jp/facebook%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%82%AC%E3%82%A4%E3%83%89-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E9%B3%A5%E4%BA%BA%E9%96%93-%E9%83%B7%E7%94%B0%E3%81%BE%E3%82%8A%E5%AD%90/dp/4048703048%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4048703048" target="_blank">facebookアプリケーション開発ガイド <small>[書籍]</small></a></p>
<p><em>価格: </em>￥ 2,940</p><p><em>著者: </em>株式会社鳥人間 郷田まり子</p><p><em>出版社: </em>アスキー・メディアワークス</p><p><em>出版日: </em>2011-04-27</p><p><em>商品カテゴリー: </em>大型本</p><p><em>ページ数: </em>320</p><p><em>ISBN: </em>4048703048</p>
<hr class="tmkm-amazon-clear" />
</div>
<h2>読書体験について</h2>
<h3>複数端末での読書</h3>
<div id="attachment_1705" class="wp-caption alignleft" style="width: 160px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0730.png"><img class="size-thumbnail wp-image-1705" title="設定 &gt; iBooksでブックマークを同期" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0730-150x100.png" alt="設定 &gt; iBooksでブックマークを同期" width="150" height="100" /></a><p class="wp-caption-text">設定 &gt; iBooksでブックマークを同期</p></div>
<p>iPadおよびiPhoneのiBooksに入れて読んだのですが、これ自体はそんなに不便ではなかったです。いまではiOS5 &amp; iCloudが出たので、ブックマークも同期できるようになりました。まだここら辺の同期にはKindleに一日の長がありますが、ないよりははるかにマシです。</p>
<h3 class="clrL">iPhoneでの読書</h3>
<div id="attachment_1703" class="wp-caption alignleft" style="width: 160px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0728.png"><img class="size-thumbnail wp-image-1703" title="コードはちょっと見辛い" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0728-150x100.png" alt="コードはちょっと見辛い" width="150" height="100" /></a><p class="wp-caption-text">コードはちょっと見辛い</p></div>
<p>移動中はiPhone、家ではiPadで読んだのですが、iPhoneだとこの手のコードが書いてある本はちょっと辛いですね。インデントなどで整形されたコードもiPhoneの縦画面で見ると折り返しまくりで見辛いです。iPhone4だとRetinaディスプレイなので文字サイズ最小にしても視認性は高いですが、コードは見辛いです。これはもうしょうがないですね。</p>
<h3 class="clrL">検索性</h3>
<div id="attachment_1704" class="wp-caption alignleft" style="width: 160px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0729.png"><img class="size-thumbnail wp-image-1704" title="検索はちょっともっさり" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0729-150x100.png" alt="検索はちょっともっさり" width="150" height="100" /></a><p class="wp-caption-text">検索はちょっともっさり</p></div>
<p>iBooksの検索はもっさりしてました。ちょっと残念ですね。</p>
<p>ただ、個人的には「書籍内全文検索」ってあんまり使わないかなーと。よっぽどの大著なら別ですけど、そういう書籍はだいたい辞書やリファレンスだと思いますので、索引や目次などがしっかりしているでしょう。それよりは本棚検索というか、「こういうことが書いてある本ってどれだっけ？」という機能が重要な気がします。</p>
<p>目次はしっかりリンクが貼ってあって便利でした。</p>
<h3 class="clrL">その他見映え上の感想</h3>
<p>基本的にはきちんとデザインされたものでしたが、ビューアーの制約などもあるので、幾つか。</p>
<h4>テキスト両端揃え</h4>
<p>iBooksは日本語の両端揃えができず、半角スペースなどでしか字間が調整されなかったのですが、この書籍ではすべての読点をカンマにし、半角英数の前後にスペースを入れることで調整しています。</p>
<p>ただし、iOS5のiBooksはどうやら日本語の両端揃えに対応したようですので、これも今となってはバッドノウハウですね。僕も自分のePubを直そうと思ってます。</p>
<h4>表組</h4>
<div id="attachment_1706" class="wp-caption alignleft" style="width: 160px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0731.png"><img class="size-thumbnail wp-image-1706" title="ページをまたいだ表は見辛い" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/IMG_0731-150x100.png" alt="ページをまたいだ表は見辛い" width="150" height="100" /></a><p class="wp-caption-text">ページをまたいだ表は見辛い</p></div>
<p>表組は情報を見やすく整理するための工夫ですが、iPhoneだとあんまり見やすくないですね。項目の内容が増えてしまうと、とたんに見にくくなってしまいます。ページにまたがると項目名が見えないとか、しょっちゅう起きてました。「表組を使った方がいいケース」はかなり限られてくるのではないでしょうか。</p>
<h2 class="clrL">内容についての感想</h2>
<p>「Facebookアプリ開発徹底入門」がカバーしている範囲はその名の通り、Facebookアプリケーション開発の基本についてです。Web上の情報を検索して個別のハックを学んでいくより、ざっと概要を学んで基本は全部抑えておきたいという方にオススメです。</p>
<p>PC用アプリケーションが.NETなのは少し残念でしたが、それ以外は必要なポイントを抑えてあります。</p>
<p>個人的に役立ったのはFacebookアプリを作るにあたってのパーミッションの概念と、付録についていたFQLリファレンスでした。FQLというのはFacebook上のユーザーデータをSQLのように取得できる機能なのですが、これについての解説が助かりました。</p>
<h2>成果物 WP Gianism</h2>
<div id="attachment_1701" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/facebook.png"><img class="size-medium wp-image-1701" title="高橋文樹Facebookファンページ" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/facebook-300x195.png" alt="高橋文樹Facebookファンページ" width="300" height="195" /></a><p class="wp-caption-text">高橋文樹Facebookファンページ</p></div>
<p>僕もこれを読み終え、簡単なアプリケーションを作ることができました。まだ途中なのですが、FacebookでWordPressへのログイン・会員登録ができるプラグインです。プラグイン名WP Gianismには「おまえのものは俺のもの」ということで、よそのWebサービスのユーザー情報を自分のもののように使うという意味を込めてます。これだけ名前で滑っているプラグインを僕は見たことがありません。</p>
<p>なにはともあれ、このプラグインを作ったおかげで<a href="https://www.facebook.com/TakahashiFumiki.Page" target="_blank">高橋文樹ファンページ</a>とWordPressを連携させることができました。WordPressに会員登録してさらに「いいね！」してくれた人を判別できます。あとはプレゼントを渡すだけなんですが、プレゼントを準備している最中なので、今はなにもありません。</p>
<p>プラグイン自体はまだ未完成なのですが、使いたい人は<a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/wp-gianism.zip" target="_blank">ここ</a>からダウンロードしてください。Twitter連携できるようになったら公式リポジトリに上げます。</p>
<h2 class="clrL">その他雑感</h2>
<p>僕はこれまで「専門書などのニーズが小さく利益率の低いものは電子書籍に向いていて、大衆向けなどのマーケットが大きいものは利益率の高い紙の書籍で儲けるのがよい」と漠然と思っていたのですが、最近はそうでもないのかなーと考えています。</p>
<p>クリステンセンの「イノベーションのジレンマ」には、破壊的な新技術によって陳腐化された旧技術の成功者は高級化・ハイエンド路線をとりやすいと書いてありましたからね。入門書・新書・文庫などのローエンド市場を電子書籍が低価格で蹂躙して、高価な専門書を紙で出すように変わっていくような気が最近はしています。</p>
<blockquote><p>「有力企業がいとも簡単にハイエンド市場へと移行できるのはなぜか。下の市場へ移動することがこれほど難しいのはなぜか」<cite>クレイトン・クリステンセン著　伊豆原弓訳『イノベーションのジレンマ』翔泳社、2001年</cite></p></blockquote>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/%E3%82%A4%E3%83%8E%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B8%E3%83%AC%E3%83%B3%E3%83%9E%E2%80%95%E6%8A%80%E8%A1%93%E9%9D%A9%E6%96%B0%E3%81%8C%E5%B7%A8%E5%A4%A7%E4%BC%81%E6%A5%AD%E3%82%92%E6%BB%85%E3%81%BC%E3%81%99%E3%81%A8%E3%81%8D-Harvard-business-school-press/dp/4798100234%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798100234" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51A8W7U0cSL._SL160_.jpg" border="0" alt="イノベーションのジレンマ―技術革新が巨大企業を滅ぼすとき (Harvard business school press)" /></a></p>
<p><a href="http://www.amazon.co.jp/%E3%82%A4%E3%83%8E%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%82%B8%E3%83%AC%E3%83%B3%E3%83%9E%E2%80%95%E6%8A%80%E8%A1%93%E9%9D%A9%E6%96%B0%E3%81%8C%E5%B7%A8%E5%A4%A7%E4%BC%81%E6%A5%AD%E3%82%92%E6%BB%85%E3%81%BC%E3%81%99%E3%81%A8%E3%81%8D-Harvard-business-school-press/dp/4798100234%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4798100234" target="_blank">イノベーションのジレンマ―技術革新が巨大企業を滅ぼすとき (Harvard business school press) <small>[書籍]</small></a></p>
<p><em>価格: </em>￥ 2,100</p><p><em>著者: </em>クレイトン・クリステンセン</p><p><em>クリエーター: </em>玉田 俊平太, 伊豆原 弓</p><p><em>出版社: </em>翔泳社</p><p><em>出版日: </em>2001-07</p><p><em>商品カテゴリー: </em>単行本</p><p><em>ページ数: </em>327</p><p><em>ISBN: </em>4798100234</p>
<hr class="tmkm-amazon-clear" />
</div>
	<p class="message warning">
		関連する投稿はありませんでした。
	</p>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1699/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ぼくのユーザーを守って〜Tips on WordPress + SSL〜</title>
		<link>http://takahashifumiki.com/web/programing/1679/</link>
		<comments>http://takahashifumiki.com/web/programing/1679/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 03:00:22 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[サイト運営]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1679</guid>
		<description><![CDATA[またWordPressのTips兼メモ書きです。いま色々と制作している途中なので、あと一週間はメモ書きが続きます。Web興味ない人に呆れられてて悲しいです。 タイトルに特に意味はありませんが、特定の年齢層に響くかと思って [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_1680" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_0-1.png"><img class="size-medium wp-image-1680" title="SSL、ぼくのユーザーを守って" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_0-1-300x201.png" alt="SSL、ぼくのユーザーを守って" width="300" height="201" /></a><p class="wp-caption-text">SSL、ぼくのユーザーを守って</p></div>
<p>またWordPressのTips兼メモ書きです。いま色々と制作している途中なので、あと一週間はメモ書きが続きます。Web興味ない人に呆れられてて悲しいです。</p>
<p>タイトルに特に意味はありませんが、特定の年齢層に響くかと思ってこれにしました。</p>
<h2 class="clrL">WordPressでSSLを導入するケース</h2>
<p>だいたい以下の2パターンあります。今回のエントリーでは僕のように少ない人的・金銭的リソースで会員制サービスを行っている人に向けた情報を記載します。</p>
<h3>管理画面（と公開画面のごく一部）だけ保護すればよい</h3>
<p>これはよくあるケースだと思うのですが、WordPressを企業用CMSとしてカスタマイズした場合などに当てはまります。この場合、SSLで通信を保護する対象は「ユーザーが使うお問い合わせフォーム」と「管理者が使う管理画面」ぐらいでしょう。これに関しては大して難しいことはなくて、<a href="http://wordpress.org/extend/plugins/admin-ssl-secure-admin/">Admin SSL</a>などのプラグインを使えば実現できます。</p>
<h3>公開画面に保護すべきページが沢山ある</h3>
<p>このケースは1番目のケースと同じくプラグインで対応できる場合もありますが、僕のように無謀にも会員制サイトを作っていて、ユーザーデータに紐づいたページ（マイページなど）が沢山ある場合はある程度WordPressの中の仕組みに詳しくなっておいた方がいいと思います。</p>
<p>上記の場合、すべてのページを自分で作っているとは限らなくて、なんらかのプラグインによってページやURLが生成されるケースもあると思います。そのプラグインがSSLへの対応をしていないと困ったことになってしまうので、自力で直せるようにしておきましょう。今回の記事はほとんどこっちのケースです。</p>
<h2>管理画面・ログインのSSLを有効にする</h2>
<p>自分でSSLを設定する場合はwp-config.phpに以下を記載してください。どちらかでもいいですし、両方書いても特に問題はありません</p>
<pre class="brush: php; title: ; notranslate">
//管理画面はSSLじゃないと駄目という設定
define('FORCE_SSL_ADMIN', true);
//ログイン画面はSSLじゃないと駄目という設定
define('FORCE_SSL_LOGIN', true);
</pre>
<h2>会員制サイトにおける共有SSLと独自SSL</h2>
<p>これはWordPress自体の問題ではないのですが、多くのWPerは共有サーバ上で走っていることと思います。どこのレンタルサーバも「共有SSL」というものを用意しています。たとえばこのサイトは以前さくらのレンタルサーバを使っていたのですが、そのときの共有SSLのURLは http://xxx.sakura.ne.jp/main でした。要するに、ドメインが変わっちゃうんですね。</p>
<p>WordPressのログイン情報はクッキーを利用しており、基本的に別ドメインのクッキーを読み取ることはブラウザの仕様上できません。読み取れたら、それはブラウザとして欠陥があります。</p>
<p>それでもなんとかログイン情報を取得して動かすことはできるのですが、ちょっとハックっぽいことをしないと動かないので、もし会員情報必須でSSLも必要なのであれば、きちんと独自SSLをとることをお勧めします。ハックするコストを考えると、素直に独自SSLにしちゃった方が楽だったりしますからね。サーバ証明書もホスティング代金もだいぶ安くなっているので、検討してみてください。</p>
<table>
<thead>
<tr>
<th>サーバ種別</th>
<th>サービス名称</th>
<th>サーバ費用（月額）</th>
<th>独自SSL費用（年額）</th>
<th>設定方法</th>
</tr>
</thead>
<tbody>
<tr>
<td>レンタルサーバ</td>
<td><a href="http://heteml.jp" target="_blank">ヘテムル</a></td>
<td>1,500円</td>
<td>18,000円</td>
<td>管理画面から申し込み</td>
</tr>
<tr>
<td>VPS</td>
<td><a href="http://vps.sakura.ad.jp/" target="_blank">さくらVPS</a></td>
<td>980円〜</td>
<td>2,000円〜</td>
<td>黒い画面でカタカタコマンドを打って設定</td>
</tr>
</tbody>
</table>
<p>他にも<a href="http://www.coreserver.jp/" target="_blank">CoreServer.jp</a>とかも独自SSLを使えるみたいですね。ちなみに僕のサイトは最近<a href="http://vps.sakura.ad.jp/" target="_blank">さくらVPS512</a>に引っ越して、<a href="http://www.sslbox.jp/" target="_blank">SSLボックス</a>で買った2,000円の証明書を使ってます。nginxにしたら早くなったし、年額もこれまでと大して変わらなくて嬉しいですよ。</p>
<h2>公開画面をSSLにして注意すべきこと</h2>
<p>このサイトでは<a title="お問い合わせ" href="http://takahashifumiki.com/inquiry/" target="_blank">お問い合わせ</a>などがそうなのですが、注意すべきことが幾つかあります。</p>
<p>SSLで保護されたページの中にSSLで保護されていない画像やCSSなどを読み込むと警告が出ます。SafariとかFirefoxだとあまり気づかないですが、IEだとアラートが出てしまうので、詳しくないユーザーがビビって逃げちゃうんですね。</p>
<h3>SSLページで読み込むべきでない外部サービスは表示しない</h3>
<p>SSLで保護されたページにおいて画像等を読み込む場合は同様にSSLで保護されている必要があります。WordPressにはこの機能がきちんと備わっていて、たとえばスタイルシートなどは自動でURLが書き変わります。</p>
<pre class="brush: php; title: ; notranslate">
bloginfo('stylesheet_url');
//通常
//→ http://takahashifumiki.com/wp-content/themes/takahashifumiki/style.css
//ページがSSLのとき
//→ https://takahashifumiki.com/wp-content/themes/takahashifumiki/style.css
</pre>
<div id="attachment_1682" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_2.png"><img class="size-medium wp-image-1682" title="外部サービスのJS・CSS・画像に注意" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_2-300x196.png" alt="外部サービスのJS・CSS・画像に注意" width="300" height="196" /></a><p class="wp-caption-text">外部サービスのJS・CSS・画像に注意</p></div>
<p>WordPress内部のコンテンツはこれで大丈夫なのですが、駄目なのが外部APIを使っている場合です。たとえば、このサイトだとTwitterウィジェットやInstagramなどがそれにあたります。これは相手が対応してくれないことにはどうしようもないので、対応するまでは表示しないようにしましょう。ログイン画面にTwitterウィジェットなくても困らないですからね。</p>
<p>WordPressは現在のページがSSLかどうかを判定する関数を持ってますので、それを使えばいいでしょう。</p>
<pre class="brush: php; title: ; notranslate">
//SSLじゃないときだけサイドバーを読み込む
if(!is_ssl()){
     get_sidebar();
}
</pre>
<p>このサイトでは二段あるフッターの一段目を外部サービスでまとめ、SSL時に非表示にするようにしました。</p>
<p>ちなみに、Google系のサービス（Analyticsとか、Google+とか）はわりかしSSLに対応しています。お金持ちだからでしょう。GravatarとかWordPress.comのサービスもちゃんとSSL対応してますね。Automaticもお金がたまってきたんでしょうか。</p>
<h3>投稿内のURLは自動で書き変わらないので書き換える</h3>
<p>たとえばこのサイトのように「お問い合わせ」をSSLにして、その投稿内に画像を挿入したとしましょう。そうすると、こういうソースが投稿に入ると思います。</p>
<pre class="brush: xml; title: ; notranslate">
&lt;img src=&quot;http://s.takahashifumiki.com/wp-content/uploads/2011/10/hoge.jpg&quot; /&gt;
</pre>
<p>このSRC属性がSSLのとき不味いので、こんなフックをfunctions.phpに書きます。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * SSLのコンテンツが表示されているときにsrcなどを修正する
 * @param string $content
 * @return string
 */
function _replace_ssl_content($content){
     if(is_ssl()){
          $upload_dir = wp_upload_dir();
          $upload_dir_url = $upload_dir['baseurl'];
          $upload_dir_ssl_url = str_replace('http:', 'https:', $upload_dir_url);
          $content = str_replace($upload_dir_url, $upload_dir_ssl_url, $content);
     }
     return $content;
}
add_filter('the_content', '_replace_ssl_content');
</pre>
<p>WordPressのアップロード機能を使って保存されたファイルのURLはhttpsに上書きするというものですね。</p>
<h3>リンクがすべてhttpsになるのを書き換える</h3>
<div id="attachment_1681" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_1.png"><img class="size-medium wp-image-1681" title="タグクラウドまでhttpsに…" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_1-300x151.png" alt="タグクラウドまでhttpsに…" width="300" height="151" /></a><p class="wp-caption-text">タグクラウドまでhttpsに…</p></div>
<p>一度SSLを有効にするとわかるのですが、公開ページでSSLを有効にすると、WordPressの出力するリンクがすべてhttpsになってしまいます。</p>
<p>このサイトでいえば、タグクラウドとか、カテゴリーメニューとか、ページメニューとかが全部httpsになってしまうんですね。基本的にSSL通信は負荷が高いので、必要のないところでは無効にしておきたいところです。</p>
<p>この原因はなにかというと、WordPressのルートURLを返す関数home_urlがSSL通信のときにhttpsでURLを返すことです。リンク出力系の関数はほとんどこの関数を使っているので、全部httpsになってしまうという寸法ですね。</p>
<p>スタイルシートやJavaScript、画像等はSSLのままでもいいのですが、トップページへのリンクまでhttpsに変わるのは困るという問題を解決するためには、こんなものをfunctions.phpに書いておきます。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * SSLページですべてのリンクがHTTPSになってしまうのを修正する
 * @param string $url
 * @param string $path
 * @param string $orig_scheme
 * @return string
 */
function _ssl_home_url($url, $path = '', $orig_scheme = 'http'){
     if(is_ssl() &amp;&amp; strpos($path, 'wp-content') === false){
          $url = str_replace('https:', 'http:', $url);
     }
     return $url;
}
add_filter('home_url', '_ssl_home_url');
</pre>
<p>アップロードディレクトリを変更している場合とかは駄目かもしれませんが、僕のサイトはこれで直りました。</p>
<h3>SSLに対応していないプラグインの挙動を修正する</h3>
<p>これはどんなプラグインを使っているかによるため、漠然としたことしか言えないのですが、プラグインによってはすべてのページで外部のJavascriptを書き込んだり、リンクのURLを書き換えるものがあります。こうした「お行儀の悪いプラグイン」の後始末をすることが必要になるケースがあります。幾つか具体例を上げます。</p>
<h4>Theme My Loginの場合</h4>
<p>このサイトでは<a href="http://wordpress.org/extend/plugins/theme-my-login/" target="_blank">Theme My Login</a>というプラグインを使っています。このプラグインは公開側でオリジナルのログイン画面を作れる機能を持っており、<a href="http://codex.wordpress.org/Function_Reference/wp_login_url" target="_blank">wp_login_url</a>（ログイン画面へのリンクを出力するテンプレートタグ）を書き換える機能を持っているのですが、SSLには対応していません。ソース上は「ここでFORCE_SSL_LOGINをチェック」と書いてあるのですが、実際はチェックしていないんですね。なので、こんな風に修正する必要がありました。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * SSLが有効な場合はURLをhttpsにして返す
 * @param string $url
 * @return string
 */
function _my_login_ssl($url){
     if(FORCE_SSL_LOGIN || FORCE_SSL_ADMIN){
          $url = str_replace('http:', 'https:', $url);
     }
     return $url;
}
add_filter('login_url', '_my_login_ssl');
add_filter('register', '_my_login_ssl');
add_filter('logout_url', '_my_login_ssl');

/**
 * Theme My Loginが出力する管理画面へのURLをSSLにする
 * @param string $url
 * @param string $action
 * @param int|string $instance
 * @return string
 */
function _my_admin_ssl($url, $action = 'login', $instance = ''){
     switch($action){
          case 'login':
          case 'register':
          case 'lostpassword':
          case 'retrievepassword':
          case 'resetpass':
          case 'rp':
               if(FORCE_SSL_LOGIN || FORCE_SSL_ADMIN){
                    $url = str_replace('http:', 'https:', $url);
               }
               break;
          default:
               if(FORCE_SSL_ADMIN){
                    $url = str_replace('http:', 'https:', $url);
               }
               break;
     }
     return $url;
}
add_filter('tml_action_url', '_my_admin_ssl');
</pre>
<h4>Disqusの場合</h4>
<p>コメントフォームをソーシャル化してくれる<a href="http://wordpress.org/extend/plugins/disqus-comment-system/" target="_blank">Disqus</a>ですが、これもSSLに対応していないJSをすべてのページで読み込んでしまうため、Javascriptの書き込みを削除しなくてはなりません。「どこでJavascriptを書き込んでいるか」を見つけるには、プラグインが出力したであろうソースをコピペしてフォルダ内検索するのがお手軽です。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * DisqusのスクリプトがSSLでも読み込まれるのを防止
 * @return void
 */
function _my_remove_disqus(){
     if(is_ssl()){
          remove_action('wp_footer', 'dsq_output_footer_comment_js');
     }
}
add_action('wp_footer', '_my_remove_disqus', 1);
</pre>
<p>というわけで、利用しているプラグインによっては作業が増えたりするので、SSLを導入する場合は注意してください。</p>
<h2>次回予告</h2>
<p>というわけでSSLの設定についてあれこれ書いてきましたが、これでようやくFacebookページとWordPressの連携に着手できそうです。FacebookページもSSL必須となるようですし、しっかり設定しておきましょう。「いいねしてくれたら電子書籍あげるよ！」とか、「Facebookアカウントで会員登録orログインできるよ！」という機能を作る予定なので、お楽しみに。僕のFacebookページは<a href="https://www.facebook.com/TakahashiFumiki.Page" target="_blank">こちら</a>です。</p>
<div class="tmkm-amazon-view">
<p><a href="http://www.amazon.co.jp/%E3%81%BC%E3%81%8F%E3%81%AE%E5%9C%B0%E7%90%83%E3%82%92%E5%AE%88%E3%81%A3%E3%81%A6-%E7%AC%AC1%E5%B7%BB-%E7%99%BD%E6%B3%89%E7%A4%BE%E6%96%87%E5%BA%AB-%E6%97%A5%E6%B8%A1-%E6%97%A9%E7%B4%80/dp/4592884019%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4592884019" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51K4TnRQBAL._SL160_.jpg" border="0" alt="ぼくの地球を守って (第1巻) (白泉社文庫)" /></a></p>
<p><a href="http://www.amazon.co.jp/%E3%81%BC%E3%81%8F%E3%81%AE%E5%9C%B0%E7%90%83%E3%82%92%E5%AE%88%E3%81%A3%E3%81%A6-%E7%AC%AC1%E5%B7%BB-%E7%99%BD%E6%B3%89%E7%A4%BE%E6%96%87%E5%BA%AB-%E6%97%A5%E6%B8%A1-%E6%97%A9%E7%B4%80/dp/4592884019%3FSubscriptionId%3D0Q5JKQGKGX1PM5K1CPG2%26tag%3Dtakahashifumiki-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4592884019" target="_blank">ぼくの地球を守って (第1巻) (白泉社文庫) <small>[書籍]</small></a></p>
<p><em>価格: </em>￥ 650</p><p><em>著者: </em>日渡 早紀</p><p><em>出版社: </em>白泉社</p><p><em>出版日: </em>1998-03</p><p><em>商品カテゴリー: </em>文庫</p><p><em>ページ数: </em>299</p><p><em>ISBN: </em>4592884019</p>
<hr class="tmkm-amazon-clear" />
</div>
	<ol>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1795/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/12/cdn-e1323379886129-150x100.jpg" class="attachment-thumbnail" alt="CDNの仕組み" title="CDNの仕組み" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">207%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.12.09</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1795/" rel="bookmark">SSLありのWordPressだけど高速化したいからCloudFlareのCDNを無料で使う</a><br />
				<p>最近WordPress界隈では高速化の話題が多いですが、僕もちょくちょく試しています。静的キャッシュのプラグインとかYa[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1667/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/tinymce-button-150x100.png" class="attachment-thumbnail" alt="選べるタグを変更" title="選べるタグを変更" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">98%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.09</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1667/" rel="bookmark">WordPressのTinyMCEをチキチキにカスタマイズする</a><br />
				<p>最近続いているWordPressエントリーの続きです。ところでみなさん、HTMLタグは好きですか？　僕はというと、特に好[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1801/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/12/IMG_0796-150x100.png" class="attachment-thumbnail" alt="PayPalでのクレジットカード決済" title="PayPalでのクレジットカード決済" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">76%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.12.15</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1801/" rel="bookmark">Literally WordPress 0.8.8で定期購読とスマートフォン対応</a><br />
				<p>Literally WordPressを0.8.8にアップデートしました。 http://wordpress.org/e[...] </p>
			</div>
		</li>
			</ol>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1679/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPressのTinyMCEをチキチキにカスタマイズする</title>
		<link>http://takahashifumiki.com/web/programing/1667/</link>
		<comments>http://takahashifumiki.com/web/programing/1667/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 03:33:06 +0000</pubDate>
		<dc:creator>高橋文樹</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://takahashifumiki.com/?p=1667</guid>
		<description><![CDATA[最近続いているWordPressエントリーの続きです。ところでみなさん、HTMLタグは好きですか？　僕はというと、特に好きとかはなくて、「セマンティックWebを実現するために大事だとは思うけど、書きたくはない」という感じ [...]]]></description>
			<content:encoded><![CDATA[<p>最近続いているWordPressエントリーの続きです。ところでみなさん、HTMLタグは好きですか？　僕はというと、特に好きとかはなくて、「セマンティックWebを実現するために大事だとは思うけど、書きたくはない」という感じです。</p>
<p>さて、WordPressには<a href="http://www.tinymce.com/" target="_blank">TinyMCE</a>というWYSIWYGエディタがついています。これはWordPressの中の人ではなく<a href="http://www.moxiecode.com" target="_blank">Moxiecode</a>というスウェーデンの人が作ったオープンソースのソフトですね。</p>
<p>今回はいかにタグ打ちをせずに済ませるかという点にしぼってご説明します。たぶんリンク集みたいになると思いますが、カスタマイズの方法は大体下記の通りです。</p>
<ol>
<li>TinyMCEでの見映え自分のブログと統一する（初級）</li>
<li>TinyMCEに元からあるボタンを追加する（中級）</li>
<li>TinyMCEに消されるタグを救う（特にiframe）（中級）</li>
<li>TinyMCEにオリジナルのボタンを追加する（上級）</li>
</ol>
<h2>TinyMCEでの見映え自分のブログと統一する（初級）</h2>
<div id="attachment_1669" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/tinymce.png"><img class="size-medium wp-image-1669" title="このブログのTinyMCEはこんなです" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/tinymce-300x205.png" alt="このブログのTinyMCEはこんなです" width="300" height="205" /></a><p class="wp-caption-text">このブログのTinyMCEはこんなです</p></div>
<p>世の中には全部タグ打ちで書いているWPerもいるかと思いますが、見映えが一致しているとビジュアルエディタで書くのも楽しくなってきますし、なによりクライアントワークのときは一々説明するのがめんどくさくないので楽です。</p>
<p>このやり方は簡単で、テーマ内のfunctions.phpに以下のコードを書いてください。</p>
<pre class="brush: php; title: ; notranslate">
add_editor_style(&quot;editor-style.css&quot;);
</pre>
<p>これでテーマフォルダのトップにあるeditor-style.cssが適用されるようになります。</p>
<p>もし投稿タイプごとに異なるデザインにしてたりする場合は、こんな感じで書いておくと別々のを読み込んでくれます。<a href="http://www.catswhocode.com/blog/killer-hacks-to-enhance-wordpress-editor" target="_blank">Killer hacks to enhance WordPress editor</a>に書いてありました。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * 別々のeditor-style.cssを追加
 * @return void
 */
function _my_editor_style(){
     global $current_screen;
     switch ($current_screen-&gt;post_type){
          case 'post':
               add_editor_style('css/editor-style-post');
               break;
          case 'ebook':
               add_editor_style('css/editor-style-ebook');
               break;
     }
}
add_action('admin_head', '_my_editor_style');
</pre>
<h2>TinyMCEに元からあるボタンを追加する（中級）</h2>
<p>WordPressのTinyMCEは色々と設定が施されたものなのですが、実は後から変更できます。こんなことを書くのはなんですが、まずはTinyMCE Advancedというプラグインを使ってください。便利です。</p>
<p>ここではこのプラグインでたぶん実現できないものを紹介します。</p>
<h3>ブロックレベル要素のボタンをカスタマイズ</h3>
<div id="attachment_1668" class="wp-caption alignleft" style="width: 310px"><a href="http://s.takahashifumiki.com/wp-content/uploads/2011/10/tinymce-button.png"><img class="size-medium wp-image-1668" title="選べるタグを変更" src="http://s.takahashifumiki.com/wp-content/uploads/2011/10/tinymce-button-300x207.png" alt="選べるタグを変更" width="300" height="207" /></a><p class="wp-caption-text">選べるタグを変更</p></div>
<p>僕のブログではタイトルにh1を使っており、「一文書にはh1ひとつ」という原則に従って本文中にh1を使うことはありません。小見出しもレベル5までと決めています。その一方、定義リスト（dlタグ）が大好きなので、これを追加したいです。やり方はこちらをfunctions.phpに書いておいてください。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * TinyMCEの初期化配列を作成する
 * @param array $initArray
 * @return array
 */
function _my_tinymce($initArray) {
     //選択できるブロック要素を変更
     $initArray['theme_advanced_blockformats'] = 'p,h2,h3,h4,h5,dt,dd,div,pre';
     return $initArray;
}
//TMAより後に実行されるように、10000番ぐらいにフック登録
add_filter('tiny_mce_before_init', '_my_tinymce', 10000);
</pre>
<p>これで選択できるものが変わりました。なぜかdlはないのでタグ打ちしないと行けないのですが、やり方わかったら追記します。</p>
<p>ちなみに、選択できる要素は<a href="http://www.tinymce.com/wiki.php/Configuration:theme_advanced_blockformats" target="_blank">tinyMCEのドキュメント</a>（見辛い！）によると、そんなに多くないですね。これ以外も書けるのかもしれませんが、よくわかりません。基本はブロック要素だけですね。sampタグなんて使うの？</p>
<h3>スタイルボタンの要素を追加</h3>
<p>これはeditor-style.cssをきちんと設定したときに威力を発揮します。ある程度WordPressのデザインを作り込むと、デフォルトのタグだけでは扱いきれない要素が出てきて、span.cautionとか、p.errorとかも使いたくなってきます。たとえば、このブログではp.successとp.warningという要素があります。</p>
<p class="message success">これはp.successです。</p>
<p>色んなスタイルを設定した場合、そのスタイルを適用するボタンを作りたくなりますね。スクリーンキャスト撮ったので、参考にしてください。</p>
<p><iframe frameborder="0" height="315" src="http://www.youtube.com/embed/qO3zXal70Io" width="560"></iframe></p>
<p>やり方はこんな感じです。先ほど上で定義した_my_tinymceの中に書いて下さい。</p>
<pre class="brush: php; title: ; notranslate">
//スタイリング用クラス
$style_formats = array(
      array(
           'title' =&gt; 'サクセス',
           'block' =&gt; 'p',
           'classes' =&gt; 'message success'
      ),
      array(
           'title' =&gt; '注意',
           'block' =&gt; 'p',
           'classes' =&gt; 'message warning'
      ),
      array(
           'title' =&gt; '注意書き',
           'inline' =&gt; 'span',
           'classes' =&gt; 'alert'
      )
);
$initArray['style_formats'] = json_encode($style_formats);
return $initArray;
</pre>
<p>クラスは複数指定可能なので、clearfixとかも使えます。フロート解除等にも便利ですね。</p>
<h2>TinyMCEに消されるタグを救う（特にiframe）（中級）</h2>
<p>これはGoogleマップが消される問題を解決するために使っています。他にもrubyタグとか、mapタグとか、マイナーなタグを使うときはこの方法で。HTML5もいけるんじゃないでしょうか。上と同様、_my_tinymceの中に記述してください。</p>
<pre class="brush: php; title: ; notranslate">
$initArray[ 'extended_valid_elements' ] .= &quot;iframe[id|class|title|style|align|frameborder|height|longdesc|marginheight|marginwidth|name|scrolling|src|width]&quot;;
//タグ名[属性|属性],タグ名[属性|属性],タグ名[属性|属性]...
</pre>
<h2>TinyMCEにオリジナルのボタンを追加する（上級）</h2>
<p>オリジナルのボタンを追加するとなるとかなり使いこなしてる感が出て嬉しいですね。たとえば、僕が個人的に好きなのにあんまり使われてないタグに引用文であることを示すqタグというのがあります。blockquoteのインライン版ですね。これにcite属性を組み合せれば、かなり論文っぽいブログを作ることができます。qタグのcite属性を引っこ抜いて文末脚注を作るようなjQueryを書いたりするとアカデミックでかっこいいですよね。ibid. citéとか書きたいです。</p>
<p>オリジナルのボタンを追加するには、プラグイン（WordPressのプラグインではなく、TinyMCEのプラグイン）として作成する必要があります。一応、このためのインターフェースは用意されています。</p>
<pre class="brush: php; title: ; notranslate">
/**
 * オリジナルのボタンを登録する
 * @param array $buttons
 * @return array
 */
function _my_register_button($buttons)
{
	array_unshift($buttons, &quot;mybutton&quot;, &quot;separator&quot;);
	return $buttons;
}
//mce_button_の数字は1〜3で好きな値に
add_filter('mce_buttons_3', '_my_register_button');

/**
 * TinyMCE用のプラグインを登録する
 * @param array $plugin_array
 * @return array
 */
function _my_mce_plugin($plugin_array)
{
	$plugin_array['mybutton'] = '/url/to/plugin/directory/editor_plugin.js';
	return $plugin_array;
}
add_filter(&quot;mce_external_plugins&quot;, &quot;_my_mce_plugin&quot;, 100);
</pre>
<p>これでeditor_plugin.jsにTinyMCEのプラグインとしてのコードを書いていかなくては行くことになるのですが、けっこうやることは多いです。</p>
<ol>
<li>翻訳用ファイルを登録する（これはなくてもいいけど、WordPressのgettextを使った翻訳と統一するためにはちょっと工夫が必要）</li>
<li>ポップアップダイアログ（qタグの場合、cite属性を入力するためのプロンプトが必要になる）を作る場合は、そのためのファイルを用意する必要があり、ダイアログウインドウの入力を受け取るためのJSを記載する必要がある</li>
<li>選択文字列のタグを脱がせたり着せたりするのはTinyMCEのAPIを使うとできるので、ドキュメントを漁ってください。基本的には<a href="http://www.tinymce.com/wiki.php/API3:class.tinymce.Editor" target="_blank">tinymce.Editorクラス</a>をなんとかすればいけるはずです。</li>
</ol>
<p>もっと細かく説明しようと思ったのですが、もう出かけなくてはいけないのと、めんどくさいという感情が高まってきたので、以前作った<a href="https://github.com/fumikito/WP-Yomigana" target="_blank">rubyタグ挿入プラグインのGithubリンク</a>を貼って終わりにします。他に<a href="http://tenderfeel.xsrv.jp/" target="_blank">WebTechNote</a>というブログに<a href="http://tenderfeel.xsrv.jp/wordpress/350/" target="_blank">TinyMCEのビジュアルリッチエディタにカスタムボタンを追加する</a>や<a href="http://tenderfeel.xsrv.jp/wordpress/821/" target="_blank">自作したショートコードをビジュアルエディタ内で置換する</a>などの記事があるので、参考にしてみてください。上級者ならできる！</p>
<h2>終わりに</h2>
<p>TinyMCEは改行連続がついこのあいだまでできなかったことやタグの自動消去機能などからマークアップ大好きな人に嫌われていたのですが、世の中の大半の人はマークアップを知らないので、WordPressを納品したり、WordPressでサービスを提供している人はがんばってカスタマイズするのが吉だと思います。</p>
<p>でも管理画面使いやすくしてもあんまりお金貰えないんだよなーと愚痴りつつ、尻すぼみでエントリーを終えます。<a href="http://www.webopixel.net/wordpress/211.html" target="_blank">WordPressのビジュアルエディタをカスタマイズする</a>というエントリーなども参考になります。</p>
	<ol>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1679/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/10/ssl-problem_0-1-150x100.png" class="attachment-thumbnail" alt="SSL、ぼくのユーザーを守って" title="SSL、ぼくのユーザーを守って" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">90%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.10.11</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1679/" rel="bookmark">ぼくのユーザーを守って〜Tips on WordPress + SSL〜</a><br />
				<p>またWordPressのTips兼メモ書きです。いま色々と制作している途中なので、あと一週間はメモ書きが続きます。Web[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1795/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/12/cdn-e1323379886129-150x100.jpg" class="attachment-thumbnail" alt="CDNの仕組み" title="CDNの仕組み" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">89%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.12.09</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1795/" rel="bookmark">SSLありのWordPressだけど高速化したいからCloudFlareのCDNを無料で使う</a><br />
				<p>最近WordPress界隈では高速化の話題が多いですが、僕もちょくちょく試しています。静的キャッシュのプラグインとかYa[...] </p>
			</div>
		</li>
				<li class="clearfix">
			<div class="thumb">
				<a href="http://takahashifumiki.com/web/programing/1266/"><img width="150" height="100" src="http://takahashifumiki.com/wp-content/uploads/2011/01/contactmethod-150x100.png" class="attachment-thumbnail" alt="AIMとか誰も使わない" title="AIMとか誰も使わない" /></a>
			</div>
			<div class="score">
				関連度<br />
				<small class="old">74%</small>
			</div>
			<div class="detail">
				<span class="mono">2011.01.28</span><br />
				<a class="more" href="http://takahashifumiki.com/web/programing/1266/" rel="bookmark">WordPressで会員制サイトを作るときの勘所</a><br />
				<p>半ば放置ぎみだったミニコme!の開発を再開したことと、４月に控えている破滅派大リニューアルに向けてWordPressの会[...] </p>
			</div>
		</li>
			</ol>
]]></content:encoded>
			<wfw:commentRss>http://takahashifumiki.com/web/programing/1667/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

