<?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; 開発</title>
	<atom:link href="http://inspire-tech.jp/category/development/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の「投稿」機能から「カテゴリー」や「タグ」をメニューごと消す方法</title>
		<link>http://inspire-tech.jp/2013/04/wordpress_remove_category_and_tag_from_post/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_remove_category_and_tag_from_post</link>
		<comments>http://inspire-tech.jp/2013/04/wordpress_remove_category_and_tag_from_post/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 12:22:05 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1472</guid>
		<description><![CDATA[WordPressでカスタム投稿やカスタム分類を使って、新しく分類や投稿を作成することは簡単に情報が見つかります。 しかし逆に、デフォルトの「投稿」機能から「カテゴリー」や「タグ」といった、 デフォルトで設定されている分 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPressでカスタム投稿やカスタム分類を使って、新しく分類や投稿を作成することは簡単に情報が見つかります。</p>
<p>しかし逆に、デフォルトの「投稿」機能から「カテゴリー」や「タグ」といった、 デフォルトで設定されている分類機能を取り外したいといった場合の情報はあまり見つかりません。</p>
<p>そんな時は下記のコードを<code>functions.php</code>に記述して利用します。</p>
<pre class="brush: php">
function my_unregister_taxonomies()
{
	global $wp_taxonomies;

	/*
	 * 投稿機能から「カテゴリー」を削除
	 */
	if (!empty($wp_taxonomies['category']->object_type)) {
		foreach ($wp_taxonomies['category']->object_type as $i => $object_type) {
			if ($object_type == 'post') {
				unset($wp_taxonomies['category']->object_type[$i]);
			}
		}
	}

	/*
	 * 投稿機能から「タグ」を削除
	 */
	if (!empty($wp_taxonomies['post_tag']->object_type)) {
		foreach ($wp_taxonomies['post_tag']->object_type as $i => $object_type) {
			if ($object_type == 'post') {
				unset($wp_taxonomies['post_tag']->object_type[$i]);
			}
		}
	}

	return true;
}

add_action('init', 'my_unregister_taxonomies');
</pre>
<p>これだけで簡単に「カテゴリー」や「タグ」などを外すことができます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2013/04/wordpress_remove_category_and_tag_from_post/feed/</wfw:commentRss>
		<slash:comments>147</slash:comments>
		</item>
		<item>
		<title>WordPressを複数ユーザーで利用している際に、「投稿」や「メディア」で自分が投稿したもの以外を表示させないようにするコード</title>
		<link>http://inspire-tech.jp/2012/11/view-of-the-posts-and-media-only-myself/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=view-of-the-posts-and-media-only-myself</link>
		<comments>http://inspire-tech.jp/2012/11/view-of-the-posts-and-media-only-myself/#comments</comments>
		<pubDate>Wed, 07 Nov 2012 01:37:51 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1458</guid>
		<description><![CDATA[WordPressを複数のユーザーで運営しているとき、投稿やメディアに関しては自分以外が投稿したものも、標準で表示されるようになっています。 特にメディア関してはフィルタをするような項目がなく、自分が投稿したもののみを表 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPressを複数のユーザーで運営しているとき、投稿やメディアに関しては自分以外が投稿したものも、標準で表示されるようになっています。</p>
<p>特にメディア関してはフィルタをするような項目がなく、自分が投稿したもののみを表示するような仕組みが用意されていません。</p>
<p>そのため、自分が投稿した画像を他人に利用されてしまったり、逆のこともできたりと、少々お粗末な管理になってしまっています。</p>
<h3><span>フィルターフックを使って表示を制限</span></h3>
<p>WordPressではWP_Queryクラスを利用して、一覧や詳細画面を表示する際にデータベースから投稿を取得してきます。</p>
<p>そこで、WP_Queryクラスが投稿を取得する前に、今現在ログインしているユーザーの投稿やメディアのみを取得するようにクエリを書き換える事で、上記のような問題を解決することができます。</p>
<p>下記のコードをfunctions.php等に記述してください。</p>
<pre class="brush: php">
function my_pre_get_posts_filter(&#038;$wp_query)
{
	global $pagenow;
	$user = wp_get_current_user();

	if (WP_ADMIN &#038;&#038; ($post_type = $wp_query->get('post_type'))) {
		if (in_array($pagenow, array('media-upload.php', 'upload.php')) &#038;&#038; $post_type == 'attachment') {
			// メディアの表示情報を制限
			$wp_query->set('author', $user->ID);
		}
	}
}

add_action('pre_get_posts', 'my_pre_get_posts_filter', 10, 1);
</pre>
<p>管理画面で表示しているかどうかの条件判断についてはもっと良い方法があるかと思うんですが、とりあえず上記コードで問題無く動作しています。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2012/11/view-of-the-posts-and-media-only-myself/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>DISQUSをスマートフォンで利用する場合にも、FacebookやTwitterでのログインを可能にする方法</title>
		<link>http://inspire-tech.jp/2012/11/disqus_for_smartphone/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=disqus_for_smartphone</link>
		<comments>http://inspire-tech.jp/2012/11/disqus_for_smartphone/#comments</comments>
		<pubDate>Wed, 07 Nov 2012 01:24:01 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[サービス]]></category>
		<category><![CDATA[ソーシャルメディア]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1432</guid>
		<description><![CDATA[WordPress等を利用している場合に、コメントシステムとして大変人気のあるDISQUSというコメントシステムがあります。 詳しくは下記のサイトなどをご覧頂くとして、このDISQUSはPC向けだけでは無く、スマートフォ [&#8230;]]]></description>
				<content:encoded><![CDATA[<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_1.png"><img class="alignleft size-large wp-image-1434" title="disqus_1" src="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_1-570x226.png" alt="" width="570" height="226" /></a></div>
<p>WordPress等を利用している場合に、コメントシステムとして大変人気のあるDISQUSというコメントシステムがあります。</p>
<p>詳しくは下記のサイトなどをご覧頂くとして、このDISQUSはPC向けだけでは無く、スマートフォンなどでも表示できるモバイルテーマが標準で附属しています。</p>
<p>しかしこのモバイルテーマ、なぜかPC向けと違い、FacebookやTwitterでログインする機能が省略されてしまっています。</p>
<p>かといってPC版のインターフェースをスマートフォンで利用しようとすると、コメント部分は普通に利用できるものの、ログインウィンドウが画面からはみ出してしまい、相当解像度の高いスマートフォンではないとログインに支障がでてしまいます。</p>
<ul>
<li><a href="http://inspire-tech.jp/wp-admin/post.php?post=1432&amp;action=edit&amp;message=10">投稿の編集 ‹ INSPIRE TECH — WordPress</a></li>
</ul>
<h3><span>スマートフォン向け対応できるCSSを書いた</span></h3>
<p>DISQUSはAPIの管理画面から、独自にCSSを適用することが可能です。</p>
<p>そこで、PC向けのログインウィンドウをスマートフォンで見た際にも、綺麗に画面内に収まるようカスタムCSSを作成してみました。</p>
<p><span id="more-1432"></span></p>
<pre class="brush: css">

.dsq-popup[id] {
	position: absolute !important;
}

.dsq-popup-container .dsq-popup-close {
	right: 5px;
	top: 5px;
	position: absolute !important;
	z-index: 1200 !important;
}

.dsq-popup-container .dsq-popup-title {
	position: relative !important;
}

.dsq-popup-container .dsq-popup-title h3 {
	font-size: 12px !important;
}

.dsq-popup .dsq-tabbed-modal {
	background: none !important;
}

#dsq-popup-message #dsq-login-disqus iframe {
	height: 300px !important;
}

.dsq-popup-body {
	width: auto !important;
}

.dsq-login-box .dsq-popup-body {
	width: 300px !important;
}

.dsq-popup .dsq-modal-tabs {
	width: auto !important;
	float: none !important;
}

#dsq-popup-message.dsq-popup .dsq-modal-tabs li {
	float: left !important;
	width: 43px !important;
}

#dsq-popup-message.dsq-popup .dsq-modal-tabs li a {
	padding: 4px 6px !important;
	text-align: center !important;
	font-size: 0px !important;
	border-bottom: none !important;
}

.dsq-popup .dsq-tab-container {
	padding: 10px !important;
	font-size: 12px !important;
}

#dsq-popup-message.dsq-popup .dsq-modal-tabs li.dsq-active a {
	border-bottom: none !important;
	-webkit-box-shadow: none !important;
	-moz-box-shadow: none !important;
	box-shadow: none !important;
	background: #eee !important;
}

#dsq-popup-message.dsq-popup .dsq-modal-tabs li.dsq-active a:hover {
	border-bottom: none !important;
}
</pre>
<h3><span>適用方法</span></h3>
<p>適用したいアカウントのアピアランスパネルを開きます。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_2.png"><img src="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_2-570x171.png" alt="" title="disqus_2" width="570" height="171" class="alignleft size-large wp-image-1435" /></a>
</div>
<p>スクロールして中ほどより下にある、Custom CSSの欄に上記コードを記述して保存します。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_3.png"><img src="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_3-570x189.png" alt="" title="disqus_3" width="570" height="189" class="alignleft size-large wp-image-1436" /></a></div>
<h3><span>JavaScriptの設置</span></h3>
<p>上記CSSだけではポップアップウィンドウの位置がおかしくなるため、下記JavaScriptを設置してください。</p>
<pre class="brush: js">
jQuery(function($) {
	setInterval(function() {
		$('#dsq-popup-message').css({
			'position': 'absolute',
			'top': $(window).scrollTop() + 10
		});
	}, 1000);
});
</pre>
<h3><span>スマートフォンでの表示</span></h3>
<p>こんな感じで表示されます。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_4.jpg"><img src="http://inspire-tech.jp/wp-content/uploads/2012/11/disqus_4-300x533.jpg" alt="" title="disqus_4" width="300" height="533" class="alignleft size-medium wp-image-1451" /></a></div>
<h3><span>注意</span></h3>
<p><strong>カスタムCSSはPC版にももれなく適用されてしまう</strong>ため、PCとスマートフォンで利用する場合には、上記CSSにスマートフォンのみのクラス名やIDなどを追加するなどして、環境によって表示を切り替えられるよう工夫が必要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2012/11/disqus_for_smartphone/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>九星気学で本命星と月命星を算出できるPHPのコードを書いてみたよ。</title>
		<link>http://inspire-tech.jp/2012/02/nine_star_ki_php_class/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=nine_star_ki_php_class</link>
		<comments>http://inspire-tech.jp/2012/02/nine_star_ki_php_class/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 16:49:42 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ライブラリ]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1335</guid>
		<description><![CDATA[九星気学という有名な占術があります。 九星気学 &#8211; Wikipedia 身近では厄払いの方位除けなどに使われ、方位の吉凶を占う際によく利用されるようです。 方位除けに行った際「五黄殺」や「暗剣殺」なんていう単 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>九星気学という有名な占術があります。</p>
<ul>
<li><a href="http://ja.wikipedia.org/wiki/%E4%B9%9D%E6%98%9F%E6%B0%97%E5%AD%A6" title="九星気学 - Wikipedia">九星気学 &#8211; Wikipedia</a></li>
</ul>
<p>身近では厄払いの方位除けなどに使われ、方位の吉凶を占う際によく利用されるようです。<br />
方位除けに行った際「五黄殺」や「暗剣殺」なんていう単語を見た・聞いたことがある方が多いかと思いますが、まさにそういった方位と関係があり、自分の生年月日から算出する「本命星」と「月命星」から、方位の吉凶を占います。（間違えていたらごめんなさい！）</p>
<p>九星気学の詳しい説明はWikipediaに任せるとして、仕事で生年月日から「本命星」と「月命星」を算出できるPHPのコードを書きましたので、何かに使えるかと思い、公開します。<br />
<span id="more-1335"></span></p>
<h3><span>必要環境</span></h3>
<ul>
<li>PHP5.0以上</li>
</ul>
<h3><span>ソースコード</span></h3>
<p><script src="https://gist.github.com/1901958.js?file=nine_star_ki.php"></script></p>
<p class="note">NineStarKiというのは、海外での九星気学の呼び方です。</p>
<h3><span>使い方</span></h3>
<p><code>NineStarKi::yearly(int year, int month, int day)</code></p>
<p>で、本命星が算出されます。</p>
<p><code>NineStarKi::monthly(int year, int month, int day)</code></p>
<p>で、月命星が算出されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2012/02/nine_star_ki_php_class/feed/</wfw:commentRss>
		<slash:comments>72</slash:comments>
		</item>
		<item>
		<title>WordPressのカスタムメニュー（nav menu）に画像を使うためのコードを書いてみたよ！</title>
		<link>http://inspire-tech.jp/2011/12/wordpress_use_image_for_nav_menu/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress_use_image_for_nav_menu</link>
		<comments>http://inspire-tech.jp/2011/12/wordpress_use_image_for_nav_menu/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 04:30:33 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=1232</guid>
		<description><![CDATA[WordPress3.0から搭載されたカスタムメニュー（nav menu）は、サイト内コンテンツをドラッグアンドドロップで自由にカテゴライズする事が可能となり、グローバルメニューやサイトマップなどを管理する場合にとても便 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>WordPress3.0から搭載されたカスタムメニュー（nav menu）は、サイト内コンテンツをドラッグアンドドロップで自由にカテゴライズする事が可能となり、グローバルメニューやサイトマップなどを管理する場合にとても便利な機能です。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/12/nav-menu.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/12/nav-menu-570x252.png" alt="" title="nav-menu" width="570" height="252" class="alignnone size-large wp-image-1233" /></a></div>
<p>ただ、このカスタムメニュー、cssのクラス名などを指定する事は可能ですが、リンクボタンに画像を直接利用しようとなると、いろいろな工夫が必要になります。</p>
<p>単純に画像のURLを、メニューのに登録したエントリのタイトルに指定することもできますが、WordPressに多少詳しくないと、アップロードした画像のURLなどを指定するのは敷居が高いですし、メニューの管理上も画像のURLがエントリ名となってしまうため、管理がし辛くなってしまいます。</p>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/12/bad-nav-menu.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/12/bad-nav-menu-300x389.png" alt="" title="bad-nav-menu" width="300" height="389" class="alignnone size-medium wp-image-1236" /></a></div>
<p><span id="more-1232"></span></p>
<h3><span>もっと簡単に画像を使う</span></h3>
<p>そこで、「メニュー名＋メニューに登録したエントリー名」と同一の画像がライブラリに登録されていた場合、自動的にその画像を利用するコードを書いてみました。</p>
<h4>利用条件</h4>
<ul>
<li>PHP 5.2</li>
<li>WordPress 3.1</li>
</ul>
<h4>functions.php</h4>
<p><script src="https://gist.github.com/1436723.js?file=functions.php"></script></p>
<p>上記のコードをfunctions.phpとして利用するか、既存のファイルに追記して使って下さい。</p>
<h4>使い方</h4>
<p>カスタムメニューを下記のような状態で登録したとします。</p>
<ul>
<li>メニュー名：　テスト</li>
<li>エントリー名：　テストの記事</li>
</ul>
<div class="component img"><a href="http://inspire-tech.jp/wp-content/uploads/2011/12/test-nav-menu.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/12/test-nav-menu-570x354.png" alt="" title="test-nav-menu" width="570" height="354" class="alignnone size-large wp-image-1240" /></a></div>
<p>この場合、ライブラリに「<code>テスト/テストの記事</code>」というタイトルの画像があった場合、<strong>自動的にその画像をメニューの画像として利用</strong>します。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/12/wordpress_use_image_for_nav_menu/feed/</wfw:commentRss>
		<slash:comments>37</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>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>CakePHP1.3でデバッグレベルが0の時でもSQLのログを記録する方法</title>
		<link>http://inspire-tech.jp/2011/07/cakephp_save_sql_log/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp_save_sql_log</link>
		<comments>http://inspire-tech.jp/2011/07/cakephp_save_sql_log/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 13:11:13 +0000</pubDate>
		<dc:creator><![CDATA[家富 正幸]]></dc:creator>
				<category><![CDATA[その他]]></category>
		<category><![CDATA[参考]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[データベース]]></category>

		<guid isPermaLink="false">http://inspire-tech.jp/?p=857</guid>
		<description><![CDATA[CakePHPではデバッグレベルが2の場合、レンダリングした画面の下部に発行したSQLのログを表示してくれます。 この機能は非常に便利ですが、本番環境などでデバッグレベルを0にしていると、発行したSQLを確認する手段があ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CakePHPではデバッグレベルが2の場合、レンダリングした画面の下部に発行したSQLのログを表示してくれます。</p>
<div class="component img">
<a href="http://inspire-tech.jp/wp-content/uploads/2011/07/cakephp-sql-log.png"><img src="http://inspire-tech.jp/wp-content/uploads/2011/07/cakephp-sql-log-570x196.png" alt="" title="cakephp-sql-log" width="570" height="196" class="alignnone size-large wp-image-957" /></a></div>
<p>この機能は非常に便利ですが、本番環境などでデバッグレベルを0にしていると、発行したSQLを確認する手段がありません。</p>
<p>本番環境で何かしらデータベースエラーが発生した場合に、発行されているSQLを確認したいと思っても、そのままでは方法が無いのが現状です。</p>
<p>そこで、利用しているデータベースのドライバクラスを改良して、CakePHPのデバッグレベルに関わらず、発行したSQLをログファイルに保存できるように改造してみます。</p>
<h3><span>ロギング用のデータベースドライバを作成</span></h3>
<p>CakePHPのコアファイルに手を入れるのは避けたいので、データベースのドライバクラスを継承したログファイル保存用のドライバクラスを作成します。</p>
<p>ここではMySQLを利用する場合を想定します。<br />
他のデータベースを利用している場合は、適宜利用しているデータベースのドライバクラスにを読み替えて下さい。</p>
<h4>ファイルを作成</h4>
<p><code>app/models/datasources/</code> に <code>dbo_mysql_log.php</code> を作成します。</p>
<h4>dbo_mysqlを継承したコードを記述する</h4>
<p>ここでは<code>DboMysql</code>を継承した<code>DboMysqlLog</code>という名前でクラスを作成します。</p>
<p>そして、SQLを発行するための関数である<code>execute</code>関数と、SQLのログ表示に関する処理を行う<code>logQuery</code>関数をオーバーライトして、SQLをログに保存する設定であれば、実行したSQLをログファイルに保存できるように改良します。</p>
<p><script src="https://gist.github.com/1073579.js"> </script></p>
<p><code>App::import()</code>関数を利用してスーパークラスを読み込んでおかないとエラーが出ますので注意して下さい。</p>
<h3><span>データベースの接続設定を行う</span></h3>
<p><code>app/configs/database.php</code> ファイルの中で、利用するデータベースのドライバ指定を、先ほど作成したドライバに切り替えます。</p>
<pre class="brush: php">
public $development = array(
	'driver' => 'mysql_log',
	'persistent' => false,
	'host' => 'localhost',
	'login' => '********',
	'password' => '********',
	'database' => 'test',
	'prefix' => '',
	'encoding' => 'utf8'
);
</pre>
<p><code>driver</code>の指定は、作成したドライバのファイル名から <code>dbo_</code> と拡張子を除いたもので指定しましょう。</p>
<h3><span>ログ保存用の設定を行う</span></h3>
<p><code>config/bootstrap.php</code> に下記のようなコードを記述します。</p>
<pre class="brush: php">
Configure::write('Sql.log', true);
</pre>
<p>これで、デバッグレベルに関係なく、発行されたSQLが <code>tmp/logs/sql.log</code> に出力されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://inspire-tech.jp/2011/07/cakephp_save_sql_log/feed/</wfw:commentRss>
		<slash:comments>6</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>
	</channel>
</rss>
