<?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>INSPIRE TECH &#187; Plugin</title>
	<atom:link href="http://inspire-tech.jp/tag/plugin/feed/" rel="self" type="application/rss+xml" />
	<link>http://inspire-tech.jp</link>
	<description>株式会社インスパイアデザインのプログラマーである家富正幸が、デザインやシステム開発、ソーシャルメディアや最近のトレンドなど、Webに関する様々な情報を発信しているブログです。</description>
	<lastBuildDate>Fri, 29 Jan 2016 05:25:58 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.8.41</generator>
	<item>
		<title>WordPressのGoogleMap連携プラグイン「WP-GoogleMaps」を利用する際に気をつけること</title>
		<link>http://inspire-tech.jp/2012/02/wordpress_wp_googlemaps_plugin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_wp_googlemaps_plugin</link>
		<comments>http://inspire-tech.jp/2012/02/wordpress_wp_googlemaps_plugin/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 14:58:40 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[問題解決]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1314</guid>
		<description><![CDATA[WordPress上にてGoogleMapsAPIを利用する必要があったので、比較的使いやすそうなWP-GoogleMapsというプラグインを利用してみたところ、日本語が文字化けしてしまって使い物にならないというバグに遭 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPress上にてGoogleMapsAPIを利用する必要があったので、比較的使いやすそうな<strong>WP-GoogleMaps</strong>というプラグインを利用してみたところ、<strong>日本語が文字化けしてしまって使い物にならない</strong>というバグに遭遇して解決したので、プラグインの紹介とその解決方法を掲載します。</p>
<ul>
<li><a href="http://wordpress.org/extend/plugins/wp-google-maps/" title="WordPress › WP Google Maps « WordPress Plugins">WP Google Maps</a></li>
</ul>
<p><span id="more-1314"></span></p>
<h3><span>WP-GoogleMapsプラグインの概要</span></h3>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2012/02/wp-google-maps-11.png"><img src="http://inspire-tech.jp/wp-content/uploads/2012/02/wp-google-maps-11-570x626.png" alt="" title="wp-google-maps-1" width="570" height="626" class="alignleft size-large wp-image-1324" /></a></div>
<p>WP-GoogleMapsは1ブログ1マップという感じで実装するプラグインで、1つのマップの中にいくつでもマーカーを落とし込むことができます。</p>
<p class="note">今のところ1つしかマップが登録できないのですが、ショートコードにidという記載があるため、もしかしたら今後複数のマップの管理などもできるようになるかもしれません。</p>
<h4>有償のアドオンが存在する</h4>
<p>有償のアドオンが存在し、アドオンを導入することで、</p>
<p>・デフォルトのマーカーアイコンの変更<br />
・マーカー毎のアイコンの変更<br />
・フキダシのテキストの変更<br />
・フキダシへの画像挿入<br />
・フキダシへのリンクの挿入<br />
・マーカー情報のインポート、エクスポート（CSVファイル形式）</p>
<p>といったことが可能になります。</p>
<ul>
<li><a href="http://www.wpgmaps.com/" title="WP Google Maps - WordPress Google Maps Plugin">WP Google Maps &#8211; WordPress Google Maps Plugin</a></li>
</ul>
<h3><span>問題点</span></h3>
<p>プラグインを普通に導入すると、マーカー設置の際に日本語を入れると、文字化けして住所検索もできず、全く使い物になりません。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2012/02/wp-google-maps-21.png"><img src="http://inspire-tech.jp/wp-content/uploads/2012/02/wp-google-maps-21-570x137.png" alt="" title="wp-google-maps-2" width="570" height="137" class="alignleft size-large wp-image-1323" /></a></div>
<p>原因はプラグインのソースコードに有り、管理用のデータベーステーブルを生成する際、文字コードをlatin1として指定しているためです。</p>
<h4>wpGoogleMaps.php 1064行目付近</h4>
<pre class="brush: php">
    $sql = "
        CREATE TABLE `".$table_name."` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `map_id` int(11) NOT NULL,
          `address` varchar(700) NOT NULL,
          `desc` varchar(700) NOT NULL,
          `pic` varchar(700) NOT NULL,
          `link` varchar(700) NOT NULL,
          `icon` varchar(700) NOT NULL,
          `lat` varchar(100) NOT NULL,
          `lng` varchar(100) NOT NULL,
          `anim` varchar(3) NOT NULL,
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; // この CHARSET=latin1 が問題
    ";
</pre>
<h3><span>改善する方法</span></h3>
<h4>プラグインインストール前</h4>
<p>WordPressの自動インストール機能を利用せず、アーカイブとしてまずはファイルをダウンロード・解答し、ソースコードを修正します。</p>
<pre class="brush: diff">
--- wpGoogleMaps.php    2012-02-17 18:24:32.000000000 +0900
+++ wpGoogleMaps2.php   2012-02-21 23:50:50.002343200 +0900
@@ -1074,7 +1074,7 @@
           `lng` varchar(100) NOT NULL,
           `anim` varchar(3) NOT NULL,
           PRIMARY KEY (`id`)
-        ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
+        )
     ";
 
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
</pre>
<p>具体的には、<code>ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1</code> の指定はいらないので削ってしまいます。</p>
<h4>プラグインインストール後</h4>
<p>コンソールまたは管理ツール（PhpMyAdminなど）でテーブルの文字コードをutf8に変更します。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2012/02/wordpress_wp_googlemaps_plugin/feed/</wfw:commentRss>
		<slash:comments>68</slash:comments>
		</item>
		<item>
		<title>CakePHPで指定したフォームにデータが存在する場合だけ、あるフォームのバリデーションを行うためのビヘイビアを書いてみた</title>
		<link>http://inspire-tech.jp/2011/10/cakephp_assoc_field_validation_behavior/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_assoc_field_validation_behavior</link>
		<comments>http://inspire-tech.jp/2011/10/cakephp_assoc_field_validation_behavior/#comments</comments>
		<pubDate>Wed, 12 Oct 2011 02:30:07 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1193</guid>
		<description><![CDATA[CakePHPでフォームのバリデーションを行う場合、例えばチェックボックスで「選択肢A」が選択されている場合のみ、「アンケート」のテキストエリアを必須入力にしたい！といった事があるかと思います。 バリデーションルールを切 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPでフォームのバリデーションを行う場合、例えばチェックボックスで「選択肢A」が選択されている場合のみ、「アンケート」のテキストエリアを必須入力にしたい！といった事があるかと思います。</p>
<p>バリデーションルールを切り替えるというのも1つの手段かと思いますが、もっと簡単に、バリデーションの定義だけでそれを実現できる関数を、ビヘイビアとして書いてみたので公開します。<br />
<span id="more-1193"></span></p>
<h3><span>ソースコード</span></h3>
<p>下記の<code>assoc_field_validation.php</code>をダウンロードして、<code>APP/models/behaviors/</code>以下に設置してください。</p>
<p><script src="https://gist.github.com/1273549.js"> </script></p>
<h3><span>使い方</span></h3>
<p>ビヘイビアに含まれる<code>checkAssocField</code>関数を、バリデーションのルール（ユーザー定義関数）として指定します。</p>
<p>下記のコードは、先ほどの「選択肢A」が選ばれていた場合に「アンケート」の入力を必須入力にする、というサンプルです。</p>
<pre class="brush: php">
class Contact extends AppModel
{
	public $validate = array(
		'option' =&gt; array(
			'inList' =&gt; array(
				'rule' =&gt; array('inList', array('A', 'B', 'C')),
				'required' =&gt; true,
				'allowEmpty' =&gt; false,
			)
		),
		'questionnaire' =&gt; array(
			'checkAssocField' =&gt; array(
				'rule' =&gt; array('checkAssocField', 'option', array('A'), 'notEmpty'),
				'message' =&gt; '必ず入力してください。',
				'required' =&gt; true,
			),
		),
	);
}
</pre>
<p>checkAssocField関数は3つの引数を取ります。</p>
<dl>
<dt>assocField (string)</dt>
<dd>
値をチェックする入力フォーム名です。
</dd>
<dt>assocValueList (array)</dt>
<dd>
<code>assocField</code>で指定してた入力フォームの値がここで指定された値ならば、<code>delegateRule</code>を用いてバリデーションを行います。
</dd>
<dt>delegateRule (mixed)</dt>
<dd>
<code>assocField</code>で指定したフォームの値が<code>assocValueList</code>の値に含まれる場合に、実行するバリデーションのルールを指定します。<br />
ここでは他のバリデーションのルールを自由に指定する事が出来ます。<br />
例）<code>array('maxLength', 30)</code>、<code>array('between', 20, 30)</code>
</dd>
</dl>
<h3><span>注意</span></h3>
<p><code>checkAssocField</code>関数をバリデーションに利用した場合、そのフィールドの<code>allowEmpty</code>と<code>required</code>の指定に気をつけて下さい。</p>
<p>例えば上述の例の場合、<code>allowEmpty</code>を<code>true</code>と指定してしまうと、この関数は意味を成しません。（値が空でもOKということになるため、「選択肢」がAだとしても「アンケート」の値が空で通ってしまう）</p>
<p>また、<code>allowEmpty</code>を<code>false</code>と指定すると、「選択肢」がAであれBであれ、「アンケート」が空の場合はエラーになってしまうため、これもまた意味がありません。</p>
<p>そこで、<code>required</code>のみを<code>true</code>とすることで<strong>値が空の状態でもバリデーションルールは実行する</strong>、という状態にする事が出来ます。</p>
<p>必須のチェックがしたければ、<code>delegateRule</code>に<code>notEmpty</code>を指定する事で行う事ができるので、<code>allowEmpty</code>ではなくそちらを利用するようにしてください。</p>
<p>この指定にだけは気をつけて下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/10/cakephp_assoc_field_validation_behavior/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>CakePHPで簡単にメンテナンスモードを実装するMaintenanceコンポーネントを書いてみたよ。</title>
		<link>http://inspire-tech.jp/2011/10/cakephp_maintenance_component/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_maintenance_component</link>
		<comments>http://inspire-tech.jp/2011/10/cakephp_maintenance_component/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 02:00:09 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1187</guid>
		<description><![CDATA[CakePHPで開発したアプリケーションを公開する際、たとえばバグの修正やデータベースのアップデートを行う場合など、サイトの全機能をいったん止めて、バックエンドで作業したいことがあるかと思います。 エントリポイントである [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPで開発したアプリケーションを公開する際、たとえばバグの修正やデータベースのアップデートを行う場合など、サイトの全機能をいったん止めて、バックエンドで作業したいことがあるかと思います。</p>
<p>エントリポイントである<code>APP/webroot/index.php</code>を差し替えるという強硬手段もあるかと思いますが、もっと手軽に実現するためのMaintenanceコンポーネントを作成してみたので公開します。<br />
<span id="more-1187"></span></p>
<h3><span>利用可能な環境</span></h3>
<p>下記環境で作成・テストを行っています。</p>
<ul>
<li>PHP 5.3.1</li>
<li>CakePHP 1.3.11</li>
</ul>
<p>PHP4系列では動作しません。<br />
また、CakePHP1.2以前では動作するかわかりません。</p>
<h3><span>ダウンロードと設置</span></h3>
<p>下記ソースコードを、<code>maintenance.php</code>として<code>APP/controllers/components</code>/以下に配置してください。</p>
<p><script src="https://gist.github.com/1271972.js"> </script></p>
<h3><span>組み込み</span></h3>
<p>基本的に1つだけのコントローラーをメンテナンスモードにする、というのもあまり考えられないと思うので、<code>AppController</code>自体に組み込んでおくと良いです。</p>
<pre class="brush: php">class AppController extends Controller
{
    public $components = array('Maintenance');
}
</pre>
<h3><span>設定</span></h3>
<p>Maintenanceコンポーネントを動作させる上での設定を、下記の何れかの方法で設定を行います。</p>
<h4>Configureクラスを利用する場合</h4>
<p><code>bootstrap.php</code>などの設定ファイルに記述する際にこちらの方法を使います。</p>
<pre class="brush: php">
Configure::write('Maintenance.level', 2);
Configure::write('Maintenance.errorMethod', 'error404');
</pre>
<h4>コンポーネントの指定時に設定を行う場合</h4>
<pre class="brush: php">
class AppController extends Controller
{
    public $components = array('Maintenance' => array(
        'level' => 2,
        'errorMethod' => 'error404',
    );
}
</pre>
<h4>Controller::beforeFilterメソッドを利用する場合</h4>
<pre class="brush: php">
class AppController extends Controller
{
	public $components = array('Maintenance');
	
	public function beforeFilter()
	{
		$this->Maintenance->level = 1;
		$this->Maintenance->errorMethod = 'error404';
	}
}
</pre>
<h4>利用出来る設定の一覧</h4>
<p>下記の項目を設定可能です。</p>
<p>動作の仕様上、コンポーネントのコンストラクタで利用する設定や、<code>Component::initialize</code>メソッドの実行時に利用する設定もあるため、そういった設定は<code>bootstrap.php</code>で<code>Configure</code>クラスを利用して指定したり、コンポーネントの指定時に設定する方法しか利用できません。</p>
<p>そのため、注釈にbootstrap.phpのみ等と書いてある項目に関しては、設定のタイミングを間違える（例えば、<code>bootstarp.php</code>と書いてある項目を<code>Controller::beforeFilter</code>で設定する等）と正しく動作しませんので、ご注意下さい。</p>
<dl>
<dt>level (int) <small>※bootstrap.php、またはコンポーネントの指定時のみ</small></dt>
<dd>
メンテナンスモードのレベルを設定します。<br />
<code>0</code> &#8211; メンテナンスモードを利用しません。<br />
<code>1</code> &#8211; <code>allowedCIDR</code>で指定されたIPアドレス帯域以外からのアクセスは、強制的にデバッグレベルを0にします。<br />
<code>2</code> &#8211; <code>allowedCIDR</code>で指定されたIPアドレス帯域以外からのアクセスは、強制的にデバッグレベルを0にした上で、メンテナンス画面へリダイレクトします。
</dd>
<dt>debug (int) <small>※bootstrap.phpのみ</small></dt>
<dd>
<code>allowedCIDR</code>で指定されたIPアドレス帯域でアクセスした場合のデバッグレベルを設定します。
</dd>
<dt>allowedCIDR (array) <small>※bootstrap.php、またはコンポーネントの指定時のみ</small></dt>
<dd>
メンテナンスモードの影響を受けないIPアドレスを<a href="http://ja.wikipedia.org/wiki/Classless_Inter-Domain_Routing">CIDRの形式</a>で記述します。<br />
<code>level</code>が1以上の時にここで指定されたIPアドレス帯域でアクセスすると、<code>debug</code>で指定されたデバッグレベルでアプリケーションが実行されます。<br />
配列を利用する事で複数のパターンを指定する事が可能です。<br />
例）<code>192.168.0.1/32</code>
</dd>
<dt>baseURL (mixed)</dt>
<dd>
アプリケーションのホームURLを文字列またはCakeURLの形式で指定します。<br />
<code>level</code>が2の時にこれ以外のURLにアクセスがあった場合、このURLにリダイレクトした後にメンテナンス画面を表示させます。
</dd>
<dt>errorMethod (string)</dt>
<dd>
メンテナンス画面を表示するためのエラーメソッドの名前を指定します。<br />
内部的には<code>Object::cakeError</code>メソッドを利用しているため、<code>cakeError</code>クラスもしくは<code>appError</code>クラスに定義されているメソッド名を指定します。（デフォルトでは<code>error404</code>です）
</dd>
<dt>errorParams (array)</dt>
<dd>
エラーメソッドに渡すパラメータを配列で指定します。
</dd>
</dl>
<h3><span>利用方法</span></h3>
<p>上記設定を参考に、適切な設定を行うだけでOKです。<br />
あとは必要に応じて<code>level</code>を2に変更する事で、すぐさまアプリケーション全体をメンテナンス中にすることができます。</p>
<p>その際、<code>allowedCIDR</code>に指定されたIPアドレス帯域からは、<code>debug</code>に指定したデバッグレベルで通常通りのアクセスが可能なため、通常のユーザーにはメンテナンス中を表示させ、その間に管理者がシステムのアップデートやバグの調査などを行う事が可能になります。</p>
<p><code>level</code>が1の場合は、通常のユーザーはデバッグレベル0、許可されたIPアドレス帯域からは<code>debug</code>に指定したデバッグレベルでアクセスする事ができるので、小さなバグの検証などにも利用できるかと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/10/cakephp_maintenance_component/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WordPressにお問い合わせフォームを組み込むプラグイン、Comment Form 7を試してみた</title>
		<link>http://inspire-tech.jp/2011/08/wordpress_comment_form_7_plugin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_comment_form_7_plugin</link>
		<comments>http://inspire-tech.jp/2011/08/wordpress_comment_form_7_plugin/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 02:09:38 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[レビュー]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1122</guid>
		<description><![CDATA[WordPressでお問い合わせフォームなどを作成する際、いちいち他のスクリプトを組み込むのも面倒なのでプラグインを探していたのですが、Comment Form 7という素晴らしいプラグインを見つけたので、紹介させていた [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPressでお問い合わせフォームなどを作成する際、いちいち他のスクリプトを組み込むのも面倒なのでプラグインを探していたのですが、Comment Form 7という素晴らしいプラグインを見つけたので、紹介させていただきます。</p>
<h3><span>カスタマイズ性の高いフォーム作成画面</span></h3>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/contact-form-7.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/contact-form-7-570x392.png" alt="" title="contact-form-7" width="570" height="392" class="alignnone size-large wp-image-1125" /></a></div>
<p>通常のテキスト入力やテキストエリアなどの他に、チェックボックスやセレクトボックスなどの多彩な入力フォームを設けることができ、さらにその組み合わせを、フォーム単位で保存する事が可能です。</p>
<p><span id="more-1122"></span></p>
<h4>選択できる入力フォーム</h4>
<p>入力フォームは下記の11種類から選択し、各フォームをいくつでも配置する事が可能です。</p>
<ul>
<li>テキスト項目</li>
<li>メールアドレス項目</li>
<li>テキストエリア</li>
<li>ドロップダウン・メニュー</li>
<li>チェックボックス</li>
<li>承諾の確認</li>
<li>クイズ</li>
<li>CAPTCHA（画像認証）</li>
<li>ファイルのアップロード</li>
<li>送信ボタン</li>
</ul>
<p>右ペインのドロップダウンメニューから入力フォームのタイプを選択すると、入力フォームのカスタマイズを行う画面が表示されます。</p>
<div class="component img"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-create-parts.png" alt="" title="contact-form-7-create-parts" width="564" height="513" class="alignnone size-full wp-image-1170" />
</div>
<p>必須入力かどうかや、IDやclass名などを指定する事が可能です。</p>
<p>また、入力された内容に従って、入力フォームや入力フォームの内容をを表示するためのテンプレートタグが表示されています。</p>
<div class="component img"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-template-tags.png" alt="" title="contact-form-7-template-tags" width="549" height="122" class="alignnone size-full wp-image-1176" />
</div>
<p>このテンプレートタグを使って、お問い合わせフォームのHTMLテンプレートを作成します。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-form-template.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-form-template-570x347.png" alt="" title="contact-form-7-form-template" width="570" height="347" class="alignnone size-large wp-image-1177" /></a></div>
<p>テンプレートタグは表示される際に適宜指定した入力フォームのHTMLに差し替えられ、お問い合わせフォームが表示されます。</p>
<h3><span>通知メールのカスタマイズ</span></h3>
<p>問い合わせがあった場合に、その問い合わせの内容がメールで管理者に送られてくる、通知メールの内容もカスタマイズすることが可能です。</p>
<p>入力フォームを作成した時に表示されたテンプレートタグを利用することで、送信されるメールのテンプレートを作成します。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-mail-template.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-mail-template-570x211.png" alt="" title="contact-form-7-mail-template" width="570" height="211" class="alignnone size-large wp-image-1173" /></a></div>
<p>テンプレートタグはお問い合わせフォームのHTMLテンプレートと違い、各フォームに入力された内容に差し替えられます。</p>
<h4>確認メールも、もちろん送ることができる</h4>
<p>問い合わせを行ってくださった方に、入力内容の確認として送信する「確認メール」も、簡単に対応することが可能です。</p>
<p>先ほどのメールの設定エリアの下にメール2という項目があり、「利用する」のチェックを入れると、こちらのメールテンプレートの内容も、同時にメールとして送信されるようになります。</p>
<p>このメールの「宛先」欄をメールアドレスのテンプレートタグを入力することで、確認メールとしての機能を実現する事ができます。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-mail2-template.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-mail2-template-570x228.png" alt="" title="contact-form-7-mail2-template" width="570" height="228" class="alignnone size-large wp-image-1172" /></a></div>
<p>メールアドレスの入力フォームを設置していない場合、当たり前ですが確認メールは利用できません。</p>
<h3><span>保存</span></h3>
<p>メールフォームに適当な名前を付けて保存してください。<br />
この時、画面下にフォームを埋め込むためのテンプレートタグが表示されます。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-save.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-save-570x81.png" alt="" title="contact-form-7-save" width="570" height="81" class="alignnone size-large wp-image-1174" /></a></div>
<h3><span>フォームの設置</span></h3>
<p>フォームは、カスタムポストを含むあらゆるページに埋め込むことができます。<br />
本文に、先ほど作成したメールフォームのテンプレートタグを埋め込むだけです。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-embed.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-embed-570x291.png" alt="" title="contact-form-7-embed" width="570" height="291" class="alignnone size-large wp-image-1171" /></a></div>
<h3><span>動作確認</span></h3>
<p>実際にフォームを設置したページを開いて、送信テストを行ってみましょう。</p>
<p>Ajaxを使ったリッチな送信画面なので、確認画面を作成する手間や、煩わしい画面スクロールがありません。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-send.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/contact-form-7-send-570x777.png" alt="" title="contact-form-7-send" width="570" height="777" class="alignnone size-large wp-image-1175" /></a></div>
<p>メールが正しく届いていれば大丈夫です。</p>
<h3><span>文字コードによる注意</span></h3>
<p>私の環境では発生していませんが、サーバーのPHPの文字エンコードの設定によってはメールの内容が文字化けするようです。</p>
<p>下記フォーラムの投稿をリンクしておきますので、文字化けが発生してしまった方は参考にしてください。</p>
<ul>
<li><a href="http://ja.forums.wordpress.org/topic/7628" title="WordPress › フォーラム » Contact Form 7のコンタクトメールで文字化けしてしまう">WordPress › フォーラム » Contact Form 7のコンタクトメールで文字化けしてしまう</a></li>
</ul>
<h3><span>総括</span></h3>
<p>MovableTypeでAFormというプラグインを利用したことがあるのですが、そちらに近いインターフェースで、簡単にお問い合わせフォームを作成する事が可能になっています。</p>
<p>AFormと比べると、コンバージョン率の測定やお問い合わせ内容の一括エクスポートなどの機能は無く、使い勝手も多少劣りますが、無償で利用出来る点を考えると、非常に利用価値の高いプラグインだと感じました。</p>
<p>WordPress版AFormと言っても過言ではないように思います。</p>
<p>高機能なメールフォームが欲しい方、WordPress版のAFormを探していた方など、WordPressを利用している方であれば是非導入を考えてみて下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/08/wordpress_comment_form_7_plugin/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Twitterからのトラックバックを簡単に設置できるjQueryプラグインをさらに改造してページネーションにも対応してみた</title>
		<link>http://inspire-tech.jp/2011/08/jquery_customized_twitter_trackback_plugin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=jquery_customized_twitter_trackback_plugin</link>
		<comments>http://inspire-tech.jp/2011/08/jquery_customized_twitter_trackback_plugin/#comments</comments>
		<pubDate>Tue, 02 Aug 2011 01:10:23 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1148</guid>
		<description><![CDATA[以前に作成した、特定のURLへのTwitterの投稿を一覧で取得できるjQueryプラグインを、さらに改造してみました。 前回のプラグインではツイートが多くなっても、100件までは全て取得して表示するような仕組みになって [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>以前に作成した、<a href="http://inspire-tech.jp/2011/06/twitter_trackbac/" title="Twitterからのトラックバックを簡単に設置できるjQueryプラグインを改造してみた">特定のURLへのTwitterの投稿を一覧で取得できるjQueryプラグイン</a>を、さらに改造してみました。</p>
<p>前回のプラグインではツイートが多くなっても、100件までは全て取得して表示するような仕組みになっていたため、そのまま表示してしまうとページが縦に異常に長くなる現象が発生していました。</p>
<p>そこで、今回の改造で<strong>1ページに表示する件数を指定可能にし、さらにページネーションの仕組みを取り付けてみました</strong>。</p>
<div class="component img"><img src="http://inspire-tech.jp/wp-content/uploads/2011/08/twitter-trackback-list.png" alt="" title="twitter-trackback-list" width="449" height="586" class="alignnone size-full wp-image-1164" /></div>
<p><span id="more-1148"></span></p>
<h3><span>ソースコード</span></h3>
<p><script src="https://gist.github.com/1119248.js?file=jquery.twitterTrackback.custom.js"></script></p>
<h3><span>利用方法</span></h3>
<p>ツイートの一覧を表示したいDOMオブジェクトを用意し、下記のように利用します。</p>
<pre class="brush: js">$('#tweets').twitterTrackback();</pre>
<h3><span>オプション</span></h3>
<p>下記のように、<code>twitterTrackback</code>メソッドにオブジェクトを渡すことで、動作オプションを指定できます。</p>
<pre class="brush: js">$('#tweets').twitterTrackback({ exclude: [ 'jyokyoku' ], renderCallback: renderTweets });</pre>
<h4>オプションの一覧</h4>
<dl>
<dt>url (string)</dt>
<dd>ツイートを取得したいURLを指定します。デフォルトでは、スクリプトを設置したURLが利用されます。</dd>
<dt>wrapperTag (string)</dt>
<dd>ツイートの一覧を囲むタグを指定します。デフォルトでは<code>ul</code>です。</dd>
<dt>removeHash (boolean)</dt>
<dd>ツイートを取得するurlにハッシュが含まれる場合に、それを削除するかを指定します。デフォルトでは<code>true</code>です。</dd>
<dt>renderCallback (function)</dt>
<dd>ツイートをレンダリングする関数を指定します。</dd>
<dt>pagerCallback (function)</dt>
<dd>ページャをレンダリングする関数を指定します。</dd>
<dt>pagerPos (string)</dt>
<dd>ページャを表示する位置を指定します。</p>
<ul>
<li><code>both</code> &#8211; ツイート一覧の上下</li>
<li><code>top</code> &#8211; ツイート一覧の上</li>
<li><code>bottom</code> &#8211; ツイート一覧の下</li>
</ul>
</dd>
<dt>perpage (integer)</dt>
<dd>1ページに表示するツイートの数を指定します。デフォルトでは<code>10</code>です。</dd>
<dt>noTrackback (string)</dt>
<dd>ツイートが1件も無い場合に表示するメッセージを指定します。デフォルトでは<code>&lt;p&gt;Twitterからのトラックバックはありません。&lt;/p&gt;</code>が表示されます。</dd>
<dt>exclude (array)</dt>
<dd>ツイートを表示したくないユーザーIDを配列で指定します。</dd>
</dl>
<h3><span>生成されるHTMLコード</span></h3>
<p>renderCallbackオプションやpagerCallbackオプションに何も指定しない場合、下記のようなHTMLコードが生成されます。</p>
<p>適宜CSSを利用してスタイリングしてください。</p>
<h4>ツイート一覧</h4>
<pre class="brush: xml">
&lt;ul&gt;
	&lt;li class=&quot;tweet1&quot;&gt;
		&lt;a href=&quot;http://twitter.com/jyokyoku&quot;&gt;&lt;img src=&quot;http://a1.twimg.com/profile_images/1302945019/___normal.jpg&quot; alt=&quot;家富正幸&quot; width=&quot;48&quot; /&gt;&lt;/a&gt;
		&lt;ul class=&quot;section&quot;&gt;
			&lt;li class=&quot;nick&quot;&gt;&lt;a href=&quot;http://twitter.com/jyokyoku&quot;&gt;家富正幸&lt;/a&gt;&lt;/li&gt;
			&lt;li class=&quot;content&quot;&gt;ツイートの内容が表示されます。&lt;/li&gt;
			&lt;li class=&quot;date&quot;&gt;&lt;a href=&quot;http://twitter.com/jyokyoku/status/xxxxxxxxxx&quot;&gt;1 days ago&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
	&lt;li class=&quot;tweet2&quot;&gt;
		&lt;a href=&quot;http://twitter.com/jyokyoku&quot;&gt;&lt;img src=&quot;http://a1.twimg.com/profile_images/1302945019/___normal.jpg&quot; alt=&quot;家富正幸&quot; width=&quot;48&quot; /&gt;&lt;/a&gt;
		&lt;ul class=&quot;section&quot;&gt;
			&lt;li class=&quot;nick&quot;&gt;&lt;a href=&quot;http://twitter.com/jyokyoku&quot;&gt;家富正幸&lt;/a&gt;&lt;/li&gt;
			&lt;li class=&quot;content&quot;&gt;ツイートの内容が表示されます。&lt;/li&gt;
			&lt;li class=&quot;date&quot;&gt;&lt;a href=&quot;http://twitter.com/jyokyoku/status/xxxxxxxxxx&quot;&gt;1 days ago&lt;/a&gt;&lt;/li&gt;
		&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;
</pre>
<h4>ページャ</h4>
<pre class="brush: xml">
&lt;div class=&quot;tweetPager&quot;&gt;
	&lt;span class=&quot;current&quot;&gt;1&lt;/span&gt;
	&lt;span&gt;&lt;a href=&quot;javascript:void();&quot; onclick=&quot;jQuery.twitterTrackback.update(2); return false;&quot;&gt;2&lt;/a&gt;&lt;/span&gt;
&lt;/div&gt;
</pre>
<h3><span>コールバック関数を利用する</span></h3>
<p><code>renderCallback</code>オプションや<code>pagerCallback</code>オプションに適切な関数を渡すことで、表示されるツイートの内容やページャのコードを変更する事ができます。</p>
<h4>renderCallbackオプションを指定する</h4>
<p><code>renderCallback</code>オプションを指定する場合、引数を1つ取る関数を指定してください。<br />
引数にはツイートの番号が数値で渡されます。</p>
<p>また、関数の<code>this</code>スコープはツイートの情報が格納されたオブジェクトになるため、<code>this.author.name</code>などでツイートに関する情報を表示することができます。</p>
<p>デフォルトで実行される関数を載せておきます。</p>
<pre class="brush: js">
function renderHtml(n) {
	return (
		'&lt;li class=&quot;tweet' + n + '&quot;&gt;' +
			'&lt;a href=&quot;' + this.author.url + '&quot;&gt;&lt;img src=&quot;' + this.author.photo_url + '&quot; alt=&quot;' + this.author.name + '&quot; width=&quot;48&quot; /&gt;&lt;/a&gt;' +
			'&lt;ul class=&quot;section&quot;&gt;' +
				'&lt;li class=&quot;nick&quot;&gt;&lt;a href=&quot;' + this.author.url + '&quot;&gt;' + this.author.nick + '&lt;/a&gt;&lt;/li&gt;' +
				'&lt;li class=&quot;content&quot;&gt;' + this.content.replace(/((http:|https:)\/\/[\x21-\x7e]+)/gi, &quot;&lt;a href='$1'&gt;$1&lt;/a&gt;&quot;) + '&lt;/li&gt;' +
				'&lt;li class=&quot;date&quot;&gt;&lt;a href=&quot;' + this.permalink_url + '&quot;&gt;' + this.date_alpha + '&lt;/a&gt;&lt;/li&gt;' +
			'&lt;/ul&gt;' +
		'&lt;/li&gt;'
	);
}
</pre>
<h4>pagerCallbackオプションを指定する</h4>
<p><code>pagerCallback</code>オプションを指定する場合、引数を3つ取る関数を指定してください。<br />
引数は下記の値が渡されます。</p>
<ol>
<li>(integer) 現在のページ番号</li>
<li>(integer) 1ページにいくつツイートを表示するか</li>
<li>(integer) 現在のURLに対する全ツイート数</li>
</ol>
<p>また、ページャで生成されたリンクがクリックされた場合には、必ず下記の関数を実行して、ツイート一覧を書き換えるようにしてください。</p>
<pre class="brush: js">jQuery.twitterTrackback.update(pageNumber)</pre>
<p>デフォルトで実行される関数を載せておきます。</p>
<pre class="brush: js">
function pagerHtml(current, perpage, total) {
	var totalPages = total / perpage;
	var links = '';

	for (var i = 1; i &lt; totalPages; i++) {
		if (current != i) {
			links += '&lt;span&gt;&lt;a href=&quot;javascript:void();&quot; onclick=&quot;jQuery.twitterTrackback.update(' + i + '); return false;&quot;&gt;' + i + '&lt;/a&gt;&lt;/span&gt;';

		} else {
			links += '&lt;span class=&quot;current&quot;&gt;' + i + '&lt;/span&gt;'
		}
	}

	return (
		'&lt;div class=&quot;tweetPager&quot;&gt;' + links + '&lt;/div&gt;'
	);
}
</pre>
<h3><span>バグやご要望など</span></h3>
<p>バグやご要望などありましたら、<a href="http://twitter.com/jyokyoku" title="ツイッター">ツイッター</a>かコメントフォーム、<a href="http://www.facebook.com/pages/INSPIRE-TECH/217383898302804" title="INSPIRE TECH">Facebook</a>、または<a href="http://inspire-tech.jp/contact/" title="お問い合わせ">お問い合わせフォーム</a>からご連絡ください。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/08/jquery_customized_twitter_trackback_plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHPの超便利なファイルアップロードプラグイン、FileBinderプラグインの使い方をまとめてみた。</title>
		<link>http://inspire-tech.jp/2011/07/cakephp_file_binder_plugin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_file_binder_plugin</link>
		<comments>http://inspire-tech.jp/2011/07/cakephp_file_binder_plugin/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 02:00:39 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=975</guid>
		<description><![CDATA[CakePHPを利用している上で、一番悩むのがファイルのアップロードとその管理です。 MediaPluginという有名なファイルアップロードプラグインがありますが、高機能・多機能との引き替えに、インストール方法やその利用 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPを利用している上で、一番悩むのがファイルのアップロードとその管理です。</p>
<p>MediaPluginという有名なファイルアップロードプラグインがありますが、高機能・多機能との引き替えに、インストール方法やその利用方法が非常にわかりづらく、さらにプラグインをバージョンアップしただけでエラーを吐いて動かなくなったりと、常時メンテナンス、するプロジェクトに導入するには少々の抵抗があります。</p>
<p>そこで、もっとシンプルで使いやすいファイルアップロードプラグインである、FileBinderプラグインを紹介したいと思います。</p>
<p><span id="more-975"></span></p>
<h3><span>FileBinderプラグインの特徴</span></h3>
<p>FileBinderプラグインは、ファイルアップロードに関して下記のような機能を持っています。</p>
<ul>
<li>ファイルサイズの制限やファイルタイプの制限など、アップロードしたファイルのバリデーション</li>
<li>ファイルの保存方法を任意のディレクトリに保存するか、DBにバイナリとして保存するか選べる</li>
<li>全てのファイルを1つのテーブルで管理できる</li>
<li>任意のテーブルにファイルの情報を仮想のフィールドとして組み込むことができる</li>
</ul>
<p>ファイルアップロードで必要とされるであろうほとんどの機能が実装されていて、普通に使う分であれば何一つ不自由はしません。</p>
<p>そして、FileBinderプラグインの特徴と言える機能が、上記でも紹介している、<strong>任意のテーブルにファイルの情報を仮想フィールドとして組み込むことができる機能</strong>です。</p>
<p>この機能は、特定のテーブルの検索結果に仮想のフィールドを作成し、そこにファイルの情報を埋め込むことで、あたかもそのテーブルにファイルのデータが格納されているかのように扱うことができるのです。</p>
<h4>仮想フィールドの例</h4>
<p>例えば下記のようなプロフィールを管理するテーブルがあったとします。</p>
<ul>
<li>first_name</li>
<li>last_name</li>
<li>age</li>
<li>blood_type</li>
<li>address</li>
<li>email</li>
<li>phone</li>
</ul>
<p>このテーブルにはプロフィール画像などを格納するフィールドはありません。<br />
しかし、FileBinderプラグインを用いると、このテーブルの構造に全く手を付けずに、検索結果にプロフィール画像の情報を埋め込む事が可能になります。</p>
<ul>
<li>first_name</li>
<li>last_name</li>
<li>age</li>
<li>blood_type</li>
<li>address</li>
<li>email</li>
<li>phone</li>
<li><strong>profile_image</strong>
<ul>
<li>file_size</li>
<li>file_name</li>
<li>file_content_type</li>
<li>file_object</li>
<li>&#8230;</li>
</ul>
</li>
</ul>
<p>この機能は非常に便利です。</p>
<p>テーブルに手を加えなくても良いのでデータベース設計が柔軟になりますし、1つのテーブルにいくつでも仮想フィールドを加えることができるため、仕様変更が発生した場合でも簡単に対応できます。</p>
<p>また、Mediaプラグイン同様にファイルの情報を1つのテーブルで管理できるため、情報の管理がしやすくなるというメリットもあります。</p>
<h3><span>基本的な利用の流れ</span></h3>
<p>FileBinderプラグインの基本的な利用方法は、下記のようになっています。</p>
<ol>
<li>ファイルの情報を組み込みたいモデルにBindableビヘイビアを組み込む</li>
<li>上記のモデルにファイルアップロードに関する設定を定義</li>
<li>上記のモデルを利用するコントローラーにRingコンポーネントを組み込む</li>
<li>ファイルアップロードを含んだフォームをコントローラーに送信</li>
<li>コントローラーでbindUpメソッドを実行</li>
<li>モデルのsaveメソッドでフォームデータを保存</li>
</ol>
<p>ビヘイビアとコンポーネントを利用するので多少複雑に感じますが、利用し始めると全くその複雑さは感じません。</p>
<h4>実行環境</h4>
<p>解説は下記の環境を前提に行っています。</p>
<ul>
<li>PHP5系</li>
<li>CakePHP 1.3系
</ul>
<p>CakePHPのバージョンは1.2系でも動作しそうではありますが、実際に試していないので動作保証はできません。</p>
<p>1.2系をご利用の場合は、コンソールからの実行コマンドが一部違ったりするため、その点は読み替えてご利用下さい。</p>
<h4>プラグインファイルのダウンロード</h4>
<p>下記のURLにアクセスして、最新バージョンをダウンロードして、<code>app/plugins/</code> ディレクトリ以下に展開してください。</p>
<p><a title="fusic/filebinder - GitHub" href="https://github.com/fusic/filebinder">fusic/filebinder &#8211; GitHub</a></p>
<h4>Attachmentモデルの作成</h4>
<p>まずはファイル情報を格納するためのモデルである、Attachmentモデルを作成します。</p>
<p>プラグインの<code>config/</code>ディレクトリ以下に<code>schema.php</code>ファイルがありますが、そのまま実行するとバイナリデータ保存用のフィールドの型指定がCakePHPの許可する型に無いため、エラーが発生してしまいます。</p>
<p>そのため、下記のように<code>file_object</code>フィールドの型を<code>longtext</code>から<code>text</code>などに変更します。</p>
<pre class="brush: php">
class AppSchema extends CakeSchema {
    var $name = 'App';

    function before($event = array()) {
        return true;
    }

    function after($event = array()) {
    }

    var $attachments = array(
                           'id' => array('type' => 'integer', 'null' => false, 'default' => NULL, 'key' => 'primary'),
                           'model' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'model_id' => array('type' => 'integer', 'null' => false, 'default' => NULL),
                           'field_name' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'file_name' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'file_content_type' => array('type' => 'text', 'null' => false, 'default' => NULL),
                           'file_size' => array('type' => 'integer', 'null' => false, 'default' => NULL),
                           'file_object' => array('type' => 'text', 'null' => true, 'default' => NULL), // この行のタイプを text に変更
                           'created' => array('type' => 'timestamp', 'null' => true, 'default' => NULL),
                           'modified' => array('type' => 'timestamp', 'null' => true, 'default' => NULL),
                           'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1)),
                           'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'InnoDB')
                           );
  }
</pre>
<p>そして、コンソールから先ほどの<code>schema.php</code>を利用してテーブルを作成します。</p>
<p><ins datetime="2011-07-26T03:03:16+00:00">コンソールからの実行コマンドが間違えていたのを修正しました。（2011.07.26）</ins></p>
<pre class="brush: shell">cake schema create -app your_app_name -plugin filebinder -name app</pre>
<p>データベースにファイルを保存する場合、先ほど変更した<code>file_object</code>フィールドのデータ型を、データベースのコンソールや設定画面から変更しておきましょう。</p>
<p>さもないと、<strong>text型では最大サイズの都合から、テキストファイルや小さな画像程度しか保存できなくなってしまいます</strong>。</p>
<p>また、忘れずにモデルクラスも作成しておきます。<br />
<code>app/models/attachment.php</code></p>
<pre class="brush: php">
class Attachment extends AppModel
{
}
</pre>
<h4>Bindableビヘイビアの組み込み</h4>
<p>ファイルアップロードのキモとなるBindableビヘイビアを、ファイルの情報を結び付けたいモデルに組み込みます。</p>
<pre class="brush: php">
class Profile extends AppModel
{
	public $actsAs = array(
		'Filebinder.Bindable' => array(
			'model' => 'Attachment', // ファイル情報を保存するモデル名
			'filePath' => WWW_ROOT . 'img' . DS, // ファイルを保存するディレクトリ（絶対パス）
			'dbStorage' => true, // ファイルをバイナリデータとしてデータベースに保存するか
			'beforeAttach' => null, // フック関数（ファイル保存前）
			'afterAttach' => null, // フック関数（ファイル保存後）
			'withObject' => false, // 検索結果にファイルのバイナリデータを付加するか
		)
	);
}
</pre>
<p>オプションを指定しない場合、上記の値がデフォルト値として利用されます。</p>
<h4>bindFields変数の定義</h4>
<p>そして、ファイル情報を結び付ける仮想フィールドの設定を、<code>$bindFields</code>というメンバ変数として下記のように定義します。</p>
<pre class="brush: php">
class Profile extends AppModel
{
	public $actsAs = array(
		'Filebinder.Bindable' => array(
			'model' => 'Attachment',
			'filePath' => WWW_ROOT . 'img' . DS,
			'dbStorage' => true,
			'beforeAttach' => null,
			'afterAttach' => null,
			'withObject' => false,
		)
	);

	public $bindFields = array(
		array(
			'field' => 'profile_image', // ファイル情報を組み込む仮想フィールド名
			'filePath' => WWW_ROOT . 'profile_image' // ファイルを保存するディレクトリ（絶対パス）。指定されない場合、ビヘイビアの設定が利用されます。
		),
	);
}
</pre>
<p>もし、仮想フィールドを複数指定したい場合は下記のように指定します。</p>
<pre class="brush: php">
public $bindFields = array(
	array(
		'field' => 'file_upload_filed_name1',
		'filePath' => WWW_ROOT . 'file1'
	),
	array(
		'field' => 'file_upload_filed_name2'
		'filePath' => WWW_ROOT . 'file2'
	),
	array(
		'field' => 'file_upload_filed_name3'
	),
);
</pre>
<h4>バリデーションの定義</h4>
<p>Bindableビヘイビアにはファイルアップロード専用のバリデーションメソッドが揃っています。</p>
<dl>
<dt>checkContentType</dt>
<dd>ファイルのメタ情報を制限します。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkContentType', array('image/jpeg', 'image/gif', 'image/png'))
	)
);
</pre>
</dd>
<dt>checkExtension</dt>
<dd>ファイルの拡張子を制限します。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkExtension', array('jpg', 'gif', 'png'))
	)
);
</pre>
</dd>
<dt>checkFileSize</dt>
<dd>ファイルサイズを制限します。<code>KB</code>、<code>MB</code>、<code>GB</code>などの単位が利用出来ます。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkFileSize', '10MB')
	)
);
</pre>
</dd>
<dt>checkMinFileSize</dt>
<dd>ファイルの最小サイズを制限します。<code>KB</code>、<code>MB</code>、<code>GB</code>などの単位が利用出来ます。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('checkMinFileSize', '10MB')
	)
);
</pre>
</dd>
<dt>funcCheckFile</dt>
<dd>ユーザー関数でファイルのバリデーションを行います。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('funcCheckFile', 'userFunction')
	)
);
</pre>
</dd>
<dt>notEmptyFile</dt>
<dd>ファイルの未アップロードを制限します。</dd>
<dd>
<pre class="brush: php">
array(
	'profile_image' => array(
		'rule' => array('notEmptyFile')
	)
);
</pre>
</dd>
</dl>
<p>必要に応じて、仮想フィールドを組み込むモデルにバリデーションを定義します。</p>
<pre class="brush: php">
class Profile extends AppModel
{
	public $actsAs = array(
		'Filebinder.Bindable' =&gt; array(
			'model' =&gt; 'Attachment',
			'filePath' =&gt; WWW_ROOT . 'img' . DS,
			'dbStorage' =&gt; true,
			'beforeAttach' =&gt; null,
			'afterAttach' =&gt; null,
			'withObject' =&gt; false,
		)
	);

	public $bindFields = array(
		array(
			'field' =&gt; 'profile_image',
			'filePath' =&gt; WWW_ROOT . 'profile_image'
		),
	);

	public $validate = array(
		'profile_image' =&gt; array(
			'fileSize' =&gt; array(
				'rule' =&gt; array('checkFileSize', '1MB'),
				'message' =&gt; 'ファイルサイズは1MB以内でアップロードしてください。'
			),
			'fileExt' =&gt; array(
				'rule' =&gt; array('checkExtension', array('jpg', 'gif', 'png')),
				'message' =&gt; '許可されていない拡張子を利用しています。'
			)
		)
	);
}
</pre>
<h4>Ringコンポーネントの組み込み</h4>
<p>フォームからのデータを受け取るコントローラーに、Ringコンポーネントを組み込みます。</p>
<pre class="brush: php">
class ProfileController extends AppController
{
	public $components = array(
		'Filebinder.Ring'
	);
}
</pre>
<p>特に設定は必要ありません。</p>
<h4>フォームを作成</h4>
<p>ファイルアップロードを行うフォームを作成します。<br />
このとき、ファイルを選択する入力フォームは、先ほど定義した仮想フィールドの名前と同一にします。</p>
<p><ins datetime="2011-07-26T03:03:16+00:00">フォームの内容がおかしかったのを修正しました。 （2011.07.26）</ins></p>
<pre class="brush: php">
&lt;?php echo $this-&gt;Form-&gt;create(array('type' =&gt; 'file')) ?&gt;
&lt;dl&gt;
&lt;dt&gt;性&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('first_name') ?&gt;&lt;/dd&gt;
&lt;dt&gt;名&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('last_name') ?&gt;&lt;/dd&gt;
&lt;dt&gt;年齢&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('age') ?&gt;&lt;/dd&gt;
&lt;dt&gt;血液型&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('bloodtype') ?&gt;&lt;/dd&gt;
&lt;dt&gt;住所&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('address') ?&gt;&lt;/dd&gt;
&lt;dt&gt;メールアドレス&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('email') ?&gt;&lt;/dd&gt;
&lt;dt&gt;電話番号&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;text('phone') ?&gt;&lt;/dd&gt;
&lt;dt&gt;プロフィール画像&lt;/dt&gt;
&lt;dd&gt;&lt;?php echo $this-&gt;Form-&gt;file('profile_image') ?&gt;&lt;/dd&gt;
&lt;/dl&gt;
&lt;?php echo $this-&gt;Form-&gt;end() ?&gt;
</pre>
<p>仮想フィールドを複数作成した場合、それに対応した入力フォームを用意しましょう。</p>
<h4>BindUpメソッドを実行し、データを保存</h4>
<p>フォームのデータを受け取るコントローラーのアクションで、Ringコンポーネントのの<code>bindUp</code>メソッドを実行し、あと通常通りデータを保存します。</p>
<p><code>bindUp</code>メソッドはファイルアップロードの前処理を行うメソッドで、この<code>bindUp</code>メソッドを実行しないとファイルが保存されません。</p>
<pre class="brush: php">
class ProfileController extends AppController
{
	public $components = array(
		'Filebinder.Ring'
	);

	public function add()
	{
		if (!empty($this->data)) {
			$this->Ring->bindUp();

			if (!$this->Profile->save()) {
				// 保存完了
			}
		}
	}
}
</pre>
<p>このとき、<code>bindUp</code>メソッドの引数には、ファイルの保存処理を行うモデル名を指定する事ができます。</p>
<p>このモデル名は、先ほどBindableビヘイビアを組み込んだモデルを指定しますが、省略した場合、自動的にコントローラーの<code>$modelClass</code>変数に定義されたモデルが利用されます。</p>
<h4>データが登録されているか確認する</h4>
<p>保存したモデルのデータを実際に確認してみます。</p>
<pre class="brush: php">
$profile = $this->Profile->read();
debug($profile);
</pre>
<pre class="brush: php">
[Profile] => Array
(
    [id] => 1
    [first_name] => 太郎
    [last_name] => 山田
    [age] => 25
    [blood_type] => A
    [address] => 東京都千代田区
    [email] => taro.yamada@test.com
    [phone] => 03-1234-5678
    [craeted] => 2011-07-20 00:00:00
    [modified] => 2011-07-20 00:00:00
    [profile_image] => Array
        (
            [id] => 1
            [model] => Profile
            [model_id] => 1
            [field_name] => profile_image
            [file_name] => sample.jpg
            [file_content_type] => image/jpeg
            [file_size] => 65536
            [created] => 2011-07-20 00:00:00
            [modified] => 2011-07-20 00:00:00
            [file_path] => /app/webroot/profile_image/Profile/1/profile_image/sample.jpg
            [bindedModel] => Attachment
        )
)
</pre>
<p>正しくファイルの情報が結びついて読み出されているのがわかりますね。</p>
<h3><span>注意</span></h3>
<p>この検索結果にファイルの情報を結びつける機能は、ビヘイビアのafterFindメソッドで実現しています。</p>
<p>CakePHPでは、<strong>ビヘイビアのaftetFindメソッドは、そのビヘイビアが組み込まれたモデルが直接検索された時にしか呼ばれません</strong>。</p>
<p>要するに、AというモデルにhasManyで結びつけられたBというモデルがあり、そのBモデルにFileBinderビヘイビアが組み込まれているとします。</p>
<p>この時、<strong>Aモデルをfindした結果にBモデルの情報が存在していても、Bモデルの情報にはファイルの情報は結びついて来ません。</strong></p>
<p>これは実に不便なのですが、CakePHPの仕様のため、ビヘイビアではどうすることもできません。</p>
<h3><span>ビューでの使い方</span></h3>
<p>取得したファイルの情報を表示するには、付属のLabelヘルパーが便利です。<br />
Labelヘルパーには下記のような機能があります。</p>
<ul>
<li>ファイル情報の配列からaタグ（リンク）を生成</li>
<li>ファイル情報の配列からimgタグを生成</li>
<li>ファイルがブラウザから参照出来ない場所にある場合でも、ファイルがダウンロード・表示できるようにURLを生成してくれる</li>
</ul>
<h4>Labelヘルパーの使い方</h4>
<p>HTMLヘルパーに似ているので、使い方は簡単です。</p>
<dl>
<dt>ファイル情報からａタグを生成する</dt>
<dd>
<pre class="brush: php">
echo $this->Label->link($profile['profile_image']);
</pre>
</dd>
<dt>ファイル情報からimgタグを生成する</dt>
<dd>
<pre class="brush: php">
echo $this->Label->image($profile['profile_image']);
</pre>
</dd>
</dl>
<h3><span>ファイルの削除</span></h3>
<p>仮想フィールドに登録したデータを削除したい場合、下記のようなフィールドを利用します。</p>
<pre class="brush: php">
$this->Form->checkbox('profile_image_delete');
</pre>
<p><code>仮想フィールド名＋_delete</code>という名称のフィールドが送信された場合、そのフィールドの値が真であれば、対応する仮想フィールドに結びついているファイル情報が削除されます。</p>
<h3><span>とても便利なプラグイン</span></h3>
<p>以上、基本的な使い方を解説しましたが、使い慣れると手放せなくなるほど便利なプラグインです。</p>
<p>ファイルのバージョン生成機能やキャッシュ機能などはありませんが、Mediaプラグインのように面倒なインストールや設定作業が必要ではなく、フック関数を利用することで様々な利用方法が考えられます。</p>
<p>是非一度、利用してみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/cakephp_file_binder_plugin/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>WordPressで本体や特定のプラグインのアップデート通知を非表示にする方法をまとめてみた</title>
		<link>http://inspire-tech.jp/2011/07/wordpress_hide_update_notice/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_hide_update_notice</link>
		<comments>http://inspire-tech.jp/2011/07/wordpress_hide_update_notice/#comments</comments>
		<pubDate>Sun, 10 Jul 2011 06:12:53 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[問題解決]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=996</guid>
		<description><![CDATA[WordPressでは本体機能もプラグインも、自動で最新版にアップデートができるという素晴らしい機能があります。 この機能のおかげで、追加機能やバグの修正版が出た場合でも、ボタン1つで最新のパッケージが利用出来るため、い [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPressでは本体機能もプラグインも、自動で最新版にアップデートができるという素晴らしい機能があります。</p>
<p>この機能のおかげで、追加機能やバグの修正版が出た場合でも、ボタン1つで最新のパッケージが利用出来るため、いちいちファイルをダウンロードしてサーバー上のファイルを更新するという手間がありません。</p>
<p>とても便利な自動更新機能なのですが、何かの都合で本体を更新出来ない場合や、更新したくないプラグインが存在する場合、サイドバー等に常に更新通知が表示されるため、逆に非常に煩わしいものに変わってしまいます。</p>
<p>そんな時、WordPress本体や特定のプラグインの更新通知を非表示にする方法があるので紹介します。</p>
<h3><span>WordPress本体のアップデート通知を非表示にする</span></h3>
<p>これは下記のサイトを参考にしました。</p>
<ul>
<li><a href="http://wp3.jp/2011/05/19/disable-update/" title="WordPressの自動アップグレードを表示させない方法 | WordPress（ワードプレス）コミュニティ">WordPressの自動アップグレードを表示させない方法 | WordPress（ワードプレス）コミュニティ</a></li>
</ul>
<p>利用しているテーマの <code>functions.php</code> に下記のコードを記述するだけです。</p>
<pre class="brush: php">
add_filter('pre_site_transient_update_core', create_function('$a', &quot;return null;&quot;));
</pre>
<p>これでWordPress本体のアップデート通知は無効になります。</p>
<h3><span>特定のプラグインのアップデート通知を非表示にする</span></h3>
<p>これは調べてもやっている方がいないようなので、WordPress本体のソースを解析してみました。</p>
<p>利用しているテーマの <code>functions.php</code> に下記のコードを記述します。</p>
<pre class="brush: php">
add_filter('site_option__site_transient_update_plugins', 'filter_hide_update_notice');
function filter_hide_update_notice($data) {
	if (isset($data-&gt;response['プラグインのメインファイルまでのファイルパス'])) {
		unset($data-&gt;response['プラグインのメインファイルまでのファイルパス']);
	}
}
</pre>
<p>「プラグインのメインファイルまでのファイルパス」は、WordPressの <code>wp-content/plugins</code> ディレクトリの直下から、プラグインのメインファイルまでのパスを、相対パスで指定します。</p>
<p>例えば私の環境では、最新版に更新することで大幅に機能低下してしまうため、過去バージョンのまま利用しているYARPP（Yet another related posts plugin）というプラグインがあります。</p>
<p>これを例にすると、下記のように記述します。</p>
<pre class="brush: php">
add_filter('site_option__site_transient_update_plugins', 'filter_hide_update_notice');
function filter_hide_update_notice($data) {
	if (isset($data-&gt;response['yet-another-related-posts-plugin/yarpp.php'])) {
		unset($data-&gt;response['yet-another-related-posts-plugin/yarpp.php']);
	}
}
</pre>
<p>これで、特定のプラグインの更新通知を無効にする事ができます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/wordpress_hide_update_notice/feed/</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>Facebookのコメントプラグインに管理者用の画面を表示させる方法をまとめてみた。</title>
		<link>http://inspire-tech.jp/2011/07/facebook_comment_plugin_admin_panel/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=facebook_comment_plugin_admin_panel</link>
		<comments>http://inspire-tech.jp/2011/07/facebook_comment_plugin_admin_panel/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 15:02:07 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[OGP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[ソーシャルメディア]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=827</guid>
		<description><![CDATA[Facebookのコメントプラグインは設置も簡単で、さらにフィードバックも得られやすい素晴らしいソーシャルプラグインだと思いますが、ちょっとした設定を加えるだけで「コメントの管理画面」を表示できるので、その方法を簡単にま [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Facebookのコメントプラグインは設置も簡単で、さらにフィードバックも得られやすい素晴らしいソーシャルプラグインだと思いますが、ちょっとした設定を加えるだけで「コメントの管理画面」を表示できるので、その方法を簡単にまとめてみました。</p>
<p>以下は何も設定していないFacebookのコメントプラグインです。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-normal.png" alt="" title="facebook-comment-normal" width="445" height="140" class="alignnone size-full wp-image-897" />
</div>
<p>コメントができる以外に、特に機能はありません。</p>
<p>ここで、ちょっとした設定を加えるだけで下記のような、<strong>コメントのモデレーションやコメントプラグインの挙動を設定できる、管理画面を表示する</strong>ことができます。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-settings.png" alt="" title="facebook-comment-settings" width="449" height="682" class="alignnone size-full wp-image-906" /></div>
<p><span id="more-827"></span></p>
<h3><span>fb:adminsを指定する</span></h3>
<p>まずは自身がWebサイトの管理者であることをコメントプラグインに知らせるために、OGPの属性であるfb:adminsを指定します。</p>
<p>OGPってなんぞ？という方は、下記の記事を参照ください。</p>
<ul>
<li><a href="http://inspire-tech.jp/2011/06/ogp/">Facebookのいいね！ボタンを設置しても、OGPの設定がされていなければ意味が無い » INSPIRE TECH</a></li>
</ul>
<h3><span>fb:app_idを指定する</span></h3>
<p>コメントを管理するためのFacebookアプリケーションのIDを、こちらもOGP属性であるfb:app_idとして指定します。</p>
<p>「アプリなんて作ったことないよ！」という方も、Facebookのいいね！ボタンを作成したことがあれば、その際に自動的にいいね！ボタン用にFacebookアプリケーションが作成されていますので、そちらを使うと手間が省けます。</p>
<p>すでに存在するFacebookアプリケーションのIDを確認するには、Facebookにログインした状態で下記のURLにアクセスします。</p>
<ul>
<li><a href="https://developers.facebook.com/apps">Facebook開発者</a></li>
</ul>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-apps.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-apps-570x217.png" alt="" title="facebook-apps" width="570" height="217" class="alignnone size-large wp-image-899" /></a></div>
<p>ログインした人が作成したFacebookのアプリ一覧が表示されますので、その中の「アプリID」をメモして利用して下さい。</p>
<h3><span>Facebookアプリケーションを作成したことが無い場合</span></h3>
<p>Facebookアプリケーションを作成していない場合、上記URLにアクセスすると、下記のような画面が表示されます。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/app-confirm-570x341.jpg" alt="" title="app-confirm" width="570" height="341" class="alignnone size-large wp-image-902" />
</div>
<h4>開発者登録</h4>
<p>Facebookでアプリケーションを作成するには、必ず開発用のアプリケーションを許可し、さらにデベロッパー登録が必要になります。</p>
<p>このデベロッパー登録については、下記のURLに詳細が記載されていますので参照ください。</p>
<ul>
<li><a href="http://worldwidedeb.net/2011/05/17/facebook-developer-mobile">Facebookデベロッパーに登録する際、携帯アドレスでアカウント認証する方法-がんばるデザイナ tuts!</a></li>
</ul>
<h4>アプリ作成</h4>
<p>デベロッパー登録が完了したら再度先ほどの画面に戻り、右上にある「Create New App」をクリックします。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app-570x208.png" alt="" title="create-new-app" width="570" height="208" class="alignnone size-large wp-image-920" /></a>
</div>
<p>表示されたウィンドウに必要事項を記入してOKをクリックして下さい。<br />
アプリケーション名は基本的に外部に公開するようなアプリケーションでは無いので、サイト名＋Appとしておくのがわかりやすくて良いと思います。、</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app-confirming.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/create-new-app-confirming-570x239.png" alt="" title="create-new-app-confirming" width="570" height="239" class="alignnone size-large wp-image-921" /></a>
</div>
<p>CAPTCHAの確認後、アプリケーションの作成が完了します。<br />
完了後の画面にあるApp IDをメモして利用して下さい。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/created-app-data.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/created-app-data-570x247.png" alt="" title="created-app-data" width="570" height="247" class="alignnone size-large wp-image-918" /></a>
</div>
<h3><span>fb:app_idを指定しない場合</span></h3>
<p>fb:app_id、すなわちFacebookのアプリケーションIDを指定しないと、コメントプラグインの設定画面は表示されますが、機能が大きく制限されてしまいます。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-no-appid.png" alt="" title="facebook-comment-no-appid" width="447" height="207" class="alignnone size-full wp-image-914" /></div>
<p>Facebookのアプリケーションは、必ずしもFacebookのソーシャルプラグインの導入には必要ではないのですが、導入することによって、今回紹介している機能を含めて、下記のような機能が利用できます。</p>
<ul>
<li>すべてのコメントをFacebookアプリケーションの管理画面から一括で管理できる</li>
<li>Webページに設置したコメントプラグインで、Facebookアプリケーションのコメント管理画面と同等の設定が可能になる</li>
<li>いいね！ボタンを押してくれた人全員にアプリケーションを通じてお知らせなどを送ることができる</li>
</ul>
<p>よほどのことがない限り、Webサイト用にひとつ作っておくことで、その後の管理が楽になります。</p>
<h3><span>URL LinterでFacebookに通知</span></h3>
<p>上記の作業が終わったところで、Fecebookにログインしてから、設置したURLをURL Linterで読み込んでみましょう。</p>
<ul>
<li><a href="http://developers.facebook.com/tools/lint/" title="URLリンター - Facebook開発者">URLリンター &#8211; Facebook開発者</a></li>
</ul>
<p>この作業は行わなくても、約一日で反映されるのですが、一応正しく設置されているのを確認する為に、読み込んでおくと良いでしょう。</p>
<p>すると、コメントプラグインのUIが下記のように変わります。</p>
<div class="component img">
<img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-comment-login.png" alt="" title="facebook-comment-login" width="449" height="205" class="alignnone size-full wp-image-904" />
</div>
<p>ここで「設定」リンクをクリックすると、最初に紹介したようなコメントプラグインの挙動をカスタマイズ画面が表示されるようになります。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/facebook_comment_plugin_admin_panel/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WordPressで簡単にOGPタグを実装できるWP-OGPプラグインを設定画面付きに改造してみた。</title>
		<link>http://inspire-tech.jp/2011/07/wp_ogp_customized_plugin/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wp_ogp_customized_plugin</link>
		<comments>http://inspire-tech.jp/2011/07/wp_ogp_customized_plugin/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 10:24:40 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[OGP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=679</guid>
		<description><![CDATA[WordPressで非常に簡単にOGPが実装できることで有名な、WP-OGPプラグインというものがあります。 WordPress › WP-OGP « WordPress Plugins 自分もFacebookのいいね！ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPressで非常に簡単にOGPが実装できることで有名な、WP-OGPプラグインというものがあります。</p>
<ul>
<li><a href="http://wordpress.org/extend/plugins/wp-ogp/">WordPress › WP-OGP « WordPress Plugins</a></li>
</ul>
<p>自分もFacebookのいいね！ボタンを導入したときに試してみたんですが、ブログ名やブログの記事タイトルはもちろん、ブログ記事にアイキャッチ画像を指定すれば、そのアイキャッチ画像をブログ記事のサムネイルとしてOGPタグを生成してくれたりと、非常に便利です。</p>
<p>ただ、アイキャッチ画像が存在しない場合に利用される、デフォルトのサムネイル画像が変更できなかったり（変更するにはプラグインに含まれるファイルを差し替える必要がある）、Facebook用のOGPタグであるfb:app_idがスペルミスっていたりと、少し不満な点もありました。</p>
<p>そんな中、下記サイトでマルチサムネイルに対応したWP-OGPプラグインを配布しているのを見つけました。</p>
<ul>
<li><a href="http://sinack.com/wordpress/wp-ogp-multithumb.html">WP-OGPを改造してマルチサムネイル対応＆正しいプロパティ表記にしました | Sinack</a></li>
</ul>
<p>ブログ記事の中の画像を利用するというアイデアと、マルチサムネイルというアイデアが素晴らしかったので、自分もインスパイアされて、WP-OGPプラグインを詳細設定が出来るような設定画面付きに改造してみました。<br />
<span id="more-679"></span></p>
<h3><span>カスタマイズしたWP-OGPプラグインの特徴</span></h3>
<p><ins datetime="2011-08-27T20:03:53+00:00">本プラグインはWordPress3.0以上での対応となります。(2011.08.28)</ins></p>
<p>下記のような管理画面を新たに設けています。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/06/wp-ogp-costomized.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/06/wp-ogp-costomized-570x293.png" alt="" title="wp-ogp-costomized" width="570" height="293" class="alignnone size-large wp-image-793" /></a>
</div>
<h4>説明文に利用するテキストをある程度選べる</h4>
<p>オリジナル版のプラグインでは、og:descriptionに利用するテキストを、下記のような優先順位で取得して利用しようとします。</p>
<ol>
<li>descriptionというキー名のカスタムフィールド</li>
<li>投稿の抜粋</li>
<li>投稿の本文</li>
</ol>
<p>本プラグインでも、この利用する優先順位は変更していませんが、下記の項目の設定を可能にしました。</p>
<ul>
<li>利用するカスタムフィールドのキー名を変更可能</li>
<li>投稿の抜粋を利用するかどうかを選択可能</li>
</ul>
<p>設定を行って頂くことで、ある程度ですがog:descriptionに利用されるテキストを、選択できるようになっています。</p>
<h4>テキストの抽出方法を単語区切りか文字数かを選べる</h4>
<p>オリジナルのWP-OGPプラグインでは、og:descriptionに利用するテキストを、単語数で75単語分を抽出して利用します。</p>
<p>そのため、<strong>単語区切りが存在しない日本語では、テキストがそのままズラーッと改行無しで入ってしまい、og:descriptionが異常に長くなるという現象が発生</strong>します。</p>
<p>それを防ぐために、</p>
<ul>
<li>単語数で抽出する</li>
<li>文字数で抽出する</li>
</ul>
<p>を選択できるようにしました。</p>
<p>その際、抽出する単語数または文字数を、固定の75単語（文字）ではなく、任意の数値で指定する事が可能になっています。</p>
<h4>記事中に利用された画像をog:imageとして利用できる</h4>
<p>オリジナルのプラグインでは、og:imageに利用する画像を、投稿のアイキャッチ画像が存在する場合はアイキャッチ画像を、存在しない場合はプラグインに含まれるデフォルトの画像が利用されるようになっています。</p>
<p>この場合、アイキャッチ画像が設定されていないとデフォルトの画像が利用されるため、og:imageに任意の画像を指定するにはアイキャッチ画像を利用しなくてはなりません。</p>
<p>それは少し面倒なので本プラグインでは、画像の利用方法を下記の2つから選べるようにしました。</p>
<ul>
<li>アイキャッチ画像を利用する</li>
<li>記事中の画像を利用する</li>
</ul>
<h4>og:imageのサイズとアスペクト比の自動チェック</h4>
<p>Facebookのog:imageの仕様では、画像のサイズは最低で縦横50px以上、アスペクト比は最大で3:1と規定されています。</p>
<blockquote cite="http://developers.facebook.com/docs/opengraph/" title="Open Graph protocol - Facebook開発者"><p>
og:image &#8211; An image URL which should represent your object within the graph. The image must be at least 50px by 50px and have a maximum aspect ratio of 3:1. We support PNG, JPEG and GIF formats. You may include multiple og:image tags to associate multiple images with your page.
</p></blockquote>
<p><cite><a href="http://developers.facebook.com/docs/opengraph/">Open Graph protocol &#8211; Facebook開発者</a></cite></p>
<p>本プラグインでは、og:imageを記事中の画像から利用する場合、画像の縦横のサイズとアスペクト比を自動的にチェックして、規格に合わない画像は埋め込まないようにしました。</p>
<h4>og:imageの最大数を設定できる</h4>
<p>記事中の画像を使う設定の場合、その最大数を設定できるようにしました。<br />
0を指定した場合は、記事中の画像を全てog:imageとして埋め込みます。</p>
<h4>デフォルトでog:imageに利用される画像のURLを指定できる</h4>
<p>オリジナルのプラグインでは、アイキャッチ画像が無かった場合に、デフォルトでog:imageに利用される画像はプラグインのディレクトリに含まれていて、変更するにはプラグインのファイルに手を加えなくてはいけません。</p>
<p>それが面倒なので、デフォルトでog:imageに利用される画像を、URLで指定できるようにしました。</p>
<h4>常にデフォルトの画像を利用するかを指定できる</h4>
<p>og:imageに利用する画像を本文から抽出して使う場合、その最後に、必ずデフォルトの画像を含められるようにしました。</p>
<p>これは、og:imageが複数指定されているページでFacebookのシェアボタンをクリックした場合に、ウォールに表示する画像をシェアしたユーザーが選ぶことができるためです。</p>
<div class="component img"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/facebook-share.jpg" alt="" title="facebook-share" width="496" height="428" class="alignnone size-full wp-image-764" /></div>
<p>もし今後、いいね！ボタンでも同等の機能が実装されたり、他のサービスでも複数のog:imageを利用した機能が実装された場合を考えて、本機能を付けてあります。</p>
<h3><span>プラグインのダウンロード</span></h3>
<p><ins>プラグインを<a href="https://github.com/jyokyoku/wp-ogp-customized">githubでの管理</a>に移行しましたので、改変履歴や過去のバージョンなどはそちらからご覧ください。（2011.07.09）</ins></p>
<p>プラグインファイルは、下記のリンクからダウンロードしてください。</p>
<p><a href='https://github.com/jyokyoku/wp-ogp-customized/zipball/master'>WP-OGP customizedプラグインをダウンロード</a></p>
<h3><span>インストール方法</span></h3>
<p>解凍してできたwp-ogp-customizedディレクトリを、wp-content/plugins/ディレクトリにアップロードしてください。<br />
その後、プラグインの一覧から有効化してください。</p>
<h4>注意</h4>
<p>本プラグインは、オリジナルのWP-OGPプラグインとは共存できませんので、利用する際はオリジナル版を停止してから本プラグインを有効にしてください。</p>
<h3><span>不具合などのご報告</span></h3>
<p>twitterまたはFacebook、もしくは本記事のコメントでご連絡下さると有り難いです。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/wp_ogp_customized_plugin/feed/</wfw:commentRss>
		<slash:comments>98</slash:comments>
		</item>
		<item>
		<title>WordPressからTwitterに投稿するプラグインの決定版</title>
		<link>http://inspire-tech.jp/2011/06/wordpress_to_twitter/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_to_twitter</link>
		<comments>http://inspire-tech.jp/2011/06/wordpress_to_twitter/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 12:55:58 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[レビュー]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ソーシャルメディア]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=331</guid>
		<description><![CDATA[WordPressで記事を書いたときにTwitterに投稿するプラグインは多々ありますが、WP to Twitterというプラグインがとても秀逸だったのでご紹介したいと思います。 カスタマイズ性が高い まず自分が導入時に [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPressで記事を書いたときにTwitterに投稿するプラグインは多々ありますが、<a href="http://www.joedolson.com/articles/wp-to-twitter/">WP to Twitter</a>というプラグインがとても秀逸だったのでご紹介したいと思います。</p>
<h3><span>カスタマイズ性が高い</span></h3>
<p>まず自分が導入時に一番気にしていたことは、ツイートの内容がどこまで編集できるかということ。</p>
<p>単純にタイトルと記事のリンクをつぶやくプラグインなら数あれど、このプラグインほどカスタマイズ性が高いのはあまりありません。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/06/wp-to-twitter.jpg"><img src="http://inspire-tech.jp/wp-content/uploads/2011/06/wp-to-twitter-300x266.jpg" alt="" title="wp-to-twitter" width="300" height="266" class="alignnone size-medium wp-image-340" /></a>
</div>
<h4>編集時にも呟いてくれる</h4>
<p>ツイートの内容がテンプレートで編集できるのは当たり前として、投稿時に加えて編集時にもツイートをする機能を備えています。</p>
<h3><span>投稿時にツイートの内容を編集することができる</span></h3>
<p>これも他にはない機能ですが、投稿時にその投稿の時だけツイートの内容をカスタマイズすることも可能です。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/06/w.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/06/w-300x85.png" alt="" title="w" width="300" height="85" class="alignnone size-medium wp-image-683" /></a>
</div>
<p>まさに痒いところに手が届く機能。</p>
<h3><span>ダウンロード</span></h3>
<p>ダウンロードは<a href="http://www.joedolson.com/articles/wp-to-twitter/">こちらのサイト</a>から、またはWordPressの管理画面で「プラグインの追加」からWP to Twitterで検索して下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/06/wordpress_to_twitter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
