<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>wpxtreme</title>
	<atom:link href="http://wpxtreme.jp/feed" rel="self" type="application/rss+xml" />
	<link>http://wpxtreme.jp</link>
	<description>XTREME WORDPRESS STUNTS</description>
	<lastBuildDate>Fri, 14 Dec 2012 06:30:06 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/feed" />
		<item>
		<title>WordPress 投稿本文のドメイン付き絶対URL問題を解決してスムーズな環境移行を実現する方法</title>
		<link>http://wpxtreme.jp/how-to-resolve-the-absolute-url-probrem-in-post-content</link>
		<comments>http://wpxtreme.jp/how-to-resolve-the-absolute-url-probrem-in-post-content#comments</comments>
		<pubDate>Wed, 25 Apr 2012 05:49:59 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[HOW-TO]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=987</guid>
		<description><![CDATA[WordPress 10大なんでやねんの筆頭に挙げられる、投稿本文へのドメイン付き絶対 URL 直書き仕様。記事へのリンクが簡単挿入！となったときに少し期待しましたが、直書きのパターンが増えただけでした。。<br />
このなんでやねんに関しては ジムさんが <a href="http://www.warna.info/archives/20/">WordPressで挿入する画像のsrcを相対リンクにする</a> や <a href="http://www.warna.info/archives/1789/">WordPressで挿入する画像のsrcを相対リンクにする【発展版】</a> の記事をしたためていらっしゃいます。したためてって「認めて」って書くんですね、勉強になりました！<br />
今回はジムさんに似た方法で、テスト環境から本番環境への移行も、ドメイン変更もへっちゃら！涼しい顔でラクラクこなせる驚きの方法をお届けします。<a class="excerpt-more" href="http://wpxtreme.jp/how-to-resolve-the-absolute-url-probrem-in-post-content">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>ショートコードに置き換えます。</h4>
<p>やってることは <a href="http://www.warna.info/">Simple Colors</a> さんと同じです。あ、でもパクリちゃいますよ。WordPress なんつー超メジャーなパブリッシングプラットホームじゃぁ大抵のことは既に誰かがやっています。検索したら類似記事があったけど、せっかくなので記事書こう、みたいな Web あるあるです。記事を書くからには人として知ってて丸無視はできませんので、先達に敬意を表することがオープンソースに生きる我ら Web クリエイターとしての礼儀ってもんです。</p>
<p>知り合いのマイナー（失礼な）ブログでなるほど記事を読んだしばらく後に、メジャーなブログで同じような記事を見かけたら残念な気持ちになりますよね。それが続くと　なんやろこれ　ってなりますよね。え、ならない？なりませんか！わぉ。</p>

<h4>コード</h4>
<p>テーマフォルダの functions.php に以下のコードを貼り付ければ OK です。</p>
<pre class="code"><code>// [my_home_url] ショートコードを定義します。
add_shortcode( &#039;my_home_url&#039;, &#039;my_home_url&#039; );
function my_home_url( $atts ) {
    return home_url();
}

// 投稿保存時に、本文内のドメイン付き絶対URL部分を [my_home_url] に置換します。
add_filter( &#039;wp_insert_post_data&#039;, &#039;my_insert_post_data&#039;, 10, 2 );		
function my_insert_post_data( $data, $postarr ) {
    $data[&#039;post_content&#039;] = preg_replace( 
        &#039;/&#039;.preg_quote( home_url(), &#039;/&#039; ).&#039;/&#039;, 
        &#039;[my_home_url]&#039;, 
        $data[&#039;post_content&#039;] 
    );
    return $data;	
}

// 管理画面での投稿編集時に  [my_home_url] をドメイン付き絶対URL に戻します。
add_filter( &#039;the_editor_content&#039; , &#039;my_the_editor_content&#039; );			
function my_the_editor_content( $content ) {
    return preg_replace( 
        &#039;/&#039;.preg_quote( &#039;[my_home_url]&#039; ).&#039;/&#039;, 
        home_url(), 
        $content 
    );	
}</code></pre>



<h4>仕組み</h4>
<ol>
<li>投稿の保存時に、本文内で 管理画面の［設定｜一般］の［サイトアドレス (URL)］に相当する部分 をショートコード [my_home_url] に置換します。</li>
<li>ショートコードなので、本文の取得＆表示時に 'the_content' フィルタを <code>apply_filters()</code> されると [my_home_url] がサイトアドレスに置換されます。</li>
<li>投稿編集時は 'the_editor_content' フィルタで同上です。</li>
</ol>
<p>これで画像のパスも別投稿へのリンクも、投稿本文中にあるドメイン付き絶対URL はひととおりヨキに計らってくれます。WordPress をインストールした<a href="http://wpdocs.sourceforge.jp/Giving_WordPress_Its_Own_Directory">ディレクトリとは別のディレクトリ</a>にサイトのホームページを設定したりしなかったりしても大丈夫です。また、クライアントがショートコードを目にすることもないので、何かと安心です。</p>
<p>ところでセキュアな URI スキームの場合はどうするんだい？と上司がイジワル言ってくるかもしれないので、その辺りは <a href="http://www.warna.info/">ジムさんのブログ</a> を参考にご自身でチャレンジしてみてください。</p>
<p class="append">追記<br />
この方法はコンテンツを仕込む前に施しておく必要があります。既に記事を書きまくってしまった方は、ヲカモトさんの<a href="http://memo.dogmap.jp/2011/09/28/change-url/">WordPress でドメイン移行したとき全URLを手っ取り早く変える</a>を参考にチェンジにチャレンジしてみてください。</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.3.1</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/how-to-resolve-the-absolute-url-probrem-in-post-content/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/how-to-resolve-the-absolute-url-probrem-in-post-content" />
	</item>
		<item>
		<title>Contact Form 7 でラジオボタンを必須にする</title>
		<link>http://wpxtreme.jp/how-to-make-radio-buttons-required-in-contact-form-7</link>
		<comments>http://wpxtreme.jp/how-to-make-radio-buttons-required-in-contact-form-7#comments</comments>
		<pubDate>Tue, 17 Apr 2012 04:30:10 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TIPS]]></category>
		<category><![CDATA[Contact Form]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=976</guid>
		<description><![CDATA[みんな大好き <a href="http://contactform7.com/?lang=ja">Contact Form 7</a>！<s>駄菓子菓子</s> だがしかし、そのファースト・マトリックスが如き美しいアーキテクチャは、多くの場合、日本の悪しき慣習だったりクライアントのひとことだったり、ディレクターの思いつきによってメタメタにされてしまうのであった。。。<a class="excerpt-more" href="http://wpxtreme.jp/how-to-make-radio-buttons-required-in-contact-form-7">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>さて、今回は ラジオボタン</h4>
<p>Contact Form 7 はなんでラジオボタンを必須にできないの？とみなさんおっしゃいます。ソレに対して Contact Form 7 の<a href="http://contactform7.com/checkboxes-radio-buttons-and-menus/?lang=ja">チェックボックス、ラジオボタン、メニュー</a> のページでは、<a href="http://www.w3.org/TR/html401/interact/forms.html#radio">HTML の仕様</a> を見てみなはれと書かれています。Web 業界の中の人で仕様をちゃんと読んで仕事をする人の割合はだいたい消費税くらいなもんでしょうか。早く10%行くといいですね。<br />
で、仕様を読んでみると「ラジオボタンてどれかひとつが選択されてなアカンやん。全部 OFF やったらブラウザがはじめのヤツを ON にしたったらええやん。ほんでもブラウザかてアテにならんでアンタがどれか ON にしとき。絶対やで。」言うてはります。<br />そう、必須も何もラジオボタンというのはハジメから「どれかひとつを選ばれてる状態にしておく」ものなのでした。さっそく <a href="http://ideasilo.wordpress.com/2007/12/25/contact-form-7-173/#more-79">default オプション</a> で選択しておきましょう！</p>
<h4>とは言っても</h4>
<p>そんな HTML の仕様など関係無く毎日を生きてるおっちゃんおばちゃんとかは、未選択の状態から閲覧者にどれかひとつを選んで欲しいと言ってきます。未選択じゃなくても変わらないと思うのですが、そこはもうおっちゃんおばちゃんですから人の言うことなど聞く耳持ちません。Contact Form 7 ではそういうご要望に応えるため（かどうかは知らないぜ）に「チェックボックスを排他化する」という仕組みがあります。見た目はチェックボックスになりますが、選択できるのはひとつのみ。全 OFF の状態にもできます。すばらしい！</p>
<h4>とは言っても2</h4>
<p>おっちゃんおばちゃんですからラジオボタンの見た目がいいと言ってききません。じゃぁもう JavaScript で画像を使って見た目ラジオボタンにしたらええやんと思うのですが、そんなんメンドくさいやん、JavaScript 使えへんし、という方々のために以下のコードを捧げます。テーマの functions.php に貼付ければ OK◎</p>

<pre class="code"><code>add_filter( &#039;wpcf7_validate_radio&#039;, &#039;my_validate_radio&#039; ), 10, 2 );
function my_validate_radio( $result, $tag ) {
    $type = $tag[&#039;type&#039;];
    $name = $tag[&#039;name&#039;];

    if ( &#039;radio&#039; == $type ) {
        if ( empty( $_POST[$name] ) ) {
            $result[&#039;valid&#039;] = false;
            $result[&#039;reason&#039;][$name] = wpcf7_get_message( &#039;invalid_required&#039; );
        }
    }
        
    return $result;
}</code></pre>



<p>※ radio* のタグ追加ではなくて、ラジオボタンならとにかく未選択は許さない仕様です。</p>
<h5>動作確認バージョン</h5><ul class="tested-vers"><li>Contact Form 7 3.1.2</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/how-to-make-radio-buttons-required-in-contact-form-7/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/how-to-make-radio-buttons-required-in-contact-form-7" />
	</item>
		<item>
		<title>WordPress で「全◯件中◯件〜◯件目を表示」を表示する</title>
		<link>http://wpxtreme.jp/display-search-or-archive-count-in-wordpress</link>
		<comments>http://wpxtreme.jp/display-search-or-archive-count-in-wordpress#comments</comments>
		<pubDate>Fri, 16 Dec 2011 03:40:15 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TIPS]]></category>
		<category><![CDATA[archive]]></category>
		<category><![CDATA[category]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=975</guid>
		<description><![CDATA[検索結果や各種アーカイブなどの記事一覧でページネーションする場合によくある表示「全◯件中◯件〜◯件目を表示しています」の決定版をお届けします。件数取得のために改めて get_posts() 的なことをしないので WordPress に優しい作りです。また posts_per_page = -1 のときに $wp_query->found_posts が 0 になる不具合にも対応済です。<br />ただし、不正なページ指定による Not Found 時やハナから have_posts() が false な場合に何らかの表示が必要な場合は、別途対応してください。
<a class="excerpt-more" href="http://wpxtreme.jp/display-search-or-archive-count-in-wordpress">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>ちょっと長いですが</h4>
<p>テーマフォルダの functions.php に以下を追加します。</p>
<pre class="code"><code>function my_result_count() {
  global $wp_query;

  $paged = get_query_var( &#039;paged&#039; ) - 1;
  $ppp   = get_query_var( &#039;posts_per_page&#039; );
  $count = $total = $wp_query-&gt;post_count;
  $from  = 0;
  if ( 0 &lt; $ppp ) {
    $total = $wp_query-&gt;found_posts;
    if ( 0 &lt; $paged )
      $from  = $paged * $ppp;
  }
  printf(
    &#039;&lt;p&gt;全%1$s件中 %2$s%3$s件目を表示&lt;/p&gt;&#039;,
    $total,
    ( 1 &lt; $count ? ($from + 1 . &#039;〜&#039;) : &#039;&#039; ),
    ($from + $count )
  );
}</code></pre>



<h4>使い方</h4>
<p>index.php, archive.php, category.php, date.php などの記事一覧系テンプレートファイルに、以下のように書きます。</p>
<pre class="code"><code>if ( have_posts() ) : 
  my_result_count();  // ここら辺で表示します
  while ( have_posts() ) :
    the_post();
    /* do stuff */
  endwhile;
else :
  /* Nothing Found */
endif;
</code></pre>



<h4>ちなみに</h4>
<p>「全部で◯件」を取得するだけなら以下のように書けば OK ◎</p>
<pre class="code"><code>$count = 0 &lt; get_query_var( &#039;posts_per_page&#039; ) ? $wp_query-&gt;found_posts : $wp_query-&gt;post_count;</code></pre>


<p>※ functions.php など、テンプレートファイル以外に書く場合は予め <code>global $wp_query;</code> の記述も必要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/display-search-or-archive-count-in-wordpress/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/display-search-or-archive-count-in-wordpress" />
	</item>
		<item>
		<title>WordPress ループ＆クエリーのモヤモヤを解消しよう！</title>
		<link>http://wpxtreme.jp/understanding-wordpress-loops-and-queries</link>
		<comments>http://wpxtreme.jp/understanding-wordpress-loops-and-queries#comments</comments>
		<pubDate>Mon, 12 Dec 2011 03:40:40 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TUTORIALS]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[modifications]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=913</guid>
		<description><![CDATA[12月25日まで毎日ブログをつないでいく <a href="http://atnd.org/events/22823">WordPress Advent Calendar</a>、12日目担当 福山カズヒデ (<a href="http://twitter.com/#!/kzxtreme">@kzxtreme</a>) です、こんにちは。aka aus Cothodyntomo（<a href="http://twitter.com/#!/aka_aus_pd">@aka_aus_pd</a>）さんの「<a href="http://plasticdreams.org/archives/2011/12/11/2830/rusty-nails/">錆びたブログをまた動かすときに必要な事柄</a>」からバトンをいただきました！<br />WordPress 都市伝説のひとつ「query_posts() は危険」のデマは、地道な「wp_reset_query() を使おうキャンペーン」によりかなり沈静化しましたが、それでもなお「get_posts() 以外は信用ならん」「WP_Query 最強！」と各派閥がシノギを削る争いを繰り広げています。ラブ＆ピースなクリスマスを迎えるために、WordPress の最も基本的な機能でありながら最も正しく理解されていないこの最大のモヤモヤを、今日ここでスッキリと解消してしまいましょう！<a class="excerpt-more" href="http://wpxtreme.jp/understanding-wordpress-loops-and-queries">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>複数ループ</h4>
<p>index.php などで</p>
<pre class="code"><code>while( have_posts() ) : the_post();
    /* do stuff */
endwhile;</code></pre>


<p>のように WordPress ループ（メインループ）の処理をいきなり書けるのは、テンプレートファイルが実行される時点ですでに「サイトにアクセスされた URL からクエリ変数を抽出し、それらの条件に一致する記事オブジェクトを取得している」からです。</p>
<p>そして、例えばホーム（トップページ）やサイドバーなどで、メインループとは別の条件で記事を取得（，出力）するループ処理がある場合、それらを複数ループ（Multiple Loops）と言います。<br />
ここでよくある不具合が</p>
<ul>
  <li>サイドバーやフッターで条件分岐タグが正しく判定されない。</li>
  <li>ページネーションが正しくできない。</li>
  <li>$post を使う関数の結果が正しくない。</li>
</ul>
<p>などなど。。。エラーにならないけど値が変わっている、動作がおかしい、WordPress は不安定？と、謎現象として長らく恐れられています。</p>

<h4>グローバル変数の扱いを理解しよう</h4>

<p>複数ループは不安定、危険などと言われる原因は、ループ＆クエリーでのグローバル変数の扱いが十分に理解されていないことにあります。</p>
<p>以下は、ループ＆クエリーに関係のある主なグローバル変数です。</p>
<pre class="code"><code>$wp_the_query ..... WP_Query オブジェクト。URL のクエリーバックアップ用。
$wp_query ......... WP_Query オブジェクト。カレントのクエリー。
$posts ............ クエリーを実行して取得した記事オブジェクトの配列。
$post ............. カレントの記事オブジェクト。</code></pre>



<p>そして、これらのグローバル変数を上書きする関数は以下の通り。</p>
<pre class="code"><code>query_posts() ........................ $wp_query を上書き。
the_post(), WP_Query::the_post() ..... $post を上書き。
</code></pre>


<p>テンプレートファイル内では <code>$wp_query, $posts, $post</code> はグローバル変数として宣言されているので、これらも何らかの値を代入すれば上書きされます。
<p>さらに、上書きされたグローバル変数を復元する関数があります。</p>
<pre class="code"><code>wp_reset_query() ........ $wp_query を $wp_the_query, $post を $wp_query-&gt;post で復元。
wp_reset_postdata() ..... $post を $wp_query-&gt;post で復元。
</code></pre>


<p>例えば <code>is_category()</code> などの条件分岐タグや <code>posts_nav_link()</code> などはグローバル変数の <code>$wp_query</code> を元にしています。「メインループの状態が欲しいのにグローバル変数を上書きしたまま復元していない」「グローバル変数を復元した後に複数ループ側の状態を取得している」といった現在のグローバル変数の状態を正しく認識していないことが、複数ループにまつわる問題の原因です。</p>

<h4>正しい書き方</h4>
<p>以下は、<code>query_posts(), get_posts(), WP_Query()</code> 各々についての、現在のところ副作用が無く不具合を作り込み難い書き方です。なお、いずれの関数／クラスも内部では最終的に <code>WP_Query::get_posts()</code> を実行しています。
<h5>query_posts()</h5>
<pre class="code"><code>$arg = array( 
    /* 省略 */ 
    &#039;paged&#039; =&gt; get_query_var( &#039;paged&#039; ), // ページネーションするなら必須
);
query_posts( $args );
    while ( have_posts() ) : 
        the_post();
        /* do stuff 
           the_title(), the_permalink() 等使用可
        */
    endwhile;
    /* 必要なら endwhile 〜 wp_reset_query() の間でページネーション */
wp_reset_query();</code></pre>


<p>グローバル変数の <code>$wp_query, $post</code> を使うテンプレートタグ／関数がそのまま利用できるので便利です。ちなみに</p>
<pre class="code"><code>query_posts();
  /* */
query_posts();
  /* */
wp_reset_query();</code></pre>


<p>のように複数の <code>query_posts()</code> の最後に <code>wp_reset_query()</code> しても問題ありませんが、気持ち悪いのでやめましょう。</p>
<h5>get_posts()</h5>
<pre class="code"><code>$arg = array( 
    /* 省略 */ 
);
$my_posts = get_posts( $args );  //  $posts = とは書かない
    global $post;  // テンプレートファイル内なら書かなくても良い
    foreach ( $my_posts as $post ) : 
        setup_postdata( $post );
        /* do stuff 
           the_title(), the_permalink() 等使用可
        */
    endforeach;
wp_reset_postdata();</code></pre>


<p><code>$posts =</code> と書かないのは、<code>$posts</code> を復元する関数が用意されていないからです。他で使用されるフシが無く、</p>
<pre class="code"><code>$GLOBALS[&#039;posts&#039;] = &amp; $wp_query-&gt;posts;</code></pre>


<p>で復元すれば良さそうですが、余計なことはしない方が得策です。また、グローバル変数の <code>$post</code> を使用せず <code>$my_post</code> のようにも書けますが、<code>the_title()</code> などのテンプレートタグはグローバル <code>$post</code> 専用のため、<code>echo get_the_title( $my_post )</code> のように書く必要があります。
<p>ついでに <code>get_posts(), get_children()</code> は <code>query_posts(), WP_Query()</code>の WordPress ループの内側で入れ子ループとしても利用できます。そういえばメインループから見るとここで挙げている3つの関数／クラスはどれも二重ループの内側になりますね。</p>
<p>ただし <code>query_posts(), get_posts(), WP_Query()</code> の同じ関数／クラスでループを入れ子にするのはやめましょう。その必要はまずありませんし、労多くして得るもの少なしです。</p>

<h5>WP_Query()</h5>
<pre class="code"><code>$arg = array( 
    /* 省略 */ 
);
$my_query = new WP_Query( $args );
    while ( $my_query-&gt;have_posts() ) : 
        $my_query-&gt;the_post();  // global の $post を上書きする
        /* do stuff 
           the_title(), the_permalink() 等使用可
        */
    endwhile;
wp_reset_postdata();</code></pre>


<p><code>$my_query->the_post()</code> がグローバル変数の <code>$post</code> を上書きすることに注意しましょう。これよりは <code>query_posts()</code> の方が素直で使い易いかな、と思います。</p>

<h4>クエリーの改変</h4>
<p>もしメインループとは別のループ、ではなく、メインループそのものを変更したいだけなら <code>pre_get_posts</code> アクションを使うと良いでしょう。WordPress はメインループ用に URL からクエリ変数を抽出し、条件に一致する記事オブジェクトを取得していますが、これにも <code>WP_Query::get_posts()</code> が使用されています。</p>
<p><code>pre_get_posts</code> アクションは、<code>WP_Query::get_posts()</code> の内部でオリジナルのクエリーからクエリ変数や条件分岐タグ用の変数を設定した後かつ記事オブジェクトを取得する前に実行されるため、元のクエリーを判定して新たなクエリーを与えることができます。複数ループにする必要がなくメインループだけで完結するので、クエリ実行のコストが節約できますね。</p>
<h5>例）カテゴリーアーカイブは1ページ20件で日付の昇順にする場合</h5>
<p>テーマフォルダの functions.php に以下を追加します。</p>
<pre class="code"><code>add_action( &#039;pre_get_posts&#039;, &#039;my_pre_get_posts&#039; );
function my_pre_get_posts( $query ) {
    if ( ! is_admin() &amp;&amp; is_category() ) {
        $query-&gt;set( &#039;posts_per_page&#039;, 20 );
        $query-&gt;set( &#039;order&#039;, &#039;ASC&#039; );
    }
}</code></pre>


<p><code>! is_admin()</code> の条件が無いと、管理画面でも有効になります。</p>


<h4>CONCLUSION</h4>
<p>謎めいた現象に見えても、プログラムは書いた通りにしか動いていないのでした。仕組みがわかりさえすればとてもシンプルなことでしたね。</p>
<p>明日は <a href="http://twitter.com/#!/shinichiN">@shinichiN</a> さんです！お楽しみに！</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.2.1</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/understanding-wordpress-loops-and-queries/feed</wfw:commentRss>
		<slash:comments>65</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/understanding-wordpress-loops-and-queries" />
	</item>
		<item>
		<title>センスと理詰め</title>
		<link>http://wpxtreme.jp/sense-and-theory</link>
		<comments>http://wpxtreme.jp/sense-and-theory#comments</comments>
		<pubDate>Thu, 01 Dec 2011 04:27:33 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TEXT]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=885</guid>
		<description><![CDATA[<a href="http://takashi178.me/2011/11/web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AB%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%BB%E3%83%B3%E3%82%B9%E3%81%AF%E5%BF%85%E8%A6%81%E3%81%8B%EF%BC%9F/">Webデザインに”デザインセンス”は必要か？</a> という記事が興味深かったので、全然違う話になりますが Web デザインに限らず自分が思うことをまとめておきます。<a class="excerpt-more" href="http://wpxtreme.jp/sense-and-theory">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>センスと理論</h4>
<p>昔カリスマ美容師が流行ったときにテレビで見た、クマさんみたいなチャラくない美容師さんとモデルさんのやりとりにこんなクダリがありました。</p>
<div class="talk">
<p>モデルさん「あのさ、ここ来るといっつもこっちだけ何故か長くされるんだけどどうして？」<br />
クマさん　「あ、ホントだ。なんでだろ、でもそうじゃないとキマらなくない？」<br />
モデルさん「そうなのよねー。他の人だとこうはならないのよね、すごいなぁ。」</p>
</div>
<p>みたいな。</p>
<p>クマさんは学校で学び習得した理論から、この女優の頭の形や髪の生え方・クセを計算して、髪の長さやカットの仕方を導き出しているわけではないんですね多分。もちろんそういうような理論はある気がしますが、それにハマっていないから彼にしかできないわけで、そらもうただ「なんとなく」なんていう理由なわけです。<br />
<p>ただしその「なんとなく」には理由があって、自分が一番シックリくることなんだと思います。それがその人のセンスであり、自分の脳内に快感物質が分泌されまくる方向です。多くの人がそのアウトプットをいいね！と感じるならセンスが良いということになるのでしょう。</p>
<p>このクマさんのカットの仕方を解析してみると、実に美しく理論的にまとめられるに違いありません。そして、その理論を習得した人はクマさんと同じようなカットができることでしょう。できない場合は、それは器用さとかスキルの限界なのかもしれません、ごめんなさい。</p>
<h4>インプットを増やそう</h4>
<p>ステキな曲を作り人々を感動させるアノ人だって、もしかしたら楽譜を読めないかもしれない。YOUNG GUITAR の表紙を飾る彼なんて、もしかしたらタブ譜しか読めないかもしれない。でも理論を学べば、表現が広がり生み出す力がもっと豊かになるでしょう。例えベタにも程がありますが、自分の力だけで何もかもを生み出すことはできません。より良いより多くのアウトプットができるように、多くを学びたいですね。</p>
<p>もちろん、理論として完成されたものを学ぶだけでなく、普段から良いものに触れておくことも大切だと思います。元ネタのブログにある「様々なWebデザインを見て引き出しを増やしておく」ことがそれですね。誰かが体系的にまとめていなくても、私達の脳はインプットすればするほど、それらをゴニョゴニョして自分の創造力にしてくれます。そしてその創造力やアウトプットの「程度」が「センス」なのかな、と思います。</p>
<h4>分解能を上げよう</h4>
<p>例えば、この画像：</p>
<p><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/12/logos.jpg" alt="" title="logos" width="556" height="100" class="alignnone size-full wp-image-889" /></p>
<p>大差はないかもしれませんが、右側は色々やりすぎに感じます。いやぁ、そんなん好みちゃうのん？って話かもしれませんが、ここで言いたいのは「この左右の違いを認識していて自分で描くときにどの程度が最適かを繊細に調整できるかどうか」ということです。「文字の上側にドロップシャドウを入れて型押しの効果を出す」ときに右の画像しか出てこないと、まだまだインプットが足りないかもしれません。</p>
<p>そしてインプットは漫然と「すげーなー」とか「ステキだなー」と眺めるだけではなくて、サイズや濃淡、距離など何故良いと感じるのかを細かく認識するようにすると良いでしょう。この認識の分解能の高さを上げることが、自分のセンスを鍛え、結果としてアウトプットのクオリティの高さにつながるような気がします。<br />
この画像の差が「Web サイトの効果」にどれだけ影響するかは謎ですが、Web デザイナーと名乗るなら意識しておくと何かと良いかもしれませんね。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/sense-and-theory/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/sense-and-theory" />
	</item>
		<item>
		<title>WordPress のURLクエリストリングにカスタムフィールドを指定して絞り込み検索する</title>
		<link>http://wpxtreme.jp/search-with-custom-fields-in-url-query-parameters</link>
		<comments>http://wpxtreme.jp/search-with-custom-fields-in-url-query-parameters#comments</comments>
		<pubDate>Wed, 30 Nov 2011 04:48:42 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TIPS]]></category>
		<category><![CDATA[modifications]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=876</guid>
		<description><![CDATA[例として、スタッフ紹介ページに［部署］［性別］のカスタムフィールドがある場合、で話をしますね。<br />
<ul>
  <li>投稿タイプ：staff</li>
  <li>カスタムフィールド：division, gender</li>
</ul>
な感じの記事にカスタムフィールドの条件をつけて検索してみましょう。<a class="excerpt-more" href="http://wpxtreme.jp/search-with-custom-fields-in-url-query-parameters">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>PHP での絞り込みなら</h4>
<p>詳しくは <a href="http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters">Codex</a> を参照してくださいですが、<code>query_posts()</code> や <code>get_posts()</code> など、PHP コードでなら以下のように書けますね。</p>
<pre class="code"><code>query_posts( array(
    &#039;post_type&#039;  =&gt; &#039;staff&#039;,
    &#039;meta_key&#039;   =&gt; &#039;division&#039;,
    &#039;meta_value&#039; =&gt; &#039;sales&#039;,
    /* 他のパラメータは省略 */
) );</code></pre>


<p>メタクエリーを使えば、複数の条件を組み合わせることができます。</p>
<pre class="code"><code>query_posts( array(
    &#039;meta_query&#039; =&gt; array(
        array(
            &#039;key&#039;     =&gt; &#039;division&#039;,
            &#039;value&#039;   =&gt; &#039;sales&#039;,
        ),
        array(
            &#039;key&#039;     =&gt; &#039;gender&#039;,
            &#039;value&#039;   =&gt; &#039;male&#039;,
        ),
    ),
    /* 他のパラメータは省略 */
) );</code></pre>



<h4>簡単な方法</h4>
<p>同様に URL にクエリパラメータを付ければできそうな気がしますが、</p>
<pre class="code"><code>http://example.com/staff/?meta_key=division&amp;meta_value=sales</code></pre>


これは無視されます。URL に使用できるクエリ変数は <code>wp-includes/class-wp.php</code> の始めの方で <code>$public_query_vars</code> に指定されています。で、 これには <code>meta_key, meta_value</code> がありません。</p>
<p>ないなら、付け足せばいいじゃない的な解決方法が以下です。テーマフォルダの functions.php に書けば OK。</p>
<pre class="code"><code>add_filter( &#039;query_vars&#039;, &#039;my_query_vars&#039; );
function my_query_vars( $public_query_vars ) {
    return array_merge( $public_query_vars, array( &#039;meta_key&#039;, &#039;meta_value&#039; ) );
}</code></pre>


<p>これで、先ほどの <code>?meta_key=division&#038;meta_value=sales</code> が有効になります。ただし、複数の条件を指定することはできません。</p>

<h4>よりクールな方法</h4>
<p>いやでも URL に <code>meta_key</code> とか <code>meta_value</code> とかダサくないだろうか。えびちゃんドン引きしちゃうんじゃないだろうか。こんなことならカスタムフィールドじゃなくてカスタム分類（タクソノミー）で作っておけばよかった。カスタム分類なら、</p>
<pre class="code"><code>http://example.com/staff/?division=sales</code></pre>


<p>ってスマートに書けるのに。カスタム分類は敷居が高いからずっと避けていた。納期もアレだから安直にカスタムフィールドで済ませてしまっていた。いつまでもそうやって逃げてるの？そう言われて何も言い返せなかった。オレ、このままでいいんだろうか。。。</p>
<p>&nbsp;</p>
<p>と、お悩みのアナタに以下のコードを捧げます。テーマの functions.php に書きましょう◎</p>
<pre class="code"><code>global $my_public_query_vars;
$my_public_query_vars = array( &#039;division&#039;, &#039;gender&#039; );

add_filter( &#039;query_vars&#039;, &#039;my_query_vars&#039; );
function my_query_vars( $public_query_vars ) {
    global $my_public_query_vars;
    return array_merge( $public_query_vars, $my_public_query_vars );
}

add_action( &#039;pre_get_posts&#039;, &#039;my_pre_get_posts&#039; );
function my_pre_get_posts( $query ) {
 &nbsp; &nbsp;if ( ! is_admin() &amp;&amp; is_post_type_archive( &#039;staff&#039; ) /* &amp;&amp; &#039;staff&#039; == $query-&gt;get( &#039;post_type&#039; ) */ ) {
 &nbsp; &nbsp; &nbsp; &nbsp;$meta_query = array();
 &nbsp; &nbsp; &nbsp; &nbsp;
        global $my_public_query_vars;
 &nbsp; &nbsp; &nbsp; &nbsp;foreach ( $my_public_query_vars as $key ) {
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if ( $val = $query-&gt;get( $key ) ) {
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$meta_query[] = array(
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#039;key&#039; &nbsp; =&gt; $key,
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&#039;value&#039; =&gt; $val,
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;);
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}
 &nbsp; &nbsp; &nbsp; &nbsp;}
 &nbsp; &nbsp; &nbsp; &nbsp;
 &nbsp; &nbsp; &nbsp; &nbsp;if ( ! empty( $meta_query ) ) {
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$query-&gt;set( &#039;meta_query&#039;, $meta_query );
 &nbsp; &nbsp; &nbsp; &nbsp;}
 &nbsp; &nbsp;}
}</code></pre>


<p>もちろん、以下のような複数条件も指定できます。</p>
<pre class="code"><code>http://example.com/staff/?division=sales&amp;gender=male</code></pre>



<h4>おまけ：クエリ変数付きの URL を PHP で作る方法</h4>
<p>投稿タイプが staff で、部署が sales で性別が male な URL は</p>
<pre class="code"><code>add_query_arg( 
    array(
        &#039;division&#039; =&gt; &#039;sales&#039;,
        &#039;gender&#039;   =&gt; &#039;male&#039;,
    ),
    get_post_type_archive_link( &#039;staff&#039; )
);</code></pre>


<p>で作成できます。<code>add_query_arg()</code> って何やねん、と気になったコードジャンキーな方は <a href="http://phpxref.ftwr.co.uk/wordpress/nav.html?_functions/index.html">PHPXref 0.7: WordPress</a> でソース見てみてん◎</p>

<h4>CONCLUSION</h4>
<p>コンテンツ設計というかデータ設計というか、そういうものはしっかりキッチリ練っておきましょうね！</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.2.1</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/search-with-custom-fields-in-url-query-parameters/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/search-with-custom-fields-in-url-query-parameters" />
	</item>
		<item>
		<title>WordPress でカテゴリーAの記事をフィード配信するときにカテゴリBに属していたら除く</title>
		<link>http://wpxtreme.jp/feed-posts-in-category-a-and-not-in-category</link>
		<comments>http://wpxtreme.jp/feed-posts-in-category-a-and-not-in-category#comments</comments>
		<pubDate>Tue, 29 Nov 2011 08:40:00 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TIPS]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[modifications]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=857</guid>
		<description><![CDATA[はい、できます！ 言い換えると カテゴリーID：1に属する記事を配信、かつ カテゴリーID：2に属する記事は配信しない となりますので（例ね）、我らがクエリ改変の切り札 pre_get_posts アクションを使って、そ ...]]></description>
			<content:encoded><![CDATA[<div class="excerpt"><!-- tweet id : 141406950574407680 --><style type='text/css'>#bbpBox_141406950574407680 a { text-decoration:none; color:#FF3300; }#bbpBox_141406950574407680 a:hover { text-decoration:underline; }</style><div id='bbpBox_141406950574407680' class='bbpBox' style='padding:20px; margin:5px 0; background-color:#709397; background-image:url(http://a1.twimg.com/images/themes/theme6/bg.gif); background-repeat:no-repeat'><div style='background:#fff; padding:10px; margin:0; min-height:48px; color:#333333; -moz-border-radius:5px; -webkit-border-radius:5px;'><span style='width:100%; font-size:18px; line-height:22px;'>WP&#12391;&#12459;&#12486;&#12468;&#12522;A&#12398;RSS&#12434;&#37197;&#20449;&#12377;&#12427;&#38555;&#12395;&#12289;&#12459;&#12486;&#12468;&#12522;A&#12392;B&#12395;&#30331;&#37682;&#12375;&#12390;&#12427;&#12456;&#12531;&#12488;&#12522;&#12399;&#30465;&#12365;&#12383;&#12356;&#12435;&#12384;&#12369;&#12393;&#12289;&#12381;&#12422;&#12371;&#12392;&#12391;&#12365;&#12427;&#12398;&#12363;&#12375;&#12425;&#12290;</span><div class='bbp-actions' style='font-size:12px; width:100%; padding:5px 0; margin:0 0 10px 0; border-bottom:1px solid #e6e6e6;'><img align='middle' src='http://wpxtreme.jp/cms/wp-content/plugins/twitter-blackbird-pie//images/bird.png' /><a title='tweeted on 2011.11.29 3:43 pm' href='http://twitter.com/#!/take_it02/status/141406950574407680' target='_blank'>2011.11.29 3:43 pm</a> via <a href="http://www.tweenapp.org/" rel="nofollow" target="blank">Tween</a><a href='https://twitter.com/intent/tweet?in_reply_to=141406950574407680' class='bbp-action bbp-reply-action' title='Reply'><span><em style='margin-left: 1em;'></em><strong>Reply</strong></span></a><a href='https://twitter.com/intent/retweet?tweet_id=141406950574407680' class='bbp-action bbp-retweet-action' title='Retweet'><span><em style='margin-left: 1em;'></em><strong>Retweet</strong></span></a><a href='https://twitter.com/intent/favorite?tweet_id=141406950574407680' class='bbp-action bbp-favorite-action' title='Favorite'><span><em style='margin-left: 1em;'></em><strong>Favorite</strong></span></a></div><div style='float:left; padding:0; margin:0'><a href='http://twitter.com/intent/user?screen_name=take_it02'><img style='width:48px; height:48px; padding-right:7px; border:none; background:none; margin:0' src='http://a2.twimg.com/profile_images/1636771557/wptake20111110_normal.png' /></a></div><div style='float:left; padding:0; margin:0'><a style='font-weight:bold' href='http://twitter.com/intent/user?screen_name=take_it02'>@take_it02</a><div style='margin:0; padding-top:2px'>&#12383;&#12369;</div></div><div style='clear:both'></div></div></div><!-- end of tweet --></div>
<h4>はい、できます！</h4>
<p>言い換えると</p>
<ul>
  <li>カテゴリーID：1に属する記事を配信、かつ</li>
  <li>カテゴリーID：2に属する記事は配信しない</li>
</ul>
<p>となりますので（例ね）、我らがクエリ改変の切り札 <code>pre_get_posts</code> アクションを使って、そのままの処理を テーマフォルダの functions.php に記述します。</p>
<pre class="code"><code>add_action( &#039;pre_get_posts&#039;, &#039;my_pre_get_posts&#039; );
function my_pre_get_posts( $query ) {
    if ( is_feed() ) {    // フィードだったら
        $query-&gt;set( &#039;category__in&#039;    , 1 );  // カテゴリーID：1を含める      
        $query-&gt;set( &#039;category__not_in&#039;, 2 );  // カテゴリーID：2は含めない
    }
}</code></pre>


<p>動作テストする時はフィードの内容が即時反映されるように、記事を追加したり削除したりして WordPress に「ぁ、記事集め直さなかん」って思わせるようにしてね（はぁと </p>
<p class="append">もちろん、含める／含めないカテゴリーは以下のように複数指定できます。</p>
<pre class="code"><code>add_action( &#039;pre_get_posts&#039;, &#039;my_pre_get_posts&#039; );
function my_pre_get_posts( $query ) {
    if ( is_feed() ) {    // フィードだったら
        $query-&gt;set( &#039;category__in&#039;    , array( 1, 2, 3 ) );  // カテゴリーID：1, 2, 3 を含める      
        $query-&gt;set( &#039;category__not_in&#039;, array( 4, 5, 6 ) );  // カテゴリーID：4, 5, 6 は含めない
    }
}</code></pre>


<h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.1.3</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/feed-posts-in-category-a-and-not-in-category/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/feed-posts-in-category-a-and-not-in-category" />
	</item>
		<item>
		<title>WordPress でカスタムフィールドの日付から年別アーカイブリストを作成する</title>
		<link>http://wpxtreme.jp/yearly-archive-using-custom-field-in-wordpress</link>
		<comments>http://wpxtreme.jp/yearly-archive-using-custom-field-in-wordpress#comments</comments>
		<pubDate>Wed, 16 Nov 2011 05:33:28 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TIPS]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[archive]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[modifications]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=829</guid>
		<description><![CDATA[元ネタは WordPress 日本語公式フォーラムの「<a href="http://ja.forums.wordpress.org/topic/8389">カスタムフィールドの日付から年別アーカイブリストを作成</a>」です。このような、投稿の日付ではなくてカスタムフィールドに入力した日付でイベントカレンダー的なこととか、そらもう色んなことをひととおりしたい、というご要望は wpxtreme にもたくさん寄せられます。かなりの需要があると思われますので、自力で頑張りたい人のために一例としてやってみます。<a class="excerpt-more" href="http://wpxtreme.jp/yearly-archive-using-custom-field-in-wordpress">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>仕様</h4>
<ul>
  <li>カスタムフィールドに入力した日付を元に、年別アーカイブ一覧を出力したり年別アーカイブを表示したりする。</li>
  <li>カスタムフィールドの値の書式は 'yyyy年mm月dd日'。</li>
  <li>カスタムフィールドのキーは 英数字。</li>
</ul>
<h4>使い方</h4>
<p><a href="http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_get_archives">wp_get_archives()</a> とほぼ同じですが、パラメータがちょびっと違ってます。</p>
<h5>書式</h5>
<pre class="code"><code>&lt;?php 
my_get_year_archives( array(
	&#039;date_field&#039; =&gt; &#039;mydate&#039;,
) );
?&gt;</code></pre>


<h5>パラメータ</h5>
<ul>
  <li><strong>type</strong><br />このパラメータはありません。</li>
  <li><strong>datre_field</strong><br />（文字列）日付用のカスタムフィールドのキー。初期値は 'date'。</li>
</ul>
ちなみに <a href="http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_archives">get_archives()</a> は WordPress 2.1 でとっくに deprecated（非推奨）になってるので、<a href="http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_get_archives">wp_get_archives()</a> を使うようにしましょう！
<h4>コード</h4>
<p>以下をテーマの functions.php にペッとすれば OK◎ タブが激しいですけど、気にしないで。</p>
<pre class="code"><code>&lt;?php
function my_get_year_archives( $args = &#039;&#039; ) {
	global $wpdb, $wp_locale;

	$defaults = array(
		&#039;date_field&#039; =&gt; &#039;date&#039;,
		&#039;format&#039; =&gt; &#039;html&#039;,
		&#039;echo&#039; =&gt; true,
		&#039;limit&#039; =&gt; &#039;&#039;,
		&#039;before&#039; =&gt; &#039;&#039;,
		&#039;after&#039; =&gt; &#039;&#039;, 
		&#039;show_post_count&#039; =&gt; false,
	);

	$r = wp_parse_args( $args, $defaults );
	extract( $r, EXTR_SKIP );

	if ( &#039;&#039; != $limit ) {
		$limit = absint( $limit );
		$limit = &#039; LIMIT &#039;.$limit;
	}

	$field  = &#039;m.meta_value&#039;;
	$select = &quot;SELECT SUBSTRING($field,1,4) AS `year`, count(p.ID) AS posts&quot;;
	$where  = &quot;WHERE p.post_type = &#039;post&#039; AND p.post_status = &#039;publish&#039;&quot;;
	$where .= $wpdb-&gt;prepare( &#039; AND m.meta_key = %s&#039;, $date_field );
	$join   = &quot; INNER JOIN $wpdb-&gt;postmeta AS m ON m.post_id = p.ID&quot;;
	
	$where  = apply_filters( &#039;getarchives_where&#039;, $where, $r );
	$join   = apply_filters( &#039;getarchives_join&#039; , $join , $r );

	$output = &#039;&#039;;
	$query = &quot;$select FROM $wpdb-&gt;posts AS p $join $where GROUP BY SUBSTRING($field,1,4) ORDER BY $field DESC $limit&quot;;
	$key = md5( $query );
	$cache = wp_cache_get( &#039;my_get_year_archives&#039; , &#039;general&#039; );
	if ( !isset( $cache[ $key ] ) ) {
		$arcresults = $wpdb-&gt;get_results( $query );
		$cache[ $key ] = $arcresults;
		wp_cache_set( &#039;my_get_year_archives&#039;, $cache, &#039;general&#039; );
	} else {
		$arcresults = $cache[ $key ];
	}

	if ( $arcresults ) {
		$afterafter = $after;
		foreach ( (array) $arcresults as $arcresult ) {
			$url = add_query_arg( array( &#039;meta_key&#039; =&gt; $date_field ), get_year_link( $arcresult-&gt;year ) );
			$text = sprintf( &#039;%d&#039;, $arcresult-&gt;year );
			if ($show_post_count)
				$after = &#039;&amp;nbsp;(&#039;.$arcresult-&gt;posts.&#039;)&#039; . $afterafter;
			$output .= get_archives_link( $url, $text, $format, $before, $after );
		}
	}
		
	if ( $echo )
		echo $output;
	else
		return $output;
}

add_action( &#039;init&#039;, &#039;my_init&#039; );
function my_init() {
	global $wp;
	$wp-&gt;add_query_var( &#039;meta_key&#039; );
}

add_action( &#039;pre_get_posts&#039;, &#039;my_pre_get_posts&#039; );
function my_pre_get_posts( $query ) {
	if ( $query-&gt;is_year ) {
		$meta_query = array(
			array( 
				&#039;key&#039;     =&gt; $query-&gt;get( &#039;meta_key&#039; ),
				&#039;value&#039;   =&gt; $query-&gt;get( &#039;year&#039;     ),
				&#039;compare&#039; =&gt; &#039;LIKE&#039;
			),
		);
				
		$query-&gt;set( &#039;meta_query&#039; , $meta_query );
		$query-&gt;set( &#039;year&#039;       , &#039;&#039;          );
		$query-&gt;set( &#039;date&#039;       , &#039;&#039;          );
		$query-&gt;set( &#039;meta_key&#039;   , &#039;&#039;          );
	}
} 
?&gt;</code></pre>


<h4>ポイント</h4>
<p><strong>my_get_year_archives()</strong></p>
<ul>
  <li>指定されたカスタムフィールドの始めの4文字を「年」として、その年に記事が何件あるかを取得します。</li>
  <li>年アーカイブのリンクに日付用のカスタムフィールドのキーをクエリ変数としてくっつけます。</li>
</ul>
<p><strong>my_init()</strong></p>
<ul>
  <li>パブリックなクエリ変数に <code>meta_key</code> を追加します。<br />これをしとくと URL の後ろに '?meta_key=なんちゃら' の書式でお好みのクエリ変数が使えるようになります。パブリックなクエリ変数には元々どんなものがあるかは wp-includes/class-wp.php の始めの方にある <code>$public_query_vars</code> を見るといいですよ。</li>
</ul>
<p><strong>my_pre_get_posts()</strong><br />※WordPress は URL を元にどういう風に記事を取得するか判断します。<code>pre_get_posts</code> アクションではこの「どういう風に」の部分をコッソリ改変することができます。</p>
<ul>
  <li>年別アーカイブなら、<code>meta_key</code> で指定されたカスタムフィールドの値で該当する記事が取得されるように <code>meta_query</code> を仕込みます。</li>
</ul>
<h4>CONCLUSION</h4>
<p>フォーラムのご質問の仕様ビッチビチに作ってますので「私のやりたいことと微妙に違うの。」というえびちゃんは、このエントリーを参考に自分で何とかしてみてください。</p>
<p>でも、もしあなたが何日も解決できなくて泣きそうになったり、そんなんハナから自分でやるツモリのないえびちゃんだったりしたときは、wpxtreme までお気軽に <a href="http://wpxtreme.jp/contact">お問い合わせ</a> ください。</p>
<p>wpxtreme では、カスタマイズ1案件につき基本 10,500円（税込）にて承っております。数時間後〜どんなに重いカスタマイズでも翌日には納品いたしますよ。これまでたくさんの方々にお喜びいただいております。</p>
<p>さぁ！次はあなたの番です。きっと、圧倒的なスピードとクオリティで異次元のコストパフォーマンスを体験していただけることでしょう。</p>
<p>以上、あからさまな PR でした。</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.1.3</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/yearly-archive-using-custom-field-in-wordpress/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/yearly-archive-using-custom-field-in-wordpress" />
	</item>
		<item>
		<title>Versions のライセンス登録時に &#8220;Connection error.  Please try again later.&#8221; となる場合の解決方法</title>
		<link>http://wpxtreme.jp/versions-how-to-solve-the-registration-probrem</link>
		<comments>http://wpxtreme.jp/versions-how-to-solve-the-registration-probrem#comments</comments>
		<pubDate>Mon, 31 Oct 2011 12:30:40 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TROUBLESHOOTING]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Versions]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=737</guid>
		<description><![CDATA[Mac 用のGUIベース Subversion クライアントといえば <a href="http://www.versionsapp.com/">Versions</a>, <a href="http://www.zennaware.com/cornerstone/">Cornerstone</a> が2強ですが、Web デザイナー的にはサイトデザインも各所で紹介されていた Versions の方に惹かれます。<br />
で、お試しで使っていた Versions デモ版が先日期限切れになったのでライセンスを購入しました。が、登録しようとすると "Connection error" とか言いやがって全然使えない。<br />
WordPress の簡単インストールに飼い慣らされた身にはキツイなコレ。こんなツライ思いをするのはもうボクで最後にしたい。というわけで、ググれどググれど解決方法が見当たらなかった腹いせにボクの辿った軌跡をココにシルしておきます。<a class="excerpt-more" href="http://wpxtreme.jp/versions-how-to-solve-the-registration-probrem">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>ライセンス買ったのに登録できない</h4>
<p>んもぅ！何度も何度も出てきやがってこいつめ！今ちょっと混んでるけどしばらくすれば登録できるから！感出しやがってからに！登録できる気配がまるでないので、もしかしてこういう詐欺商法かな、と思ってしまいました。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103107.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103107.jpg" alt="Versions: Connection error. Please try again later" title="11103107" width="336" height="259" class="alignnone size-full wp-image-812" /></a>今回気づいたんですけど、Mac の場合、インストールとかがスンナリいかないと当該のアプリケーションに ウラアァァァァァアア！と呪いをかけてます。でも、Windows を使ってた頃は OS にオマエのせいじゃアァァッァア！と呪いをかけてましたね。。。</p>
<h4>ググる</h4>
<p>なんか問題があった場合は、まずググりましょう！ググれカス！ってどっかのオッサンも言ってましたし！Versions には <a href="http://groups.google.com/group/versions">Google グループ</a> があるのでソコが検索でひっかかります。言い換えると他には情報がありません。で、ソコでさらに検索すると<a href="http://groups.google.com/group/versions/search?group=versions&#038;q=register&#038;qt_g=%E3%81%93%E3%81%AE%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E6%A4%9C%E7%B4%A2">ひどい状況</a> を目の当たりにできます。おぉぉ、もしかしてオレ $39 捨ててしもたんか。。。残念ながら、ググっても解決できませんでした。カスって言う人がカスなんだとボクは思います。</p>
<p><a href="http://twitter.com/#!/versionsapp">@versionapp</a> でも登録できない件についてちょいちょい問い合わせられてますね。毎度「とりあえずメールして！」って返信してはるけど解決してるんやろか。</p>
<h4>サポートに問い合わせる</h4>
<p>てか購入した製品で問題があったなら、まずサポートに問い合わせればいいじゃない！なんで知恵袋で訊いたりするわけ？知恵袋ってアレよね、なんか SNS 的使い方されてるのね。公開 DM みたいなんとか。ほぇーって感じ。恋愛カテとか業者の自演か全力中高生ばかりでとても癒されるし。ほぇー。<br />
それはともかく「サポートのレスポンス悪いんじゃ！」みたいなのをさっきいっぱい目にした気がしますが <a href="http://www.versionsapp.com/support">Versions サポートページ</a> の［Email］でイヤミちっくに［Inquiry Type］を "Bug Report" にしたら「登録できんよー」の旨を伝えましょう。</p>
<p>で、帰ってきたお返事をまとめると：</p>
<ul>
  <li>ファイアウォール、プロキシ、Little Snitch の類いをツコてたらそらアカンで！</li>
  <li>もしかすると SSL証明書かもわからんね</li>
</ul>
<p>だそうです。［システム環境設定｜セキュリティ｜FileVault］が「入」になっててもアカンらしいですよ。ウチの場合はファイアウォールとかの問題ではないので、 SSL証明書をやっつけてみます。</p>
<h4>証明書を受け入れさせる</h4>
<p>サポートからのお返事によれば「認証局のルート証明書をキーチェーンに追加して信頼設定するといいよ！」とのことですのでメンドくさいですがやってみましょう。</p>
<ol>
  <li><a href="https://register.madebysofa.com/versions/buy">https://register.madebysofa.com/versions/buy</a> にアクセス！<br />（以下 Safari でご説明します）</li>
  <li>証明書が怪しい旨をお知らせされますので［証明書を表示］ボタンをクリック後、証明書アイコンをデスクトップにドラッグ＆ドロップして証明書ファイルをゲットしましょう。<br /><a href="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103101.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103101-620x378.jpg" alt="" title="11103101" width="620" height="378" class="alignnone size-large wp-image-777" /></a></li>
  <li>そのファイル "register.madebysofa.com.cer" をダブルクリックすると「証明書の追加」ダイアログが表示されます。［キーチェーン］を「システムルート」にして（「ログイン」のママでも良いよ）［OK］ボタンをクリックします。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103102.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103102-620x308.jpg" alt="" title="11103102" width="620" height="308" class="alignnone size-large wp-image-758" /></a></li>
  <li>パスワードを求められる場合は、素直に応じます。今はまだ、そのときではありませんから。これでキーチェーンに追加されましたが、まだ信頼はされていません。これはきっと日頃の行いのせいでしょうね。。。<br /><a href="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103103.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103103-620x297.jpg" alt="" title="11103103" width="620" height="297" class="alignnone size-large wp-image-761" /></a></li>
  <li>証明書を選択して［キーチェーンアクセス｜ファイル｜情報を見る］をクリックします。表示されたダイアログの［信頼］をクリックして［この証明書を使用するとき：］を「常に信頼する」にします。これこそが本当の愛です。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103104.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103104-620x431.jpg" alt="" title="11103104" width="620" height="431" class="alignnone size-large wp-image-779" /></a>
※モザイクでヒミツっぽくしてみました。</li>
  <li>以上で、めでたく信頼されていることになりました。あれ、何だか偽りの愛みたいですね。<br /><a href="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103105.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103105-620x403.jpg" alt="" title="11103105" width="620" height="403" class="alignnone size-large wp-image-765" /></a></li>
<h4>登録してみよう</h4>
<p>おー！登録できた！！WordPress Rocks&hearts; とかなんとか言っとる！やっほー！！！<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103106.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2011/10/11103106.jpg" alt="Register Versions: Thanks for registering. You ROCK!" title="11103106" width="336" height="259" class="alignnone size-full wp-image-786" /></a></p>
<h4>CONCLUSION</h4>
<ul>
  <li>後でやってもダメなのに "Please try again later." とか表示しない。</li>
  <li>メンドくさいことになるくらいなら、オンライン登録とか小難しいことに挑戦しない。</li>
  <li>メールでチマチマ対応してないで FAQ で詳細に説明しとこう。</li>
</ul>
<p>ちなみにこの Versions を開発したのはミニマルだかシンプルだかのネタでよく紹介されていた <a href="http://www.madebysofa.com/archive/">We are Sofa</a> の皆さんですが、目立ったせいで Facebook に取り込まれてしまい <a href="http://www.madebysofa.com/">WE WERE SOFA</a> になってしまいました。翔丸組に入るんだ、的なアレですね。Facebook はヤワじゃねぇ。<h5>動作確認バージョン</h5><ul class="tested-vers"><li>Versions 1.1.8</li><li>Mac OSX 10.5.8</li><li>Safari 5.0.6</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/versions-how-to-solve-the-registration-probrem/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/versions-how-to-solve-the-registration-probrem" />
	</item>
		<item>
		<title>WordPress で Ajax：コメント取得編</title>
		<link>http://wpxtreme.jp/get-comments-by-ajax-in-wordpress</link>
		<comments>http://wpxtreme.jp/get-comments-by-ajax-in-wordpress#comments</comments>
		<pubDate>Wed, 26 Oct 2011 08:02:31 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TUTORIALS]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[comment]]></category>
		<category><![CDATA[modifications]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=669</guid>
		<description><![CDATA[元ネタはお馴染み <a href="http://ja.forums.wordpress.org/">WordPress フォーラム</a> から「<a href="http://ja.forums.wordpress.org/topic/8202">コメントの表示スクリプト</a>」です。コメントを新着順に数件表示しておいて、全部読みたい方には［全部読む］ボタンをクリックしてもらおうという作戦です。wpxtreme 的にはページネーションとかチラ見せはメンドくさいので全部見せといたらええやん！と思いますが、こういった需要は多いハズなのでやってみます。記事書きながらのカスタマイズです、できるかな。<a class="excerpt-more" href="http://wpxtreme.jp/get-comments-by-ajax-in-wordpress">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<div class="append"><p>ご要望により、コメントの表示形式を以下の 3タイプご用意いたしました。</p>
<ol>
  <li>コメント全部表示</li>
  <li>始めから指定件数分表示</li>
  <li>2. の残りを表示</li>
</ol>
</div>

<h4>コメント表示の仕組みは TwentyEleven に倣います</h4>
<ol>
  <li>single.php に<br />
    <pre><code>&lt;?php comments_template( '', true ); ?&gt;</code></pre>
    と書く。
  </li>
  <li>テーマに comments.php を用意しておく。</li>
  <li>comments.php 内に<br />
    <pre><code>wp_list_comments( array( 'callback' =&gt; 'twentyeleven_comment' ) );</code></pre>
    のように書いて、各コメントの表示はコールバック関数にお任せする。このコールバックは皆様オリジナルのものでも良いです。<a href="http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/wp_list_comments">Codex</a> には非推奨って書いてあって何かコワいですけど <a href="http://codex.wordpress.org/Template_Tags/wp_list_comments">本家 Codex</a> では Use with caution なので、コールバックの意味をわかってて使うなら何も問題ないです。っていうか知らんでも問題ないよ大丈夫◎
  </li>
</ol>
<p>これ、基本形ね。</p>
<h4>コメントの表示をコントロールするには</h4>
<p>始めに5件だけ表示しておくなら［管理画面｜設定｜ディスカッション］で</p>
<pre><code>1ページあたり［5］件のコメントを含む複数ページに分割し、［最後］のページをデフォルトで表示する </code></pre>
<p>にしとけば OK ◎ ついでに、新しいコメントから表示しないと変なので</p>
<pre><code>［新しい］コメントを各ページのトップに表示する</code></pre>にしましょう。って、これだと全然 OK じゃないぞ。</p>
<p>フォーラムでもコメントされているように</p>
<pre><code>6件コメントがあると、最初の表示で1件、次のページで5件とかっこ悪い表示になってしまう</code></pre>
<p>ので何とかします。</p>
<p>コメントの表示に使ってる <code>wp_list_comments()</code> ですが、実はこの wp_list_なんちゃら の一覧表示系関数には独自の Walker を指定することができます。Walker っていうのは一覧する項目をひとつづつテクテク辿って表示してくれるかわいいヤツです。コメントの場合は Walker_Comment クラス（wp-includes/comment-template.php）がソレですね。これを拡張してオリジナルの Walker をババーッと作ってしまえば、フィルターでチマチマ表示をカスタマイズする必要も無くなります。</p>
<h4>オレ様 Walker を作ろう</h4>
<p>何でもそうですけど、モノを作るときは使う側の立場で作りましょう。作る側の都合で作るとロクなものはできません。ということで、オレ様 Walker を使う場合に</p>
<pre><code>wp_list_comments( array( 
  'callback' =&gt; 'twentyeleven_comment',
  'walker' =&gt; new My_Walker_Comment,  // これがオレ様 Walker
  'display' =&gt; 'initial',  // 未指定か initial で始めから指定件数分、rest で残り全部、all で始めから全部を表示します
) );</code></pre>
<p>みたいに書きさえすれば、後は良きにはからってくれるよう頑張って作ります。始めの5件とか表示のときは display パラメータ無しか 'initial' 指定で OK。残り全部のコメントを表示するときに display パラメータを 'rest' にします。</p>
<div class="append">
<p>カテゴリーによってコメントを全表示にしたり、チラ見せしたりを切り替えるなら以下のようにします。</p>
<pre><code>wp_list_comments( array( 
  'callback' =&gt; 'twentyeleven_comment',
  'walker' =&gt; new My_Walker_Comment,  // これがオレ様 Walker
  'display' =&gt; in_category( 全表示したいカテゴリの ID, スラッグ, 名前等 ) ? 'all' : 'initial', 
) );</code></pre>
</div>

<p>てことでオレ様 Walker ができましたのでテーマの funcrions.php に以下をペッとしてください。長いけど、オリジナルの paged_walk() をちょこっとイジッただけです。</p>
<pre><code>&lt;?php
class My_Walker_Comment extends Walker_Comment {
  function paged_walk( $elements, $max_depth, $page_num, $per_page ) {
    /* sanity check */
    if ( empty($elements) || $max_depth &lt; -1 )
      return '';

    $args = array_slice( func_get_args(), 4 );
    $output = '';

    $id_field = $this-&gt;db_fields['id'];
    $parent_field = $this-&gt;db_fields['parent'];

    if ( !empty($args[0]['reverse_top_level']) )
      $elements = array_reverse( $elements );

    $per_page = (int)$per_page;
    if ( 0 == $per_page )
      $per_page = get_option( 'comments_per_page' );
    $count = -1;
    $total_top = count( $elements );
    $paging = $total_top &gt; $per_page;
		
　  $display = 'initial';
      if ( ! empty( $args[0]['display'] ) )
        $display = $args[0]['display'];
			
      switch ( $display ) {
        case 'initial':
          $start = 0;
          $end   = $per_page;
          break;
        case 'rest':
          $start = $paging ? $per_page : $total_top;
          $end   = $total_top;
          break;
        default: // 'all'
          $start = 0;
          $end   = $total_top;
	  break;
    }

    // flat display
    if ( -1 == $max_depth ) {
      $this-&gt;max_pages = $paging ? 2 : 1;
      $empty_array = array();
      foreach ( $elements as $e ) {
        $count++;
        if ( $count &lt; $start )
          continue;
        if ( $count &gt;= $end )
          break;
        $this-&gt;display_element( $e, $empty_array, 1, 0, $args, $output );
      }
      return $output;
    }
      
    $top_level_elements = array();
    $children_elements  = array();
    foreach ( $elements as $e) {
      if ( 0 == $e-&gt;$parent_field )
        $top_level_elements[] = $e;
      else
        $children_elements[ $e-&gt;$parent_field ][] = $e;
    }

    $total_top = count( $top_level_elements );
    $paging = $total_top > $per_page;
    $this-&gt;max_pages = $paging ? 2 : 1;
		
      switch ( $display ) {
        case 'initial':
          $start = 0;
          $end   = $per_page;
          break;
        case 'rest':
          $start = $paging ? $per_page : $total_top;
          $end   = $total_top;
          break;
        default: // 'all'
          $start = 0;
          $end   = $total_top;
	  break;
    }

    if ( !empty($args[0]['reverse_children']) ) {
      foreach ( $children_elements as $parent =&gt; $children )
        $children_elements[$parent] = array_reverse( $children );
    }

    foreach ( $top_level_elements as $e ) {
      $count++;

      if ( $end &gt;= $total_top &#038;& $count &lt; $start )
        $this-&gt;unset_children( $e, $children_elements );

      if ( $count &lt; $start )
        continue;

      if ( $count &gt;= $end )
        break;

      $this-&gt;display_element( $e, $children_elements, $max_depth, 0, $args, $output );
    }

    if ( $end &gt;= $total_top &#038;& count( $children_elements ) &gt; 0 ) {
      $empty_array = array();
      foreach ( $children_elements as $orphans )
        foreach( $orphans as $op )
          $this->display_element( $op, $empty_array, 1, 0, $args, $output );
    }

    return $output;
  }
}?&gt;</code></pre>
<p>なお、パーマリンクでのコメントページ指定 /comment-page-1/ とかは一切無視しています。</p>
<h4>［すべてのコメントを表示］ボタンを作る</h4>
<p>comments.php で display パラメータ無しか 'initial' の <code>wp_list_comments()</code> を書いた下辺りに以下のコードを書きます。</p>
<p class="append">カテゴリーによってコメントを全表示にしたりする場合は、始めの if 文に条件を追加します。</p>
<pre><code>&lt;?php if ( get_comment_pages_count() &gt; 1 ) : ?&gt;
&lt;?php 
/* カテゴリーによって全表示とかする場合は、こっちの書き方で！
if ( get_comment_pages_count() &gt; 1 &amp;&amp; ! in_category( 全表示するカテゴリの ID, スラッグ, 名前等 ) ) : 
*/
?&gt;
&lt;div id="get-rest-of-comments"&gt;&lt;a href="#"&gt;すべてのコメントを表示&lt;/a&gt;&lt;/div&gt;
&lt;script type='text/javascript'&gt;
//&lt;![CDATA[ 
jQuery(document).ready( function($) {
  $('#get-rest-of-comments a').click( function() {
    $(this).replaceWith('&lt;span class="loading"&gt;Loading...&lt;/span&gt;');
	
    $.post( '&lt;?php echo site_url(); ?&gt;', {
        get_rest_of_comments: 1,
        post_id: &lt;?php echo get_the_ID(); ?&gt;
      }, function(data) {
        $('#get-rest-of-comments').remove();
        $('#comments .commentlist').append(data); // 各コメントの li 要素の親まで辿って append してね！
      }
    );
	
    return false;
  });
});
//]]&gt;
&lt;/script&gt;
&lt;?php endif; ?&gt;
</code></pre>
<p>簡単に説明すると、</p>
<ol>
  <li>表示し切れてないコメントの残りがあるなら、</li>
  <li>［すべてのコメントを表示］リンクを表示して、</li>
  <li>ソレがクリックされたら、</li>
  <li>リンクを「Loading...」に変更して、</li>
  <li>get_rest_of_comments という合い言葉と記事 ID をパラメータにして Ajax !</li>
  <li>残りのコメントを取得したら余計なものは削除して、</li>
  <li>コメントの最後に追加します。</li>
  <li>あぁっ！このクリックは無かったことにしといてね！</li>
</ol>
<p>てな感じです。</p>
<h4>Ajax で残りのコメント全部を取得する</h4>
<p>テーマの functions.php に以下をペッとします。</p>
<pre><code>&lt;?php
add_action( 'init', 'my_ajax' );
function my_ajax() {
  if ( ! isset( $_POST['get_rest_of_comments'] ) )
    return;

  if ( 'XMLHttpRequest' == $_SERVER['HTTP_X_REQUESTED_WITH'] ) {
    @header('Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );

    $post_id = (int) $_POST['post_id'];
		
    $GLOBALS['post'] = get_post( $post_id );
		
    $comments = get_comments( array(
      'post_id' =&gt; $post_id, 
      'status' =&gt; 'approve', 
      'order' =&gt; 'ASC',
    ) );
    
    wp_list_comments( array( 
      'callback' =&gt; 'twentyeleven_comment',
      'walker' =&gt; new My_Walker_Comment,
      'display' =&gt; 'rest',
      ), $comments );
  }
	
  exit();
}
?&gt;</code></pre>
<p>管理画面じゃない（通常の公開画面？）からの Ajax は <code>init</code> アクションで処理しましょう。</p>
<p>簡単に説明すると、</p>
<ol>
  <li>get_rest_of_comments の合い言葉が POST されてないなら無視！</li>
  <li>Ajax だったら処理します。</li>
  <li>POST された記事 ID でもって、</li>
  <li>現在の post を設定しておいて、</li>
  <li>その記事のコメントを取得する。</li>
  <li>残りのコメントを表示します。</li>
  <li>さいなら！</li>
</ol>
<p>てな感じです。<code>wp_list_comments()</code> で表示しちゃってる内容が、先ほどの Ajax な POST</p>
<pre><code>$.post( url, parameters, function(data) {} )</code></pre>
<p>の結果として data に入ってきます。</p>
<h4>CONCLUSION</h4>
<ul>
  <li>一覧表示系関数の出力をイジるなら、オリジナルの Walker を作るのがイマどき。</li>
  <li>公開画面側の Ajax 処理の POST 先 URL はサイトの URL でいいよ。</li>
  <li>公開画面側の Ajax 処理は init アクションでやってしまおう。</li>
  <li>公開画面側の Ajax 処理には「何の処理をするか」の合い言葉を POST してあげよう。</li>
  <li>コメントは始めから全部表示しといたらいいと思うよ。</li>
</ul><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.1.3</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/get-comments-by-ajax-in-wordpress/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/get-comments-by-ajax-in-wordpress" />
	</item>
		<item>
		<title>WordPressテーマのfunctions.phpをクラス化する</title>
		<link>http://wpxtreme.jp/use-class-in-wordpress-theme</link>
		<comments>http://wpxtreme.jp/use-class-in-wordpress-theme#comments</comments>
		<pubDate>Mon, 01 Aug 2011 10:14:02 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TUTORIALS]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[theme]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=630</guid>
		<description><![CDATA[プラグインを作成するとき、まるっとクラス化することで 関数名のコンフリクトの心配やら、ちまちまプレフィックスをつける面倒から解放されます。じゃぁテーマの functions.php でも同じことができるんではないか 。子テーマとか考えると function_exists() での判定やら、親テーマと同じプレフィックス付きの長い関数名やら、なんちゅう読み難いんじゃー、といった諸々から解放されてもっと幸せになれるんではないか。そんな思いからテーマ（のfunctions.php）をクラス化する方法を考えてみました。何十個も twentyeleven_ とか書くのシンドイ。<a class="excerpt-more" href="http://wpxtreme.jp/use-class-in-wordpress-theme">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>#prefix ってプリフィクスじゃないのね。。。</p>
<h4>親テーマ</h4>
<p>Web 制作会社なら（そうでなくても）自社ルールに則って構築されたテーマのひな形が存在すると思います。無い場合は、この際だから作ってしまいましょう！いつまでもまんま TwentyTen でいいハズないじゃない。そういうテーマを自社の親テーマにして、各々のクライアントにフィットさせた子テーマを納品するようにすると制作効率が向上したりテーマ管理がし易くなったり彼女ができたりと色々ステキです。<br />
そんなわけで、以下 テーマ（の functions.php）をクラス化して子テーマも使う場合の最少コード例です。</p>
<h5>親テーマの style.css</h5>
<p>正規の親テーマの書き方と同じです。</p>
<pre><code>/*
Theme Name: Wpxtreme Parent
Theme URI: http://wpxtreme.jp/
Author: kz
Author URI: http://kzxtreme.com/
Description: 当社の親テーマであります
Version: 1.0
*/
/* スタイルの記述は省略 */</code></pre>
<h5>親テーマの functions.php</h5>
<p>ポイントは、<code>after_setup_theme</code> アクションの優先度です。functions.php は 子テーマ ---> 親テーマ の順に読み込まれますが、アクションの優先度により 親テーマのクラス定義 ---> 子テーマのクラス定義 の順に実行されるように指定します。で、最後に現在のテーマのクラスのオブジェクトを作って完了です。ののの気になる。<br />
PHP 的なポイントは <code>new static()</code> 辺り。この、親クラスに書いてるけど「子クラスの」という扱いができる late bind は PHP 5.3.0〜使えます。</p>
<pre><code>&lt;?php
// テーマオブジェクトをグローバル変数にします。
// the_theme なんて危険な名前は避けるといいかもね！
add_action( 'after_setup_theme', 'instantiate_theme', 99999 );
function instantiate_theme() {
  $GLOBALS['the_theme'] = call_user_func( array( str_replace( ' ', '_', get_current_theme() ), 'get_object' ) );
}

// 親テーマは最優先でアクション実行！
add_action( 'after_setup_theme', 'setup_parent_theme', 0 );
function setup_parent_theme() {
  if ( ! class_exists( 'Wpxtreme_Parent' ) ) { // テーマ名のスペースを '_' で置換してクラス名にしましょう！

    class Wpxtreme_Parent {
      static private   $classobj = NULL;

      public function __construct() {
        // construct self
        // add_theme_support(), add_filter(), add_action() などなど
      }

      public static function get_object() {
        if ( NULL === self :: $classobj ) {
          self :: $classobj = new static();
        }
        return self :: $classobj;
      }
    }
  }
}</code></pre>
<h5>子テーマの style.css</h5>
<p>これも正規の子テーマの書き方と同じです。</p>
<pre><code>/*
Theme Name: Wpxtreme Child
Theme URI: http://wpxtreme.jp/
Author: kz
Author URI: http://kzxtreme.com/
Description: クライアントA様向けテーマです！
Version: 1.0
Template: wpxtremeparent
*/
@import url("../wpxtremeparent/style.css");
/* スタイルの記述は省略 */</pre></code>
<h5>子テーマの functions.php</h5>
<pre><code>&lt;?php
// 親テーマより後にアクション実行！
add_action( 'after_setup_theme', 'setup_child_theme',1 );
function setup_child_theme() {
  if ( ! class_exists( 'Wpxtreme_Child' ) ) {
	
    class Wpxtreme_Child extends Wpxtreme_Parent {
      public function __construct() {
	// construct parent
	parent :: __construct();

        // construct self
        // add_theme_support(), add_filter(), add_action() などなど
      }
    }
  }
}</code></pre>
<p>これだけで OK です。楽チン！ってこれだけじゃ何だかよくわかりませんネ。</p>
<h4>もうちょっと具体的に</h4>
<p>サンプル的にそれらしい処理を書いてみますね。※コードはクラスの定義部分だけです。</p>
<h5>親テーマの functions.php</h5>
<pre><code>class Wpxtreme_Parent {
  static private   $classobj = NULL;
  static protected $domain;  // text domain
  static protected $userdata;  // 'name' =&gt; array( 'label' =&gt; 'label to display', 'type' =&gt; 'text'|'textarea'|..., 'description' =&gt; 'description.' )
  static public $path;  // stylesheet directory uri
  /**
   * Constructor, init on defined hooks of WP and include second class
   *
   * @access public
   * @since 0.0.1
   * @uses add_filter, add_action
   * @return void
   */
  public function __construct() {
    // member variables
    self :: $domain = strtolower( str_replace( '_', '', get_class( $this ) ) );
    self :: $path = get_stylesheet_directory_uri();
	
    load_theme_textdomain( self :: $domain, TEMPLATEPATH . '/languages' );
    
    // supports
    add_editor_style();
    add_theme_support( 'post-thumbnails' );

    // user profile
    add_filter( 'user_contactmethods', array( $this, 'user_contactmethods' ) );
    if ( isset( self :: $userdata ) ) {
      add_action( 'personal_options_update', array( $this, 'update_profile' ) );
      add_action( 'edit_user_profile_update', array( $this, 'update_profile' ) );
      add_action( 'show_user_profile', array( $this, 'user_profile' ) );
      add_action( 'edit_user_profile', array( $this, 'user_profile' ) );
    }
  }
  /**
   * Handler for the action 'init'. Instantiates this class.
   *
   * @access public
   * @since 0.0.1
   * @return object $classobj
   */
  public static function get_object() {
    if ( NULL === self :: $classobj ) {
      self :: $classobj = new static();
    }
    return self :: $classobj;
  }
  /**
   * Delete obsolete contact methods.
   *
   * @access public
   * @since 0.0.1
   * @return array $contactmethods
   */
  public function user_contactmethods( $contactmethods ) {
    unset( $contactmethods['aim'] );
    unset( $contactmethods['jabber'] );
    unset( $contactmethods['yim'] ); 
    return $contactmethods;
  }
  /**
   * Update user meta.
   *
   * @access public
   * @since 0.0.1
   * @return void
   */
  public function update_profile( $user_id ) {
    if ( !current_user_can( 'edit_user', $user_id ) )
      return false;

    foreach ( array_keys( (array) self :: $userdata ) as $field )
      update_user_meta( $user_id, $field, $_POST[$field] );
  }
  /**
   * Print form for user profile.
   *
   * @access public
   * @since 0.0.1
   * @return void
   */
  public function user_profile( $user ) {
    if ( !current_user_can( 'edit_user', $user-&gt;ID ) )
      return false;

?&gt;&lt;table class="form-table"&gt;&lt;?php			
    foreach ( (array) self :: $userdata as $name =&gt; $data )
      printf( '&lt;tr&gt;&lt;th&gt;&lt;label for="%1$s"&gt;%2$s&lt;/label&gt;&lt;/th&gt;'
        . '&lt;td&gt;&lt;input type="%3$s" name="%1$s" id="%1$s" value="%4$s" class="regular-text" /&gt;'
        . '&lt;br /&gt;&lt;span class="description"&gt;%5$s&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;',
      esc_attr( $name ),
      esc_html( isset( $data['label'] ) ? $data['label'] : $name  ),
      esc_attr( isset( $data['type' ] ) ? $data['type' ] : 'text' ),
      esc_attr( get_user_meta( $user-&gt;ID, $name, true ) ),
      esc_html( isset( $data['description' ] ) ? $data['description' ] : '' )
    );
?&gt;&lt;/table&gt;&lt;?php
  }
  /**
   * Prints HTML with meta information for the current post-date/time.
   *
   * @access public
   * @since 0.0.1
   * @return void
   */
  public function posted_on() {
    printf( __( '&lt;time class="entry-date" datetime="%1$s" pubdate&gt;%2$s&lt;/time&gt;', self :: $domain ),
      esc_attr( get_the_time() ),
      esc_html( get_the_date() )
    );
  }
}</code></pre>
<h5>子テーマの functions.php</h5>
<pre><code>class Wpxtreme_Child extends Wpxtreme_Parent {
  /**
   * Constructor, init on defined hooks of WP and include second class
   *
   * @access public
   * @since 0.0.1
   * @uses add_filter, add_action
   * @return void
   */
  public function __construct() {
    // set protected variables
    self :: $userdata = array(
      'yakusyoku' =&gt; array( 'label' =&gt; '役職', 'type' =&gt; 'text', 'description' =&gt; '社長、平社員、などを書いて！' ),
    );

    // construct parent
    parent :: __construct();

    // construct $this
  }
  /**
   * Add contact methods.
   *
   * @access public
   * @since 0.0.1
   * @return array $contactmethods
   */
  public function user_contactmethods( $contactmethods ) {
    $contactmethods = parent :: user_contactmethods( $contactmethods ); 
    $contactmethods['skype'] = 'Skype 名';
    $contactmethods['twitter'] = 'Twitter ユーザー名';
    $contactmethods['facebook'] = 'Fecebook ユーザー名';
    return $contactmethods;
  }
  /**
   * Prints HTML with meta information for the current post-date/time and author.
   *
   * @access public
   * @since 0.0.1
   * @return void
   */
  public function posted_on() {
    $user = get_userdata( get_the_author_meta( 'ID' ) );
    printf(  __( '&lt;time class="entry-date" datetime="%1$s" pubdate&gt;%2$s&nbsp;&nbsp;%3$s&lt;/time&gt;%4$s', self :: $domain ),
      esc_attr( get_the_time() ),
      esc_html( get_the_time( get_option( 'date_format' ) ) ),
      esc_html( get_the_time( get_option( 'time_format' ) ) ),
      get_avatar( $user-&gt;user_email, 40, self :: $path . '/images/default.gif' )
    );
  }
}</code></pre>
<p></p>
<ul>
<li>$domain<br />テキストドメインはクラス名を英数小文字にし、'_' を無くしたものです。<br />
親テーマ：wpxtremeparent<br />
子テーマ：wpxtremechild</li>
<li>$userdata<br />子テーマで label, type, description を設定すると、親テーマでプロフィールページに入力欄を追加します。</li>
<li>user_contactmethods()<br />プロフィールページの「連絡先」欄<br />親テーマ：不要な項目を削除<br />子テーマ：新規に項目を追加</li>
<li>posted_on()<br />子テーマで処理をまるっとオーバーライドしてます。<br />
テンプレートファイル内で以下のように使用します。</li>
</ul>
<pre><code>global $the_theme;
$the_theme->posted_on();</code></pre>
<p>ザッと思いつきですが、何かイケてる気がしませんか！？しませんかそうですか。全部 static function でええやんとか色々検討事項はございましょうが、たまにはこんなことを考えてみるのも息抜きになって良いかもですね！</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.1.3</li><li>PHP 5.3.5</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/use-class-in-wordpress-theme/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/use-class-in-wordpress-theme" />
	</item>
		<item>
		<title>query_posts, get_posts で複数の order 指定に対応する</title>
		<link>http://wpxtreme.jp/multiple-order-parameter-in-query-posts-and-get-posts</link>
		<comments>http://wpxtreme.jp/multiple-order-parameter-in-query-posts-and-get-posts#comments</comments>
		<pubDate>Fri, 29 Jul 2011 05:46:50 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TIPS]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[query]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=615</guid>
		<description><![CDATA[元ネタは公式フォーラムの<a href="http://ja.forums.wordpress.org/topic/7439">カスタムフィールドでソートした後に、日付の降順にしたい</a>です。query_posts(), get_posts() で記事を取得する時に複数の項目でソートしたい、ことはよくあります。WordPress では orderby に半角スペース区切りで並び替えのキーとなる複数の項目を指定することができますが、昇順降順の order パラメータには ASC, DESC のどちらか1つしか指定できない仕様になっています。バグなハズはない。きっと深いワケがあるハズ。とはいえ、項目ごとに並び順を指定する方が需要は多いハズなのでやってみましょう！<a class="excerpt-more" href="http://wpxtreme.jp/multiple-order-parameter-in-query-posts-and-get-posts">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>※ order も複数指定できるよ、って話を以前どこかで見た気がするけど仕様変更されたのかしら。</p>
<h4>コアのソースを見てみよう</h4>
<p><code>query_posts()</code> や素の <code>get_posts()</code> は </code>WP3.2.1 wp-includes/query.php <code>WP_Query::&amp;get_posts()</code> を呼んでます。で、当該処理は以下のようになってます。</p>
<pre><code>if ( empty($q['order']) || ((strtoupper($q['order']) != 'ASC') &#038;& (strtoupper($q['order']) != 'DESC')) )
  $q['order'] = 'DESC';  // ■order は ASC か DESC じゃなければ DESC になります

// Order by
if ( empty($q['orderby']) ) {
  $orderby = "$wpdb->posts.post_date " . $q['order'];
} elseif ( 'none' == $q['orderby'] ) {
  $orderby = '';
} else {
  // Used to filter values
  $allowed_keys = array('author', 'date', 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', 'comment_count');
  if ( !empty($q['meta_key']) ) {
    $allowed_keys[] = $q['meta_key'];
    $allowed_keys[] = 'meta_value';
    $allowed_keys[] = 'meta_value_num';
  }
  $q['orderby'] = urldecode($q['orderby']);
  $q['orderby'] = addslashes_gpc($q['orderby']);

  $orderby_array = array();
  foreach ( explode( ' ', $q['orderby'] ) as $i =&gt; $orderby ) {  // ■orderby は半角スペース区切り！
    // Only allow certain values for safety
    if ( ! in_array($orderby, $allowed_keys) )
      continue;

    switch ( $orderby ) {
      case 'menu_order':
          break;
      case 'ID':
          $orderby = "$wpdb-&gt;posts.ID";
          break;
      case 'rand':
          $orderby = 'RAND()';
          break;
      case $q['meta_key']:
      case 'meta_value':
           $orderby = "$wpdb-&gt;postmeta.meta_value";
           break;
      case 'meta_value_num':
           $orderby = "$wpdb-&gt;postmeta.meta_value+0";
           break;
      case 'comment_count':
           $orderby = "$wpdb-&gt;posts.comment_count";
           break;
      default:
           $orderby = "$wpdb-&gt;posts.post_" . $orderby;
    }

    $orderby_array[] = $orderby;
  }
  $orderby = implode( ',', $orderby_array ); // ■orderby パラメータを半角コンマで連結

  if ( empty( $orderby ) )
    $orderby = "$wpdb-&gt;posts.post_date ".$q['order']; // ■orderby 指定が無効な場合は日付の降順
  else
    $orderby .= " {$q['order']}";  // ■最後に order パラメータを追加
}</code></pre>
<p>ポイントとなる箇所にコメントを記載してます。これで、</p>
<ul>
<li>order は ASC, DESC どちらか1つのみ</li>
<li>orderby は半角スペース区切りで複数指定可能</li>
<li>order パラメータは半角コンマ区切りで連結した orderby の最後に追加される</li>
</ul>
<p>という現状把握ができました。</p>
<h4>フィルタで ORDER BY 節をいじろう</h4>
<p>節はブシじゃないですよ。<code>WP_Query::&amp;get_posts() </code>ではSQL 文の各節ごとにフィルタが用意されているので書き換えは簡単です。</p>
<pre><code>if ( !$q['suppress_filters'] ) { // ■get_posts() はこれがデフォルトで true！
  $where        = apply_filters_ref_array( 'posts_where_paged',    array( $where, &#038;$this ) );
  $groupby    = apply_filters_ref_array( 'posts_groupby',        array( $groupby, &#038;$this ) );
  $join        = apply_filters_ref_array( 'posts_join_paged',    array( $join, &#038;$this ) );
  $orderby    = apply_filters_ref_array( 'posts_orderby',        array( $orderby, &#038;$this ) ); // ■これを使う！
  $distinct    = apply_filters_ref_array( 'posts_distinct',    array( $distinct, &#038;$this ) );
  $limits        = apply_filters_ref_array( 'post_limits',        array( $limits, &#038;$this ) );
  $fields        = apply_filters_ref_array( 'posts_fields',        array( $fields, &#038;$this ) );

  // Filter all clauses at once, for convenience
  $clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &#038;$this ) );
  foreach ( $pieces as $piece )
     $$piece = isset( $clauses[ $piece ] ) ? $clauses[ $piece ] : '';
}</code></pre>
<p><code>suppress_filters</code> というパラメータはその名の通り、<code>true</code> に設定されているとフィルタを実行しません。<code>WP_Query::&amp;get_posts()</code> や <code>query_posts()</code> を使うときは敢えて <code>true</code> を指定しない限り <code>false</code> になるので何も心配しなくてもフィルタ実行してくれます。が、<code>get_posts()</code> という素の関数ではデフォルトパラメータとしてこれが <code>true</code> という仕様なのでフィルタを使用したい場合は <code>false</code> を明示的に指定します。以下にまとめますね。</p>
<pre><code>// 気にしなくて OK！
query_posts( array(  'orderby' =&gt; 'date',  'order' =&gt; 'ASC' ) );

/ /気にしなくて OK！
$posts = new WP_query( array(  'orderby' =&gt; 'date',  'order' =&gt; 'ASC' );

// 気にしなくて OK！
$my_query = new WP_query();
$posts = $my_query-&gt;get_posts(  array( 'orderby' =&gt; 'date',  'order' =&gt; 'ASC' ) );

// 気にして！false にして！
$posts = get_posts(  array( 'orderby' =&gt; 'date',  'order' =&gt; 'ASC',  'suppress_filters' =&gt; false ) );</code></pre>
<h5>order パラメータの与え方</h5>
<p>さて、<code>order</code> に複数パラメータを与えて <code>posts_orderby</code> フィルタで ORDER BY 節を変更したいところですが、このフィルタが呼ばれるのは、先ほどのソースの一番上のコメント部分「 ■order は ASC か DESC じゃなければ DESC になります」より後なので、複数パラメータを与えても既に <code>DESC</code> に変えられてます。<br />
なので、ここでは別のパラメータ <code>myorder</code> を創作してそれに複数 <code>order</code> を指定するようにします。以下、パラメータの与え方。</p>
<pre><code>// 例）メタキー my_meta の値で降順  --&gt; 日付で降順にする場合
$args = array(
    'meta_key' => 'my_meta',
    'orderby' => 'meta_value_num date',
    'myorder' => 'DESC DESC',  // ■創作パラメータ
   // 'suppress_filters' =&gt; false,  // ■素の get_posts() で使う場合はこれも必要！
);
query_posts( $args );
 ：
</code></pre>
<h5>フィルタの処理</h5>
<p>以下を functions.php に追加すれば OK です。</p>
<pre><code>add_filter( 'posts_orderby','my_posts_orderby', 10, 2 );
function my_posts_orderby( $orderby, $query ) {
    $orders = array_filter( explode( ' ', strtoupper( $query-&gt;get( 'myorder' ) ) ) );
    if ( 0 < count( $orders ) ) {  // ■myorder にパラメータが設定されている場合：
        $orderby_array = array();
        foreach ( explode( ',', str_replace( ' DESC', '', $orderby ) ) as $i => $the_orderby ) { // ■最後の DESC を取って半角カンマで項目を分割
            if ( ! isset( $orders[$i] ) || ! in_array( $orders[$i], array( 'ASC', 'DESC') ) ) // ■ASC, DESC 以外の場合：
                $orderby_array[] = $the_orderby . ' DESC' ; // ■DESC にする
            else // ■ASC または DESC なら：
                $orderby_array[] = $the_orderby . ' ' . $orders[$i];  // ■項目の直後に並び順を追加
          }
          $orderby = implode( ',', $orderby_array ); // ■並び順が追加された項目達を連結
    }
    return $orderby; // ■いってらっしゃい！
}</code></pre>
<p class="append">myorder にパラメータが設定されていなくても、myorder にパラメータが設定されている場合にいっちゃう不具合を修正しました。</p>
<h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.1.3</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/multiple-order-parameter-in-query-posts-and-get-posts/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/multiple-order-parameter-in-query-posts-and-get-posts" />
	</item>
		<item>
		<title>WPX Nav Menus</title>
		<link>http://wpxtreme.jp/wpx-nav-menus</link>
		<comments>http://wpxtreme.jp/wpx-nav-menus#comments</comments>
		<pubDate>Wed, 27 Jul 2011 01:43:27 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[PLUGIN]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=594</guid>
		<description><![CDATA[元ネタは公式フォーラムの<a href="http://ja.forums.wordpress.org/topic/7556">カスタムメニューにカスタム投稿タイプのアーカイブ</a>です。register_post_type() のパラメータに has_archive, show_in_nav_menus ができたときに「キタ！」と試したところ、nav menu に投稿タイプの記事が一覧されて「そっちかー」とションボリされた方は結構いらっしゃるに違いない。記事ごとよりはアーカイブの方がメニュー項目としての需要は多いはずなのでプラグインにしてみました。<a class="excerpt-more" href="http://wpxtreme.jp/wpx-nav-menus">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>Description</h4>
<p>WordPress の管理画面［外観｜メニュー］を色々便利にしていくよ！</p>
<h5>Features</h5>
<ul>
<li>メニュー項目にカスタム投稿タイプのアーカイブを追加します。<br />
※ has_archive, show_in_nav_menus 共に true のカスタム投稿タイプが対象です。<br />
&nbsp;&nbsp;カレントのメニュー項目に current-menu-item クラスが付きます。</li>
</ul>
<h5>To Do</h5>
<ul>
<li>メニューに使う画像を指定。<br />
※ css の background でなくて img タグを使用したい方向け</li>
<li>ご意見・ご要望は<a href="#respond">コメント</a>でお気軽に！</li>
</ul>
<h4>Requirements</h4>
<ul>
<li>PHP5+</li>
<li>WordPress 3.1+</li>
</ul>
<h4>Download</h4>
<li><a href="http://wpxtreme.jp/cms/wp-content/plugins/download-monitor/download.php?id=5" title="管理画面の［外観｜メニュー］の機能を拡張します。">WPX Nav Menus&nbsp;&nbsp;version: 0.0.2</a> (.zip&nbsp;&nbsp;2.71 kB)</li>
<h4>Installation</h4>
<ol>
<li>Unzip `wpx-nav-menus.zip`.</li>
<li>Upload `wpx-nav-menus` folder to the `/wp-content/plugins/` directory.</li>
<li>Activate `wpx nav nemus` through the 'Plugins' menu in WordPress.</li>
</ol>
<h4>Known Issue</h4>
<ul>
<li>nav menu 関連にフックが少な過ぎてツライ。</li>
</ul>
<h4>Version History and Changelog</h4>
<ul>
<li>0.0.2 [7-27-2011]<br />
Bug fix: Fixed typo 'show_in_nav_menu'.<br />
Bug fix: Fixed bug where the js file would not loaded.</li>
<li>0.0.1 [7-27-2011]<br />
Initial release.</li>
</ul>
<h4>License</h4>
<p>WPX Nav Menus is released under the <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU GPL 2.0</a> license and comes with absolutely no warranty. By downloading WPX Nav Menus you agree to the terms of the GNU GPL 2.0 license.</p>

]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/wpx-nav-menus/feed</wfw:commentRss>
		<slash:comments>47</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/wpx-nav-menus" />
	</item>
		<item>
		<title>コメントの承認メールを記事の作成者に送信するプラグイン Notify Author !!!</title>
		<link>http://wpxtreme.jp/notify-author</link>
		<comments>http://wpxtreme.jp/notify-author#comments</comments>
		<pubDate>Sat, 31 Jul 2010 17:13:47 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[PLUGIN]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[modifications]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=549</guid>
		<description><![CDATA[wpxtreme がお届けする WordPress プラグイン第1段は、フォーラムでの回答がめんどくさいからっていう、またもやド叱られかねない理由で作成いたしました。kz は立派な大人ですので、例えド叱られても「うるせーバーカ」なんつーハシタないレスポンスはいたしません。御忠告は真摯に受けとめ、自分でしっかりと考えを整理した上で、ブログ上にてクソ長ーーーーい総括をいたしますので、どちら様もご遠慮なく叱咤くださいませ。できれば激励8割でお願いします。あと、口のキキ方にはどなた様もゼヒとも気をつけましょう。しつこい。<br />
さて、フォーラム元ネタは <a href="http://ja.forums.wordpress.org/topic/4661">記事を書いた人にコメントの承認をさせたい</a> です。言われてみれば、至極まっとうな仕様ですね。カスタマイズ的にはライトなのでプラグイン初心者のオレ様にはうってつけです。がんばるぞ。
ぁ？ <a href="http://wpxtreme.jp/wordpress-show-random-images-attached-to-the-posts">非プラ三原則</a> がどうしたって？何だそれ、おいしいの？<a class="excerpt-more" href="http://wpxtreme.jp/notify-author">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>Description</h4>
<p>Notifies the author of the post about a new comment that is a awaiting approval.<br />
要は、WordPress の記事へコメントが投稿された時に管理者宛に送られてくる「モデレートしてください」のメールを、その記事の作成者宛に送信したい、って話です。<br />
ちなみに、「モデレートしてください」のメールは</p>
<ul>
<li>管理画面メインメニュー［設定｜ディスカッション］の［コメント表示条件］で<br />
「管理者の承認を常に必要とする」にチェックがある場合は、常に<br />
「すでに承認されたコメントの投稿者のコメントを許可し、それ以外のコメントを承認待ちにする」にチェックがある場合は、今まで承認されたことがない人のコメントについて</li>
<li>管理画面メインメニュー［設定｜一般］の［メールアドレス］宛に送信されます。</li>
</ul>
<h4>Download</h4>
 <li><a href="http://wpxtreme.jp/cms/wp-content/plugins/download-monitor/download.php?id=4" title="Notifies the author of the post about a new comment that is a awaiting approval.">Notify Author !!!&nbsp;&nbsp;version: 1.0</a> (.zip&nbsp;&nbsp;1.39 kB)</li>
<p><a href="http://wordpress.org/extend/plugins/">公式プラグインディレクトリ</a> からダウンロードできると良いよねー。</p>
<h4>Installation</h4>
<ol>
<li>Upload `notify-author.php` to the `/wp-content/plugins/` directory.</li>
<li>Activate `Notify Author !!!` through the 'Plugins' menu in WordPress.</li>
</ol>
<p>これくらいの英語は翻訳されんでも読もうぜ。な。</p>
<h4>プラグインによるカスタマイズの基本</h4>
<p>カスタマイズのとっかかりはまず、どこをイジればいいのかを探すことから始めます。ヒントはどうにもシックリこない件名の「モデレートしてください」メールにありますよ。</p>
<pre><code>承認する: http://example.com/wp-admin/comment.php?action=approve&#038;c=4</code></pre>
<p>ね。「approve」ってあるでしょ。こんなん「承認」でしか使わない単語よね。んじゃ「approve」で WordPress コアファイルを検索するのじゃ！って結構な数のファイルがありますね。じゃー wp-includes/pluggable.php から見てみましょう。</p>
<pre><code>#1138 $notify_message .= sprintf( __('Approve it: %s'),  admin_url("comment.php?action=approve&#038;c=$comment_id") ) . "\r\n";</code></pre>
<p>なんてラッキー！この関数は <code>wp_notify_moderator()</code> なのでビンゴですね、「ビンゴ」なんて実社会で言うヤツ見た事ないですけど。<br />
実はこの pluggable.php にあるファンクションは、プラグインで好きにカスタマイズしちゃってちょうだいってヤツばかりなんです。なんつっても pluggable ですから。意味わかるよね？よし、いいコだ。んで、1つ1つのファンクションが</p>
<pre><code>if ( !function_exists('ファンクション名') ) :　〜　endif;</code></pre>
<p>で囲まれてますでしょ奥さん？これは、この名前のファンクションがプラグインに無けりゃ今からコレ使うようにするし、ありゃぁソッチ使いますよ、って意味です。クダケ過ぎてかえってわかりにくいですね。フィルタだのアクションだのフックを駆使しなくても関数ごとゴッソリ変えられるってワケです。で、プラグインで同名の名前を作って処理内容を自分色に染め上げるわけですが、プラグインでのファンクションの定義も pluggable.php と同じく</p>
<pre><code>if ( !function_exists('ファンクション名') ) :　〜　endif;</code></pre>
<p>で囲ってあげましょう。これは、プラグイン有効化の時に、既にオリジナルのファンクションが読まれちゃってるので、再定義エラー！ってならないようにするためです。有効化した後は、WordPress くんは有効化されたプラグイン → pluggable.php の順に読み込みますので、プラグインで定義されたファンクションの方が有効になるって仕組みです。ってややこしいわ！</p>
<h4>カスタマイズの詳細</h4>
<p>なんともシックリこない件名の「モデレート」してくださいメールの宛先になっている、管理画面メインメニュー［設定｜一般］の［メールアドレス］は、<code>admin_email</code> ってゆーオプションに入ってます。<code>wp_notify_moderator()</code> では以下のようにアドレスを取得し、メール送信します。</p>
<pre><code>$admin_email = get_option('admin_email');
  :
@wp_mail($admin_email, $subject, $notify_message, $message_headers);</code></pre>
<p>pluggable らしくファンクション内には一見するとフックがありません。とは言っても <code>get_option()</code> の内部で呼んでる <code>pre_option_admin_email</code> フィルタでムリムリカスタマイズすることだってできるんだぜ、ぁあん？ですが、諸々メンドクサイことになること必至ですので、pluggable らしく関数を丸コピして、必要な所だけコソッと変更しましょう。</p>
<pre><code>オリジナル：
$comment = $wpdb-&gt;get_row($wpdb-&gt;prepare("SELECT * FROM $wpdb-&gt;comments WHERE comment_ID=%d LIMIT 1", $comment_id));
$post = $wpdb-&gt;get_row($wpdb-&gt;prepare("SELECT * FROM $wpdb-&gt;posts WHERE ID=%d LIMIT 1", $comment-&gt;comment_post_ID));
  :
$admin_email = get_option('admin_email');
  :
@wp_mail($admin_email, $subject, $notify_message, $message_headers);

変更後：
$comment = get_comment($comment_id);
$post = get_post($comment-&gt;comment_post_ID);
$user = get_userdata($post-&gt;post_author);
  :
@wp_mail($user-&gt;user_email, $subject, $notify_message, $message_headers);</code></pre>
<p>はい、こんだけです。オリジナルの <code>$post</code>, <code>$comment</code> の取得の仕方はツライので、ステキに書き換えましょう。あとは、メールの送付先を投稿の作成者のアドレスにするだけです。最後にプラグインファイルとしての体裁を整えればできあがりです。詳細はプラグインファイルをダウンロードして見てみて。なんつー手抜き。<br />
ちなみに、作成者に 'moderate_comments' の権限は無くていいのかね、って疑問がありますが 、承認処理をしている <code>wp-admin/comment.php</code> では記事に対する 'edit_posts' の権限のチェックしかしてません。記事の作成者は当然 'edit_posts' 権限があるので、Capabilities に関しては気にせんで OK です。<strrong>今のところ</strong>。</p>
<h4>Conclusion</h4>
<p>ちゅーわけで、初めてのプラグインは何とか動いてるようです。初めてって不安ですよね。こ、これで合ってるのかな。オレ変じゃないかな。とドキドキもんです。でもま、変だっていいじゃない、間違ってても気にすんなよ。皆そうやって成長するもんさ。ただちょっと先を行ってる人は、アタタカク見守ってあげようぜ。経験値があるのは別に偉いってことでも能力が上ってことでもありゃしねぇ。自分だって経験値が無い時があったんだから、そういうこと忘れないように、オゴリタカブラナイように。そいでもって追い抜かれる恐怖を感じるなら、相手を叩くよりも自分を高める方に持って行くのがクールってもんだぜ。<br />
ぁ、オレ様がブチ抜くよフフ、って話じゃないからね。オレって結構謙虚なんだからラブ&hearts;<br />
当プラグインへのご質問・ご要望は <a href="#respond">コメント</a> でお気軽に。</p>
<h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.0.1</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/notify-author/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/notify-author" />
	</item>
		<item>
		<title>Sex and the City 2 Bling Diamond Text Effect in Photoshop</title>
		<link>http://wpxtreme.jp/sex-and-the-city-2-bling-diamond-text-effect-in-photoshop</link>
		<comments>http://wpxtreme.jp/sex-and-the-city-2-bling-diamond-text-effect-in-photoshop#comments</comments>
		<pubDate>Thu, 27 May 2010 20:10:51 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TUTORIALS]]></category>
		<category><![CDATA[logo]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[typography]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=495</guid>
		<description><![CDATA[<a href="http://www.sexandthecitymovie.com/" title="フラッシュだよ、気をつけて！">Sex and the City 2</a> がもうすぐ公開ですね。前回の映画を DVD で見てからすっかりハマって、ドラマのDVDを借りまくってました。旧作が100円で良かった、ありがとう GEO。同時期にブームになった人が近隣に複数いたらしく、返却されたら即借りる、返却したら即借りられてる。といった静かな攻防も楽しかったです。<br />
ところで、キャバ嬢向け雑誌や花より男子のDVDパッケージのようなキラキラのデコロゴ、どうやって描いてるか知ってますか？知ってたら教えて（はぁと。調べてもなんかビミョーなチュートリアルしかあらへんわ、使えんのぉと常々思ってたところにこの Sex and the City 2、キラキラで来よったで。さすがサマンサ伊達に50超えとらへんわ。<br />
そういったわけで今回は、Sex and the City 2 のキラキラにインスパイアされたオレが  Photoshop でこうすると似たようなことができまっせという内容をお届けする。ちゃんとデザインの勉強をした方や業務で培ったテクをお持ちの方は優しい心で見守ってあげてください。 <a class="excerpt-more" href="http://wpxtreme.jp/sex-and-the-city-2-bling-diamond-text-effect-in-photoshop">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>Final Image</h4>
<p><a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-1-620x310.jpg" alt="" title="Final Image" width="620" height="310" class="alignnone size-large wp-image-502" /></a>もうちょっと作品的にステキに仕上げると良いのだけども、都合により愛想のない仕上がりになっておる。なお、この記事ではいつものような「えびちゃんがどう」とかいう無駄な話はしない。だって超忙しいんだもの。<br />
なおなお、この記事は Mac 向けに書いている。というかオレは Windows のことはイチイチ気にかけてあげないので、残念ながら Windows をお使いの方はキーの使い方など各自適宜読み替えてください。でもどうせ替えるなら Mac にカエルのがオススメだよ。</p>
<h4>背景を描く</h4>
<p>ここは本題じゃないので読み飛ばして OK。</p>
<ul>
<li>ファイル > 新規<br />
幅1000pixel x 高さ500pixel<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-11.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-11-620x387.jpg" alt="" title="新規" width="620" height="387" class="alignnone size-large wp-image-510" /></a></li>
<li>フィルタ ＞ 描画 ＞ 雲模様1<br />
描画色：#FFFFFF<br />
背景色：#000000<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-2.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-2-620x387.jpg" alt="" title="雲模様" width="620" height="387" class="alignnone size-large wp-image-511" /></a></li>
<li>フィルタ ＞ ぼかし ＞ ガウス<br />
半径：70pixel<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-3.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-3-620x387.jpg" alt="" title="ぼかし" width="620" height="387" class="alignnone size-large wp-image-512" /></a></li>
<li>フィルタ ＞ ノイズ ＞ ノイズを加える<br />
量：2%<br />
分布方法：均等に分布<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-4.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-4-620x387.jpg" alt="" title="ノイズ" width="620" height="387" class="alignnone size-large wp-image-513" /></a></li>
<li>レイヤー ＞ 新規調整レイヤー ＞ トーンカーブ<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-5.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-5-620x387.jpg" alt="" title="トーンカーブ" width="620" height="387" class="alignnone size-large wp-image-514" /></a></li>
<li>レイヤー ＞ 新規調整レイヤー ＞ 色相・彩度<br />
色相：292<br />
彩度：15<br />
明度：50<br />
色彩の統一をチェック<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-6.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-6-620x387.jpg" alt="" title="色相・彩度" width="620" height="387" class="alignnone size-large wp-image-515" /></a></li>
</ul>
<h4>ダイアモンドのパターン作成</h4>
<p>恐れんで良い。ただの白い丸だ。</p>
<ul>
<li>ファイル > 新規<br />
幅 7pixel x 高さ 7pixel</li>
<li>新規レイヤーを作成して、楕円ツールで円を描画<br />
描画色：#FFFFFF<br />
※7 x 7 めいっぱいじゃなくて、周囲は黒い部分を残し気味にしてあげよう。<br />
※別のレイヤーを下敷きにして、描画色 #000000 で塗りつぶしておくと見易いぜ。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-7.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-7-620x387.jpg" alt="" title="ダイアモンドだね" width="620" height="387" class="alignnone size-large wp-image-517" /></a></li>
<li>編集 ＞ パターンを定義<br />
パターン名：diamond7x7<br />
※背景は透明にしておくこと。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-8.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-8-620x387.jpg" alt="" title="パターンを定義" width="620" height="387" class="alignnone size-large wp-image-518" /></a></li>
</ul>
<h4>デコるぜ</h4>
<ul>
<li>テキスト追加<br />
フォント：Minion Pro<br />
サイズ：256pt<br />
描画色：#333333<br />
※WPCITYって、、、だよなうんオレもそう思うよ。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-9.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-9-620x387.jpg" alt="" title="テキスト追加" width="620" height="387" class="alignnone size-large wp-image-519" /></a></li>
<li>テキストレイヤーの上に新規レイヤーを作成して、先ほど作成したパターンで塗りつぶす。<br />
レイヤー名：dia<br />
パターン：diamond7x7<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-10.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-10-620x387.jpg" alt="" title="パターンで塗りつぶし" width="620" height="387" class="alignnone size-large wp-image-520" /></a></li>
<li>クリッピングマスクを作成。</li>
<li>「dia」レイヤーを複製する。<br />
レイヤー名：dia blur</li>
<li>クリッピングマスクを作成。</li>
<li>フィルタ ＞ ぼかし ＞ ガウス<br />
半径：0.8pixel<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-111.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-111-620x387.jpg" alt="" title="ぼかし" width="620" height="387" class="alignnone size-large wp-image-521" /></a></li>
<li>一番上に新規レイヤーを作成して、テクスチャを貼付け。<br />
レイヤー名：grunge<br />
テクスチャ：<a href="http://www.bittbox.com/freebies/free-texture-tuesday-white-and-black-grunge" title="Bittbox">Bittbox</a><br />
描画モード：乗算<br />
不透明度：70%<br />
※黒い部分が文字にまんべんなくかかるようにテクスチャを移動したり回転したりすると良い。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-12.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-12-620x387.jpg" alt="" title="テクスチャ" width="620" height="387" class="alignnone size-large wp-image-522" /></a></li>
<li>イメージ ＞ 色調補正 ＞ トーンカーブ<br />
黒いところがドギツク黒くなり過ぎないように、下の方を持ち上げよう（キャプチャ忘れ）。</li>
<li>フィルタ ＞ ぼかし ＞ ガウス<br />
半径：0.5pixel</li>
<li>クリッピングマスクを作成。<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-13.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-13-620x387.jpg" alt="" title="テクスチャぼかし" width="620" height="387" class="alignnone size-large wp-image-523" /></a></li>
</ul>
<p>ダイヤは白と黒だけよりも、虹色をほんのり加えるとソレっぽくなるぞ。</p>
<ul>
<li>一番上に新規レイヤーを作成して、描画色で塗りつぶす。<br />
レイヤー名：color<br />
描画色：#000000</li>
<li>フィルタ ＞ ノイズ ＞ ノイズを加える。<br />
量：100%<br />
分布方法：均等に分布<br />
※カラーノイズだぜ<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-14.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-14-620x387.jpg" alt="" title="カラーノイズ" width="620" height="387" class="alignnone size-large wp-image-524" /></a></li>
<li>フィルタ ＞ ピクセレート ＞ モザイク<br />
セルの大きさ：10平方ピクセル
<br /><a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-15.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-15-620x387.jpg" alt="" title="カラーモザイク" width="620" height="387" class="alignnone size-large wp-image-525" /></a></li>
<li>フィルタ ＞ ぼかし ＞ ガウス<br />
半径：8pixel<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-16.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-16-620x387.jpg" alt="" title="カラーモザイクぼかし" width="620" height="387" class="alignnone size-large wp-image-526" /></a></li>
<li>クリッピングマスクを作成。<br />
描画モード：カラー<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-17.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-17-620x387.jpg" alt="" title="リアルな色づけ" width="620" height="387" class="alignnone size-large wp-image-527" /></a><br />
※ほんのりがステキ。</li>
</ul>
<h4>縁取ってみよう</h4>
<p>おいおい、あんまり欲張るもんじゃないぜ。</p>
<ul>
<li>テキストレイヤーの下に新規レイヤーを作成する。<br />
レイヤー名：stroke</li>
<li>command+テキストレイヤーをクリック。<br />
テキストが選択される。</li>
<li>選択 ＞ 選択範囲を変更 ＞ 拡張<br />
拡張量：2pixel<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-18.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-18-620x387.jpg" alt="" title="縁取り拡張" width="620" height="387" class="alignnone size-large wp-image-529" /></a></li>
<li>「stroke」レイヤーを選択し、選択範囲内を描画色で塗りつぶす。<br />
描画色：#FFFFFF<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-19.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-19-620x387.jpg" alt="" title="縁取り塗りつぶし" width="620" height="387" class="alignnone size-large wp-image-530" /></a></li>
<li>「stroke」レイヤーをコピーして非表示にしておく。</li>
<li>command+テキストレイヤーをクリック。<br />
「stroke」レイヤーを選択し［delete］キーを押す。<br />
※まさに縁取り！<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-20.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-20-620x387.jpg" alt="" title="まさに縁取り" width="620" height="387" class="alignnone size-large wp-image-531" /></a></li>
<li>「stroke」レイヤーをダブルクリックして「レイヤースタイル」を開く。<br />
ベベルとエンボス - <br />
サイズ：0<br />
角度：90<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-21.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-21-620x387.jpg" alt="" title="ベベル" width="620" height="387" class="alignnone size-large wp-image-532" /></a></li>
<li>「grunge」レイヤーを複製し、「stroke」レイヤーの上に移動してクリッピングマスクを作成。<br />
「color」レイヤーのクリッピングが外れるので直してあげてね。</li>
<li>フィルタ ＞ ぼかし ＞ ガウス<br />
半径：3pixel<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-22.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-22-620x387.jpg" alt="" title="ぼかしグランジ" width="620" height="387" class="alignnone size-large wp-image-533" /></a></li>
<li>テキストレイヤーをダブルクリックして「レイヤースタイル」を開く。<br />
シャドウ - <br />
角度：100<br />
距離：1<br />
チョーク：20<br />
サイズ：5<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-29.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-29-620x387.jpg" alt="" title="シャドウ" width="620" height="387" class="alignnone size-large wp-image-543" /></a></li>

</ul>
<h4>白いよりは青みがかってる方がリアル</h4>
<ul>
<li>一番上に新規レイヤーを作成し塗りつぶす。<br />
レイヤー名：blue<br />
描画色：#587EE0（青っぽければ何でも良い）</li>
<li>フィルタ ＞ ノイズ ＞ ノイズを加える。<br />
量：100%<br />
分布方法：均等に分布<br />
グレースケールノイズにチェック<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-23.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-23-620x387.jpg" alt="" title="青いノイズ" width="620" height="387" class="alignnone size-large wp-image-535" /></a></li>
<li>フィルタ ＞ ぼかし ＞ ガウス<br />
半径：1pixel<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-24.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-24-620x387.jpg" alt="" title="青ノイズぼかし" width="620" height="387" class="alignnone size-large wp-image-536" /></a></li>
<li>クリッピングマスクを作成。<br />
描画モード：オーバーレイ<br />
不透明度：50%<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-25.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-25-620x387.jpg" alt="" title="青オーバーレイ" width="620" height="387" class="alignnone size-large wp-image-537" /></a><br />
※ググっと良くなりましたね。</li>
</ul>
<h4>キラキラ bling bling させよう</h4>
<ul>
<li>一番上に新規レイヤーを作成。<br />
レイヤー名：star</li>
<li>星形（十字形）のブラシをどっかからパチッてきて鋭い輝きを追加。<br />
描画色：#FFFFFF<br />
不透明度：100%<br />
流量：100%<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-26.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-26-620x387.jpg" alt="" title="星" width="620" height="387" class="alignnone size-large wp-image-539" /></a></li>
<li>一番上に新規レイヤーを作成。<br />
レイヤー名：light</li>
<li>普通のブラシでソフトな輝きを追加。<br />
描画色：#FFFFFF<br />
不透明度：100%<br />
流量：50%<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-27.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-27-620x387.jpg" alt="" title="ソフトなかがやき" width="620" height="387" class="alignnone size-large wp-image-540" /></a></li>
 <li>command+「strokeのコピー」レイヤーをクリックし、「light」レイヤーを選択。</li>
<li>レイヤー ＞ レイヤーマスク ＞ 選択範囲外をマスク</li>
<li>「star」レイヤーを選択。</li>
<li>レイヤー ＞ レイヤーマスク ＞ 選択範囲外をマスク</li>
</ul>
<p>つまり、キャプチャ忘れってことだ。テキスト外の bling bling を削除！してます。お好みで。</p>
<h4>縮小してもイケてるぜ</h4>
<p>ちょろっと検索して出てくるチュートリアルは使えんのぉ、の理由に作成後に縮小しちゃうとすごく残念なことになってしまう、てのがある。やってみたらわかる。すごく残念。でも、なんとコイツは縮小してもイカしてるのだ。ありがとう Sex and the City 2 のロゴ描いた人。</p>
<ul>
<li>テキスト関連のレイヤーをすべて選択してマージしちゃおう。command+E だ。<br />
えー！せっかく描いたのにー！って人は「すべて選択＞新規フォルダに入れる＞フォルダ複製＞ソッチをマージ」すると良い。</li>
<li>そしてリサイズ（縮小）</li>
<li>フィルタ ＞ シャープ ＞ シャープ</li>
<li>編集 ＞ 「シャープ」をフェード<br />
不透明度：70%<br />
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-28.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-28-620x387.jpg" alt="" title="縮小" width="620" height="387" class="alignnone size-large wp-image-542" /></a></li>
</ul>
<p>縮小後にシャープしてあげるとギラギラが増してよろしいがやり過ぎはダメです。さらに縮小する場合は「light」レイヤーは非表示にして、「star」レイヤーで bling bling を増やすといいぞ。このとき、星形ブラシは「十字」にするように。「×印」にするとイマイチなのだ。</p>
<h4>Conclusion</h4>
<p>まったく愛想の無いチュートリアルでしたが言いたいことはおわかりいただけましたでしょうか。より味わい深くするには以下をお試しください。</p>
<ul>
<li>整列してるダイアモンド塗りつぶしパターンをちょいちょいズラす。</li>
<li>グランジー部分を手作業でがんばる。</li>
<li>シャドウを焼き込みでがんばる。</li>
<li>bling bling を覆い焼きでがんばる。</li>
</ul>
<p>手間をかければかける程、イキな仕上がりになります。んが、同時に絵心も要求されますのでご注意ください。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/05/satc2-1-620x310.jpg" alt="" title="Final Image" width="620" height="310" class="alignnone size-large wp-image-502" /></a>
WordPress くんが微妙に縮小した画像が表示されてるので、クリックしてちょい大きくして見てね。んーすばらしい。一年くらいウマイやり方ねーかなーと悶々しておったがこれで解決じゃフハハハh！小悪魔花より系とは表現方法が違うけどもオレはこっちのが好きだぜラブ&hearts;</p>
<h5>動作確認バージョン</h5><ul class="tested-vers"><li>Photoshop CS4</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/sex-and-the-city-2-bling-diamond-text-effect-in-photoshop/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/sex-and-the-city-2-bling-diamond-text-effect-in-photoshop" />
	</item>
		<item>
		<title>フォーラムの歩き方</title>
		<link>http://wpxtreme.jp/how-to-walk-on-a-forum</link>
		<comments>http://wpxtreme.jp/how-to-walk-on-a-forum#comments</comments>
		<pubDate>Sun, 16 May 2010 21:04:44 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[HOW-TO]]></category>
		<category><![CDATA[text]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=431</guid>
		<description><![CDATA[ども、不誠実なノイズです。<br />
アイツなら絶対記事を書くはずだ、と思われていた皆様の読み通り、今回はえびちゃんの結婚について kz のコメントを発表いたします。<br >
するかー！えびぞうとどっちが早よワヤになるか対決したらええねん！えび同士でな！フハハハハ！うまいなオレフハハハハ！<br />
ソッチの話ではなく、フォーラムでの回答の仕方について kz の考え方をお届けしますね。ただし、通常は不穏な空気を察知したらスルーするのが大人の対応です。フォーラム内に本題外の返信をしたり、ましてや粘着的にブログ記事にするのは、内容のステキ度に関わらず一般的に敬遠される行動です。将来のある皆は真似しないように。<br />
さて、フォーラムには色んな背景を持った様々なレベルの方々が集います。考え方も生き様も人それぞれ。フォーラムはコミュニティ、すなわち社会です。オンラインであってもソコでの歩き方はオフラインと同様。背筋をピンと伸ばして颯爽と歩くにはどういったことに配慮すれば良いのか、オマエが言うなとホウボウから突っ込まれつつ、いつものようにダラダラ書きます。

<a class="excerpt-more" href="http://wpxtreme.jp/how-to-walk-on-a-forum">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>概要</h4>
<p>WordPress 日本語フォーラムでの <a href="http://ja.forums.wordpress.org/topic/4000">タクソノミーの名前取得</a> というトピックへの kz の回答に対して「セキュリティ上の問題」「回答の仕方」「回答者としての姿勢」という観点からご指摘をいただいた。どれも大切なことなので kz 的総括を行いココに記す。2010.5.16 没。お亡くなってどうすんねん。</p>
<h4>訂正</h4>
<p>まず、kz の発言に「<code>single_cat_title()</code> 〜そのまま <code>echo</code>」とあるがこれは誤りである。ごめんな、WordPress。投稿前に <code>single_cat_title</code> のフィルタを Finder ちゃんに尋ねてみてもそんなんないよーとツレナイ返事だったので <code>add_filter</code> されてないと誤解しちまったぜ。wp-includes/general-template.php すら出てこん時点で気づけっちゅう話。なお、これは言い訳でも自己弁護でもなく単に事実をご説明差し上げただけだ。皆様におかれましては、ぐねぐねしたモノの見方はせずにまっすぐスクスクと育っていただきたい。それにしても自分の過ちを自ら素直に認める辺り、さすが kz だな。人間ができておる。<br />
実際は wp-includes/default-filters.php で <code>wptexturize</code>, <code>strip_tags</code> が <code>add_filter</code> されているので安心してください。Finder ちゃんがたまにちゃんと検索してくれなくなるのは MacBook 買い替えのお知らせなのか？</p>
<h4>はじめに</h4>
<p>イチイチ但し書きするのはメンドウなので予め皆さんへのお願いをまとめておく。しっかり読んでご理解いただけましたら [Accept] ボタンをクリックして先へお進みください。</p>
<ul>
<li>本文では「一般的に」「普通なら」「通常は」などのような書き方をするが「普通ってなんですか？そんなの人それぞれじゃないですか？」とか中学生みたいな反応は思春期まっただ中のうちに使い果たしておいて欲しいので、読む前にグラウンド100周×50本走ってこい。</li>
<li>例えば「価値観を押し付けるのは良くない」に対して「それこそ良くないって価値観を押し付けてますよね」な返しは、「アホって言う人がアホなんです」に「アホって言う人がアホ、って言う人がアホなんです」と返すのと同じである。ちょっと例えがアレだが言いたい事はわかるだろう。そもそも初めにアホって言うヤツがイカンのであって、言いがかりをつけられた側がそれを指摘するのは問題ない。わからん？ん、走ってこい。こういった小ナマイキな小学生的反応もご遠慮いただけますと、今夜もおいしくご飯がいただけますのでヨロシク。</li>
<li>kz は明らかな悪意を持って自分を攻撃してくる個人を除いて、特定の個人に対してオンラインのテキストなんぞで攻撃することはない。とは言っても世の中はとても広くて、存在しない悪意を実体参照するという特殊能力を持った好戦的な X-MEN が存在する。今回はそういった方々のために、実験的に「別に何の悪意も敵意もないのでよろしくね（はぁと」っちゅー意味で、必要かもと思われる箇所の文末に「ラブ&hearts;」を付加する。しかしまー、そんな人間を超越した存在にまで配慮してテキストを書かなイカンとなると毛がいくらあっても足りんわ。日本はいつからこんな但し書き地獄になったんだ？</li>
<li>あとは、他人と円滑にコミュニケーションが取れる読解力・察するセンスがあればよろしい。</li>
</ul>
<h4>kz の自己紹介</h4>
<p>そもそも kz ってどんなやつやねんという方向けに「昔ワンレンサラサラロングヘアーだった人への100の質問」にお答えします 。<a href="http://yokohama2010.wordcamp.jp/" title="WordCamp 横浜公式サイト">WordCamp Yokohama</a> でお会いするであろう方々には心の事前準備としてもぜひご活用いただきたい。準備は事前に決まっとるわ！事後の準備があるなら事後というコトバに含まれるステキなニュアンスについてぜひ語り明かしたいものです。もう準備関係あらへんがな。</p>
<ul>
<li>オンラインでもオフラインでも公共の場での人への接し方は変わらない。<br />
公共オンラインの例：フォーラム<br />
公共オフラインの例：一般社会<br />
※ちなみに wpxtreme はプライベートなオンラインな。</li>
<li>仲の良い人，面識のある人，面識のない人，まったく知らん人 各々への接し方は変わらない。</li>
<li>嫌われてることはあるだろうが、わざわざ人を嫌うことはない。メンドウだもの。<br />
苦手なタイプはいる。ワンマン社長とかのメンドくさい系。</li>
<li>理論，概念，建前に興味は無い。実際どうなんってゆー正味の話がすべてさ。</li>
<li>律儀なメンドくさがりだが、メンドウなことを無くすための努力は惜しまない。</li>
<li>非常にまったりしておる。カリカリしても何も生み出さんので怒る必要がない。</li>
<li>誰に対しても悪気も悪意も敵意も何も無い。メンドクサイやん。</li>
<li>どっかでボロクソ言われてても気にならない。マイナスオーラに包まれてお気の毒にとは思う。</li>
<li>明確な敵意を持って直接攻撃されたら、ケツの穴にゴーヤ突っ込んで奥歯ガタガタ言わしたる。</li>
<li>物事をプラス方向にのみ考える。毎日幸せ。</li>
<li>タブーは無い。何でもカンでもオープンでいいじゃない。</li>
<li>ロクでもない WEB 関連業者が口のうまさだけで儲けている実情。</li>
<li>最近は Photoshop をイジってる方が楽しい。</li>
</ul>
<h4>kz の生きる指針</h4>
<p>kz のことがもっと知りたいの、というえびちゃん（人妻）に。</p>
<ul>
<li>他人を変えることはできない。自分が変われば他人も変わる。</li>
<li>会社に属さなくなっても、社会に属していることを忘れない。</li>
<li>ロジックの世界にどっぷり浸かっていても、人（の心）はロジカルでないことを忘れない。</li>
<li>心に余裕を。社会に感謝を。人に愛情を。テキストにユーモアを。そして何より察するセンスを。</li>
</ul>
<h4>kz の心がけ＠コミュニティ</h4>
<ul>
<li>キチキチ堅苦しくしない。<br />
雰囲気の良さがコミュニティを発展させると考えているため。キチキチはギスギスに変わるしね。</li>
<li>「他人」に対して意見しない。「他人の意見」に対して自分の意見を述べる。</li>
<li>他人の意見の真意が明確でない場合に勝手に決めつけて議論しない。</li>
<li>どう見たって明らかな悪意、以外は「他人」や「他人の意見」を悪い方向に捉えない。<br />
悪く捉えたときは、自分の心がダークサイド寄りになってるってことよ。</li>
<li>他人の意見への改善提案は「〜っていう風だと皆がより幸せになれるかも」な書き方にする。</li>
<li>考え方は人それぞれ。他人の考えをすべて認める必要も細かく否定する必要も無い。<br />
「自分」に対する誤った意見には、ご丁寧に説明をいたします。</li>
<li>自分の考えを他人に強要しない。<br />
日本語ワカリマスカ？という意味で「読☆解☆力」というツッコミはする。<br />
オレ様に従え、賛同せよ、なんつー思惑はない。</li>
<li>相手の使う言葉・表現を使う。</li>
<li>冷たいテキストにならないように楽しんで書く。<br />
感じ悪い書き方しても誰も幸せにならないし、自分の評価を下げるだけだぜ？</li>
<li>コミュニティの特定の個人に対する意見を別のところで書かない。<br />
そういうのは大抵悪口だろ？それは無粋ってもんだぜ。<br />
オレが別のところで意見を述べる場合は関係者にお知らせするぜ。カゲ口にならんようにな。</li>
<li>各々がその時点でできることに、無理せず貢献すれば良い。</li>
<li>誰に対してであろうと謙虚に愛情を持って接する。</li>
</ul>
<p>どれも当たり前やんけですね。え、もう異論があるの？わぉ。とりあえず、横浜においでよ。それにしても kz kz ってどんだけ自分大好きやねんと思われるだろうが、自分を愛せないで誰かを愛することなんてできやしないわ！</p>
<h4>登場人物</h4>
<p>ここでは、一般観覧者の方々から見て kz vs の図式になっている風な方々を対象にする。まだ序盤で元気なので但し書くが、これはその方々に向けた呪いの記事ではない。ケーススタディとして今回の実例を引き合いに、kz の考えをシャア・アズナブルである。ちゃうわ、私もよくよく運のない男だとか言うてる場合か。シェアすることで誰かにとって何らかの参考になれば幸いってわけだ。</p>
<p><br /><strong>lilyfan さん</strong>：<br />
ご存知 Ktai Entry, Ktai Style などのプラグイン作者。kz とは <a href="http://wpxtreme.jp/ktai-entry-%e3%81%a7%e3%83%87%e3%82%b3%e3%83%a1%e3%83%bc%e3%83%ab%ef%bc%88%e8%83%8c%e6%99%af%e3%81%af%e9%99%a4%e3%81%8f%ef%bc%89">Ktai Entry でデコメール</a> が Ktai Entry に取り込まれたり、WordBench 名古屋でお会いしたり、WordCamp 名古屋の WEB 担当チーマー同士なので知った仲だ。</p>
<p><br /><strong>spais さん</strong>：<br />
wp.Vicuna という WordPress テンプレートを提供されている様子。<a href="http://yokohama2010.wordcamp.jp/" title="WordCamp 横浜公式サイト">WordCamp Yokohama</a> 告知バナーのブログパーツを提供されていた気がする。当該トピックが初対面。</p>
<p><br />では、この WordPress に多大な貢献をされているステキな方達と、4ヶ月かそこらのポッと出 WordPress 日本語フォーラム初心者 kz とのやり取り骨子を以下にまとめてみよう。ツイート からも適宜無断引用する。著作権どうこう言うヤツはグラウンドを3年程がむしゃらに駆け回れ。なお kz 側の説明が念入りかもしれんが、それはココが kz のホームなので当たり前のことだ。イチイチ説明さすなラブ&hearts;<br />
<p class="append">【お題】<br />taxonomy.php でタクソノミーの名前を表示したい。<br />
single_cat_title() や single_tag_title() に相当するものはないか？</p>
<p><strong>kz</strong></p>
<ul>
<li>ザザッと <code>single_cat_title() </code> を調べる。</li>
<li><code>$taxonomy = $wp_query-&gt;get_queried_object(); echo $taxonomy-&gt;name;</code> で動作確認。</li>
<li>フィルタが気になったので Finder ちゃんに尋ねるが詳細は前述の通り。</li>
<li>そのまま返信。</li>
</ul>
<p><br /><strong>lilyfan さん</strong>：</p>
<ul>
<li>セキュリティ上の問題について
<ul>
<li><code>echo esc_html($taxonomy-&gt;name);</code> にするべき。</li>
<li>タクソノミー名なら大丈夫のはずだが、変数をそのまま echo するのは原則禁止とした方がよい。</li>
<li>WordPress のコアコードでも <code>esc_html()</code> してないとこあるけどね。(twitter)</li>
</ul>
</li>
<li>回答の仕方について
<ul>
<li>回答としてコードをいきなり書くのは、怠け者の質問者を増やすのでやめて頂きたい。</li>
<li>コードは質問者がまず作って、回答者は添削に徹する方が質問者のためになる。(twitter)</li>
</ul>
</li>
</ul>
<p><br /><strong>kz</strong>：<br />
<ul>
<li>セキュリティについて
<ul>
<li>タクソノミー名の表示やったら正味問題ないんちゃうんという認識。</li>
<li>お題を解く事のみにフォーカスしているので、実運用に際しては各自よきにはからえ。</li>
</ul>
</li>
<li>回答の仕方について
<ul>
<li>バシッとコードで一発解決、が諸々クールだと思っている。</li>
<li>質問者が怠け者か勤勉かには立ち入らない。</li>
</ul>
</li>
<li>何故回答するのか
<ul>
<li>1つの質問でお世話になったので1万倍にして返す。</li>
<li>どうなんだろと思って調べてコレか！と学ぶのが楽しい。</li>
</ul>
</li>
</ul>
<p><br /><strong>spais さん</strong>：（3返信とも同じ主旨ラブ&hearts;）<br />
<ul>
<li>お世話を返す気持ちなら不備のある発言はしない方がよい。</li>
<li>セキュリティ的な穴はちょっとした気の緩みから生まれる。</li>
<li>めんどくさいならば無理に答える必要は無い。</li>
<li>プラグインを利用したタクソノミー名改ざんのサンプルご提供。</li>
</ul>
<p>自分に都合の良いところだけ抽出とかセコいマネはしないぜ？本記事を書き始めた後に返信がさらに追加されてるけども、本質的に新しいネタは無くてオレ的にはどうでもいいので省略する。興味ある方は <a href="http://ja.forums.wordpress.org/topic/4000" title="WordPress 日本語フォーラム">当該トピック</a> を確認してね。<br />
あ、ちなみに spais さんの返信はオレの話を読まずにワザと同じ事を3回書いてるとしか思えないので全部読まんでも良いと思うけど、お腹が空いてる人はあえて全部読んで満腹になるのもアリだぜラブ&hearts; そんな感じですが OK ？はい、では続けますね。</p>
<h4>それぞれの主張と kz の見解</h4>
<p>アツ苦しい議論を展開する御三方に共通するのは、スルーしないところである。そう、言わな気がすまん側の住人なのだ。だが、社会にすんなり順応されている皆さんにしてみたら他でやれっちゅう話。多くの場合、言わな気がすまんことは言わん方が良いことなのだ。どうなろうとも自分の人生には一切自分で責任を持つという武士でない限り、真似はしない方が平和な生活を営む事ができるのでぜひ覚えておいて欲しい。</p>
<p><br /><strong>lilyfan さん</strong> vs <strong>kz</strong>：</p>
<p>lilyfan さんの本題は「回答コードをいきなり書くのは、怠け者の質問者を増やすのでやめて」だ。「はっきり言うと」とあるので自明ですね。これに気づかんようでは、えびちゃんとデートはおろか、話をすることさえママならんだろう。水着の季節までには何としてでも読解力を鍛えておいて欲しいところだ。<br />で、最近のシンプル過ぎる kz の回答は、ご自身の考えからするとフォーラムに悪影響を及ぼすと思われていたと考えるのが自然だろう。<code>esc_html()</code> のツッコミは単にそれを伝えるためのきっかけに過ぎない。<br />
<br />
で、オレは残念ながら赤ペン先生的な回答の仕方はできない。それはオレがボランティアとして貢献できる範囲を超えているし、自分勝手な事を言えばそんなんちっともオモロないラブ&hearts;。わがままでごめんね皆グスン。<br />
lilyfan さんも kz も色んな意味でフォーラムをより良くしたいという思いは、基本的に同じである。しかし、以下のような決定的な違いがある。</p>
<ul>
<li>良しとする回答のスタイル。
  <ul>
    <li><strong>lilyfan さん</strong>：質問者が自身が考えて解決するように導く。</li>
    <li><strong>kz</strong>：ズバッと即答。</li>
  </ul>
lilyfan さんは即答スタイルに対して「自分で解決しようとしない質問者が増え、フォーラム全体の向上心的なものが右肩下がりになる」ことを危惧している。<br />
質問者の向上心的なものについては、オレは介入しない。伸びる人は自分で伸びるし、伸びる気の無い人は他人がいくら世話を焼いても伸びないと考えているからだ。そして、導くスタイル自体にはまったく異論はない。が、前述の通りそのスタイルでの貢献は負担が大き過ぎてできない。<br />
<br />
導くスタイルは「実践する」となるとハードルがかなり高いと思っている。オレが重要視する「実際どうなん」ってところがムズい。まず、タフな回答者が相当数いないと返信率が間違いなく下がる。すると、質問しても回答がつかない、ここで聞いても解決しない、という悪循環になりフォーラムが停滞する。100円賭けてもいい。また、回答者にかなりの大きさの器が必要となる。赤ペンスタイルがすべて笑顔で解決するとこれほど素晴らしいことはないのだが、回答者がちょいちょいイヤミになったりキレたり途中で去ってしまう流れには結構良くお目にかかる。これはとても残念ネ。<br />
良い視点での話が全然できなくてスマンかったが「こうすればオール OK だぜ？」というナイスアイデアをお持ちの方は、ぜひアチコチでご提案してみてくださいね。マジで頼むぜ。オレからは「タフで器のデカイ回答者を相当数配備」を提案。<br />
<br />
即答スタイルは、lilyfan さんの危惧する悪影響はもちろんあるかもしれない。一方、別な視点から見れば、お前スパムかっちゅう勢いで回答しまくると不思議な事にフォーラム全体が活気づく。またお会いしましたね、という質問者は前回より少しカワがムケている。そして新たな回答者がポツポツ出てくる。しまいにゃ、おいおい、ちったぁオレにも回答させてくれよってなことに！これは皆さん実際に目の当たりにしたんではないでしょか。コレがオレの言う諸々の好循環である。導くスタイルでもこの好循環はあるけども、悪循環との相殺とかかなりのリソースを投入しないとなので、フォーラム全体の活気までは結構遠い。<br />
<br />
ついでに言うと「1万倍にして返す」は申し訳ないが数の話である。1個1個100％の抜かりない回答をするっちゅう意味ではない。できるかそんなもん！ハゲるわ！ラブ&hearts;。オレの唯一の質問はフォーラムでは解決していないが、そんなことはどうでも良い。レアケースな質問だったので返信がなかなか無く、無駄に更新を繰り返してただ待つよりは「尋ねるだけでは申し訳ないし」と回答を始めた。で、しばらくして返信をいただいた。そら嬉しかったがね。何より「返信があった」ってことがですよ。無視されるくらいならいっそ嫌われたい乙女心がよくわかった。だからオレは他の誰かが答えられる質問より、まったく返信がなくてどんどん下に消えて行くようなマニアックな質問に積極的に回答するようにしておったわけじゃ。<br />
<br />
そして kz の経験から言えるのは、フォーラムに限らず人生のあらゆる局面で「人のため」と思って何かをしてもほぼ残念な結果に終わるということだ。「これだけしてやってるのに」とか感じ悪いヤツも顔を出してくる。でも、すべては自分のため、そういう気持ちで臨むと何故だかすべてがスムーズに動いてくれる。なのでオレは「解くのが楽しい」から回答する。<br />
<br />
物事を進めるのには色んなやり方がある。ビジネスとしてシビアに検討すればコストパフォーマンスが一つの指標になるだろう。オレは自分なりにできること／できないこと、メリット／デメリットをコミュニティ全体を通して捉えてマイベストを実践するし、各々が良しとするスタイルで自由に貢献すれば良いと思う。ウチのフォーラムだとこういうやり方がベストですね、ってのを回答者達で考えてみるのもいいだろう。自分が参加しているオープンソースのフォーラムをよりステキにするにはどんな方法があるか、皆もそれぞれ考えて、できれば実践してみると少し世界が広がるかもしれないよ。<br />
<br />
</li>
<li>自分の考えるスタイルを他者にも求めるかどうか。
  <ul>
    <li><strong>lilyfan さん</strong>：求める。</li>
    <li><strong>kz</strong>：皆好きにしたらええと思うよ。</li>
  </ul>
</li>
フォーラムのルールにより回答方法が指定されていれば、参加する者はそれには当然従うべきである。できるなら参加するし、できないなら参加しない、ほんだけ。こういうやり方でお願いという話でも同じ。できるならするし、できないのはごめんなさいとなるラブ&hearts;。<br />
</ul>
<p>さて、ココまで読んで「コイツの自己弁護はまったく鼻につく」というご感想を持たれた方、いらっしゃいますでしょうかラブ&hearts;。えーっとですね、そちらの方から順にグラウンドへ出ていただけますか。はい、100×100で。よろしくお願いいたします。</p>
<p><br /><strong>spais さん</strong> vs <strong>kz</strong>：</p>
<p>非常に興味深い方なので横浜で会うのが楽しみである。なんせ今までに会った事のないタイプだ。そう、えびちゃんクラスを落とすのは金持ちでもイケメンでもない。アホほど男が群がってくる女性ならその程度の男は見飽きておる。自分の知らない世界を教えてくれる男にこそメロメロになるのだ。なお、ここから「ラブ&hearts;」の出現率が異様に高くなるので心しておいてくれ。<br />
<br />
spais さんの本題は一貫して「間違いは誰にでもある」「知ったかぶって間違った意見を貫き通すのは人に迷惑がかかるのでやめてほしい」だ。3回も繰り返し丁寧にご返信くださったので、読解力を鍛え中の方々にも非常にありがたかったと思うラブ&hearts;。spais さんについてオレはまったくご存じなかったが、リンクを探してたどればセクシャルなフレーズをオンライン上に散りばめるちょっとした変態さんだというのがすぐにわかるだろうラブ&hearts;。珍しく他人について語ったがこれは spais さんの人となりを理解する上で非常に重要なポイントであって、他人に意見をしているわけではない。説明だ。違いはわかるね？イチイチ言わんでも良いだろう。さらに今回のやり取りでわかったこともこっそり教えてあげる。</p>
<ul>
<li>あるフレーズをテキストとして書くときの「これはマズい／問題なし」のしきい値が異常に低い。つか、筒抜けに等しいラブ&hearts;。<br />
オレも「これはちょっとどうかな」ってフレーズは面白がって使うけども、スケールが違い過ぎる。無事に社会生活を営めているのかちょっと心配になるほどだラブ&hearts;。</li>
<li>人の言ってる事をあんまり聞いてないラブ&hearts; or ワザとポイントをズラして面白がっている。<br />
コレはスマンがさすがのオレでもドッチかわからん。
</li>
</ul>
<p><strong>バックグラウンドについて</strong>：
<br />チラリとブログを拝見したところによると、spais さんは自分はフォーラムで育ったとおっしゃっている。わざわざブログに書く程なので、それはもうフォーラムに対する思いが人一倍アツイのだ。だから「お世話になったと言いながら誠意のない回答をする」kz にコンタクトせずには居られなかったのだと理解できる。そして「エスケープが必要だとわかっていながらあえてしないとは何事だ？！」「間違ったことを謝りもせずグダグダ言い訳するとは何様じゃ？！」となったのである。多分。<br />
これほどアツイ思いを持った方が今の世の中にもいたことに懐かしさを感じ、そしてそれをそのまま遠慮なく書いてしまう尋常ならざる自由さに驚愕せずにはいられないラブ&hearts;。</p>
<p><br /><strong>セキュリティに関して</strong>：
<br />（ちゅうか本題は回答の仕方だし、そもそもアナタ誰？とは今回突っ込まないでおいてあげるラブ&hearts;。）<br />
スッキリとわかりやすくご説明いただいたので勉強になった方々も多いだろう。緩みは禁物、のヒタムキな姿勢は女性ファンの心をワシ掴みにするに違いない。ただしちょっとした変態さんなのでノーマルな方は気をつけてラブ&hearts;。<br />
<br />
プラグインを使ってのタクソノミー名の改ざんは、あ、なーる。で、そういうアレならダメですね。となる。勉強になりました、ありがとうございました。と kz の礼儀正しい対応により美しくトピック終了となるはずだったが、以降グダグダになってしまって経緯を見守っていた皆様には大変申し訳なかった。<br />
<br />
抜かりは許さん spais さんと、実際問題脅威レベル的に見たら別にええんちゃうんってしつこい kz とで話が噛み合ないのは、お仕事の仕方が違うからだと思われる。spais さんのお仕事が何かは知らないが、テーマを配布しているという事は、自分が作ったものを誰かが管理者権限で使うという状況に身を置いている。お仕事でもソッチ系なら、自分の信用問題になるので抜かりは許されんことになる。ちなみに kz が安易にテーマやプラグインを作って配布しないのは、誰が使うかわからないモノだからそういったことまでバッチリ配慮して抜かりないものを提供する、のがメンドクサイからだラブ&hearts;<br />
<br />
一方 kz はサイトサービスのお仕事をしている。サイトを制作してハイ納品、という切り売りはしない。後々までずっと面倒を見るのだ。管理者権限はオレ。サイトを利用されるお客様は作成者権限のみ。Ktai からの投稿だけ、ってお客様もいる。プラグインは超実績のある自分が内容を把握できる最小限のモノしか使わない。なお、オレは仕組みに興味があるわカスタマイズしたいわでプラグインのソースはひととおり読む。そしてテーマは使った事が無い。そんなん一番楽しいとこ、自分がやりたいやんか。<br />
もう察するセンスを持ったアナタは気づきましたね？オレが一切を管理しているので実質問題ないのだ。フォームから入ってくる値はコワイので気をつけているが、データベースに入ってる値はクリーンなのだ。なのだっていうかそれが当たり前だと思っていたのでタクソノミーの表示がなんで危険なの、っていう素朴な認識なのであった。<br />
<br />
セキュリティについてまとめると lilyfan さん，spais さんがおっしゃるようにフォーラムで誰がどう使うかわからないコードからは危険を排除しておいた方が良い。どこからきたデータも信用しない、のが抜かりない。おっしゃる通りだ。なので大変勉強になりました。ありがとうございました。と返信いたしましたなのである。よろしいでしょうか。<br />
とは言っても実際問題そこまでして XSS か？っちゅう点はそのままです。しつこい。<br />
<br />
このやりとりから学べることは、以下の通り。</p>
<p class="append">他人の置かれている状況を把握してない状態で話をしても噛み合ない。<br />
そんな状態で他人に対して意見を投げつけると危険。<br />
わかっていながら、っちゅーのは誤解やんか。もうしつこいラブ&hearts;。</p>
</p>
<p>さて、ここまで読んで「謝りもしねぇで後出しのフォローを書いてボクのことわかってよとはふざけたヤツだ」と思われた方、いらっしゃいますでしょうかラブ&hearts;。えーっとですね、そちらの方から順に今度はプールへ出ていただけますか。はい、50×1000で。よろしくお願いいたします。<br />
<br />
そろそろ疲れてきたのでまとめに入っていくぜ。spais さんのセキュリティに関するご意見はスッキリしてわかりやすいが、kz に対してのご意見になると何故だかまったく意味がわからない。わかる人がいらっしゃいましたらお手数ですがお知らせいただくと、横浜に向けての良い準備になりますのでヨロシクです。具体的にわからないところを挙げておきますね。</p>
<ul>
<li>【解決】わかっていながら不備のあるコードを...<br />
この類いは「知りませんでしたので大変勉強になりました。ありがとうございました。」で解決だよな？</li>
<li>上と同じだけども「知らなかったならいいんです。」「知りませんでしたので大変勉強になりました。ありがとうございました。」「知っていながら...」となる意味がわかりません。面白がってワザとだよねコレラブ&hearts;。</li>
<li>重要じゃないとこだけど「どんなフォーラムでも結局どうなんってゆートピックは役に立ったことが無い。」に対して「これも、フォーラムのバックグラウンドにいる人たちの事をなにも考えてないと思います。」はまったく意味がわかんないぜ。</li>
<li>何故「後付けフォロー」という認識になるのかわからない。</li>
<li>「僕のスタンスはこうだから理解してよ的」誰しも己の考えを述べておるぞ。お二方はオレにあーせいこーせい言うがオレは自分の考えを述べるにトドめている。単なる説明だ。読解力的な意味ではいい加減理解しろよとは思うが、ボクのことわかってよな受け取り方になるのがわかりませんラブ&hearts;。あーせいこーせい言わないタイプが初めてだから「相手に求めるナルシスト」に分類されるのでしょうかラブ&hearts;。</li>
</ul>
<h4>まとめ</h4>
<p>結局のところ、今回のケースでほとんどの方々が思ったのは「何でアナタ達そんなモノの言い方するんですか？」だろう。2人から回答すんなって言われた kz をかわいそうと思ったえびちゃんがいたかもしれないし、いい気味だと思った匿名さんがいたかもしれない。<br />
オレはオレに言われるコトバは受け流すけども（今回受け流していないのにはちゃんと理由がある、察しろ。）、ごく普通の方々に対して同じように接するのは相当キツイことだと思うぜ。普通の人にはしないよっちゅーのはハンパない誤解力のせいで説得力がないラブ&hearts;。例えば質問者に対する愛情に欠ける書き方なんかは、バックグラウンドにいる方々の心を引っ掻くこともあるだろうラブ&hearts;。例えば「知ったか」とか「安っぽいプライド」なんつー超刺激的なコトバは「Sっ気が強いので攻めてるっぽく見えるかもしれませんがそんなつもりはないです。」なんつー後付け自己弁護したって相手によっちゃ表出ろやっちゅー話になるぜラブ&hearts;。<br />
<br />
オレは知らん人相手にいきなりとか、唐突に刺激的なコトバを投げつける、のがそもそもコミュニティにとって迷惑違いますやろかな考えだぜラブ&hearts;。他人への敬意が無いし愛情も無いでしょ。なのに誰々のためとか迷惑をかけるなって話になってくると、これはコントか何かか？オレはなんでやねんって突っ込めばええんか？とか思っちゃうぜラブ&hearts;。<br />
<br />
コミュニティでは他人に対して意見はしないのがベストだとオレは思うけども、せずにいられない時は、どなた様もちったぁ口のキキ方に配慮すると諸々いいんでないかなってオレは思うよ。相手にもバックグラウンドにいる方々にも、自分自身にとってもね。<br />
コードの穴を抜かり無くフサいで誰にも迷惑をかけない配慮をするように、文章のトゲを抜かり無くナラして誰にも不快な思いをさせない配慮をするのも、コミュニティでは必要なことなんじゃないかな。コードの書き方以上にね。相手は感情のある人間だもの。オレはね、そう思うよ。<br />
ん、オレが他人に強要してるって？あの、グラウンドに行ってくれるかな。アッチの方。そうそうずっと向こうの方ね。</p>
<h4>最後に</h4>
<p>今回のケースを添削して美しくまとめてみるぜ。<br />
----------------------------------------------</p>
<pre><code>$taxonomy = $wp_query-&gt;get_queried_object();
echo $taxonomy-&gt;name;</code></pre>
<p>----------------------------------------------<br />
データベースに入れる時＆表示する時にエスケープすると完璧なので</p>
<pre><code>echo esc_html($taxonomy-&gt;name);</code></pre>
<p>とするとステキです。<br />
----------------------------------------------<br />
そうなのね！勉強になりました、ありがとう。<br />
----------------------------------------------<br />
どや、清々しいだろう！俺たちがグダグダ書いたトピックと見比べてみると良いぜ。</p>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/how-to-walk-on-a-forum/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/how-to-walk-on-a-forum" />
	</item>
		<item>
		<title>WordPressの投稿に複数のアップロード画像を一括挿入する</title>
		<link>http://wpxtreme.jp/insert-all-uploaded-images-simultaneously-into-the-post</link>
		<comments>http://wpxtreme.jp/insert-all-uploaded-images-simultaneously-into-the-post#comments</comments>
		<pubDate>Thu, 29 Apr 2010 13:50:32 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[TUTORIALS]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[upload]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=407</guid>
		<description><![CDATA[例えば記事中に画像を多く使うスタイルのブログでは、WordPress の「画像を追加」機能は少々操作が面倒です。アップロードは一括でできますが、「投稿に挿入」は1枚ずつしかできません。挿入後に「画像を追加」ウインドウが閉じてしまうのも手間を増やしています。「ギャラリー」で「1列」が指定できれば良さそうな気もしますが、本文が画像文章画像文章という構成だとギャラリーショートコードでは間に合いません。<br />
そこで「画像を追加」ウインドウに「一括挿入」的なボタンを追加して、画像をダラダラッと本文に挿入する機能を実現してみましょう。この機能はクライアントの <a href="http://www.artfactory-inc.com">ART FACTORY GRAPHICS</a> のサイトリニューアル時に絶対メンドクサイ言われるな、と対策したものです。過去ブログの大量データ移行にも大活躍でした。<br />
ところで、この機能のプラグインを作るという話題をうっかり twitter で見かけたのですけど、世の中にこんだけ人がいりゃぁ同じタイミングで同じ挙動もするだろう、と改めて B'z は Aerosmith をパクってなどいないと確信するに至りました。そう、夢は時間を裏切らないのです。<br />
なお、wpxtreme では <a herf="http://wpxtreme.jp/wordpress-show-random-images-attached-to-the-posts">非プラ三原則</a> に則ってそうそうプラグインは作らないのでヨロシクお願いいたします。<a class="excerpt-more" href="http://wpxtreme.jp/insert-all-uploaded-images-simultaneously-into-the-post">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>一括挿入ボタンを表示する</h4>
<p>なんだかんだ言っても見た目が大事、と なんでもかんでもカタチから入って結局長続きしないアナタに倣って、まずは「画像を追加」ウインドウに［すべての添付画像を投稿に挿入］ボタンを表示するだけ、にトライしてみましょう。ところでなんは何だけどかんは何なんだろうね？<br />
「画像を追加」ウインドウの一番下には［すべての変更を保存］という特に何をするでもない雰囲気のボタンがあります。このボタンを押すことで新たに何か保存されるものがあるのかどうか、これは皆へのGWの宿題にしておきますね。それでは捜査の基本に従って、まずは対象者の身辺を洗ってみましょう。</p>
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-1-620x436.jpg" alt="" title="一括挿入ボタン表示の手がかり" width="620" height="436" class="alignnone size-large wp-image-409" /></a>
［すべての変更を保存］ボタンが savebutton クラスを持つ p タグで囲まれてますね。次はこの「savebutton」を追跡します。皆さんのローカルにあるはずの WordPress のソース一式から「savebutton」を検索すると、どうやら wp-admin/includes/media.php <code>media_upload_type_form()</code> で出力しているようです。</p>
<pre><code>function media_upload_type_form($type = 'file', $errors = null, $id = null) {
　（略）
&lt;p class="savebutton ml-submit"&gt;
&lt;input type="submit" class="button" name="save" value="&lt;?php esc_attr_e( 'Save all changes' ); ?&gt;" /&gt;
&lt;/p&gt;
&lt;?php
}</code></pre>
<p>が、ここに追加出力できるようなフックは見当たりません。残念。<br />
では <code>media_upload_type_form()</code> の呼び出し元はどうでしょう。同じ media.php で <code>wp_iframe()</code> の引数に使われて呼び出されているようです。</p>
<pre><code>return wp_iframe( 'media_upload_type_form', 'image', $errors, $id );</code></pre>
<p><code>wp_iframe()</code> の最後の方で、<code>$content_func</code> という引数で受け取った <code>media_upload_type_form()</code> が呼び出されています。</p> 
<pre><code>function wp_iframe($content_func /* ... */) {
　（略）
  call_user_func_array($content_func, $args);  // ここで savebutton の HTML を出力
  do_action('admin_print_footer_scripts');
?&gt;
&lt;script type="text/javascript"&gt;if(typeof wpOnload=='function')wpOnload();&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;?php
}</code></pre>
<p>どうやら独自の HTML を出力できるのはその直下の <code>do_action('admin_print_footer_scripts')</code> のタイミングしか無さそうです。では、早速以下のような javascript でボタンを追加してみましょう。</p>
<pre><code>add_action( 'admin_print_footer_scripts', 'my_add_insert_all_images_button' );
function my_add_insert_all_images_button() {
?&gt;
&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
jQuery(document).ready(function($){
  $('p.savebutton.ml-submit')
    .append(
      '&lt;input type="submit" class="button" name="bulkinsert" value="&lt;?php esc_attr_e( 'Insert all images' ); ?&gt;" /&gt;'
    );
});
//]]&gt;
&lt;/script&gt;
&lt;?php
}</code></pre>
<p>はい、バッチリ表示できました。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-2.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-2-620x417.jpg" alt="" title="ボタンを追加" width="620" height="417" class="alignnone size-large wp-image-413" /></a>ところが、このボタンは「画像を追加」ウインドウの「コンピュータから」タブで画像をアップロードしたときにしか表示されません。［すべての変更を保存］ボタンの身辺をもう一度洗い直してみましょう。</p>
<ul>
<li>「コンピュータから」タブ<br />
p.savebutton.ml-submit &gt; input.button[name=save]</li>
<li>「URLから」タブ<br />
なし：以降、このタブについては無視する。</li>
<li>「ギャラリー」タブ<br />
p.ml-submit &gt; input#save-all.button.savebutton[name=save]</li>
<li>「メディアライブラリ」タブ<br />
p.ml-submit &gt; input.button.savebutton[name=save]</li>
</ul>
<p>これらの論理積っぽいセレクタを検討した結果、「画像を追加」ウインドウのすべての［すべての変更を保存］ボタンの隣に［すべての添付画像を投稿に挿入］ボタンを追加するには以下のようにします。</p>
<pre><code>$('p.ml-submit>input.button[name=save]')
  .after(
    '&lt;input type="submit" class="button" name="bulkinsert" value="&lt;?php esc_attr_e( 'すべての添付画像を投稿に挿入' ); ?&gt;" /&gt;'
  );</code></pre>
<p>無事、「画像を追加」ウインドウのすべての［すべての変更を保存］ボタンの隣に［すべての添付画像を投稿に挿入］ボタンを追加することができました。すべてボタンすべてボタンくどい。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-3.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-3-620x417.jpg" alt="" title="各タブにボタンを追加" width="620" height="417" class="alignnone size-large wp-image-415" /></a></p>
<h4>「画像を追加」ウインドウから本文にテキスト挿入、の仕組み</h4>
<p>ボタンを表示するだけでヒト苦労でしたね。カタチから入って長続きしない感じがよくわかりました。投稿本文中に添付画像の HTML を挿入するのは［投稿に挿入］［ギャラリーを挿入］ボタンの仕組みをパチれば OK でしょう。んでは、日頃からお世話になっている［投稿に挿入］ボタンの方が親近感があるので、こちらを調べることにします。だってオレ人見知りするし。なお、このボタンの <code>name="send[画像の ID ]"</code> という属性は重要な手がかりかもなので証拠として押収しておきます。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-4.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-4-620x417.jpg" alt="" title="iaui-4" width="620" height="417" class="alignnone size-large wp-image-423" /></a>
では、コレをクリックするとどういう流れになるのかを明らかにするために、まずは親から攻めてみましょう。コレを含む <code>form</code> タグの <code>action</code> 属性は</p>
<pre><code>action="http://example.com/wp-admin/media-upload.php?type=image&#038;tab=gallery&#038;post_id=投稿ID"</code></pre>
<p>のようになっています。パッと見 wp-admin/media-upload.php を調べても怪しいところはありませんが、最後に</p>
<pre><code>$type = strval($_GET['type']);
  :
$tab = strval($_GET['tab']);
  :
if ( $tab == 'type' || $tab == 'type_url' )
  do_action("media_upload_$type");
else
  do_action("media_upload_$tab");
</code></pre>
<p>という記述があります。そう言えば先ほどの <code>action</code> に <code>type=image&#038;tab=gallery</code> が指定されていました。このクエリ文字列とアクションの関係は以下の通り：</p>
<ul>
<li>「コンピュータから」タブ    ... type=image&#038;tab=type     ... media_upload_image アクション</li>
<li>「ギャラリー」タブ               ... type=image&#038;tab=gallery ... media_upload_gallery アクション</li>
<li>「メディアライブラリ」タブ ... type=image&#038;tab=library ... media_upload_library アクション</li>
</ul>
<p>ヤツらはこういった暗号を使って捜査の網をかいくぐっていたんですね。どうやら「ギャラリー」タブの黒幕は <code>media_upload_gallery</code> アクション、wp-admin/includes/media.php に潜伏している模様です。ところで<code>medhia_upload_なんちゃら</code> アクションは、wp-includes/default-filters.php には記述が無いんですね。これも我々の目を欺くためでしょう。<br />
え、admin 画面でしか使わないからじゃ ... と思ったキミは先入観で目が曇っておるよ。濁っておるのだよ。キミこそがオレの天使だ！最高の女だ！と思い込むのは勝手だが、世の中にはもっと最高な天使がゴロゴロいるので視野を狭めないようにな。それに、金品の授受により天使になってくれるあのコはウソもんなので本気になってはいけない。<br />
さて、<code>media_upload_なんちゃら</code> アクションは <code>media_upload_なんちゃら</code> ファンクションを実行するようになってますので当該のファンクションを調べます。</p>
<pre><code>function media_upload_gallery() {
  $errors = array();

  if ( !empty($_POST) ) {
    $return = media_upload_form_handler();
  :</code></pre>
<p>ん、こいつ <code>media_upload_form_handler()</code> 匂うな。しかも <code>media_upload_なんちゃら</code> ファンクションのすべてで <code> if ( !empty($_POST) ) { $return = media_upload_form_handler();</code> してやがる。どれ。</p>
<pre><code>function media_upload_form_handler() {
  :
if ( isset($_POST['send']) ) {
  $keys = array_keys($_POST['send']);
  $send_id = (int) array_shift($keys);
}
  :
if ( isset($send_id) ) {
  :
  $html = apply_filters('media_send_to_editor', $html, $send_id, $attachment);
  return media_send_to_editor($html);
}</code></pre>
<p>証拠品の <code>"send[画像の ID]"</code> から画像用の HTML を作成して <code>media_send_to_editor($html)</code> しておるな。どうやら <code>media_send_to_editor()</code> が HTML を editor つまり投稿本文に送っているということらしい。</p>
<pre><code>function media_send_to_editor($html) {
?&gt;
&lt;script type="text/javascript"&gt;
/* &lt;![CDATA[ */
var win = window.dialogArguments || opener || parent || top;
win.send_to_editor('&lt;?php echo addslashes($html); ?&gt;');
/* ]]&gt; */
&lt;/script&gt;
&lt;?php
  exit;
}</code></pre>よし、わかった。</p>
<h4>すべての添付画像の HTML を投稿に挿入する</h4>
<p>以下、仕様。</p>
<ul>
<li>media_upload_ なんちゃらアクションをひととおり先取りする。</li>
<li>［すべての添付画像を投稿に挿入］ボタンがクリックされていれば横取りする。<br />
これは isset( $_POST['bilkinsert']) で判断できる。</li>
<li>投稿に添付されている画像を取得する。<br />
投稿の ID は $_REQUEST['post_id'] で取得できる。
添付画像の ID の昇順＝先に添付した画像を先に出力する。</li>
<li>画像の HTML をお好みで作成する。</li>
<li>media_send_to_editor() で本文に挿入！</li>
</ul>
<p>以下、コード。</p>
<pre><code>add_action( 'media_upload_image', 'my_bulk_insert', 1);
add_action( 'media_upload_gallery', 'my_bulk_insert', 1);
add_action( 'media_upload_library', 'my_bulk_insert', 1);
function my_bulk_insert() {
  if ( isset($_POST['bulkinsert']) ) {
    $postid = $_REQUEST['post_id'];
    $images = get_children(array(
      'post_parent' =&gt; $postid,
      'post_type' =&gt; 'attachment',
      'post_mime_type' =&gt; 'image',
      'order' =&gt; 'ASC',
      'orderby' =&gt; 'ID'
    ));
    $html = '';
    if($images){
      $ids = array_keys($images);
      $first = true;
      foreach((array)$ids as $id){
        if($first)
          $first = false;
        else
          $html .= '&lt;p&gt;&lt;br class="spacer_" /&gt;&lt;/p&gt;';
        $html .= wp_get_attachment_link($id, 'large');
      }
    }
    return media_send_to_editor($html);
  }
}</code></pre>
<p>以下、実行結果。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-5.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/iaui-5-620x663.jpg" alt="" title="実行結果" width="620" height="663" class="alignnone size-large wp-image-430" /></a></p>
<h4>CONCLUSION</h4>
<p>お待ちかねのまとめソースです。日本人ってまとめ記事とか大好きだよね。以下を functions.php に貼り付ければ OK だぜ。エクケープ忘れとかあったらよきにはからってくれ。</p>
<pre><code>add_action( 'admin_print_footer_scripts', 'my_add_insert_all_images_button' );
function my_add_insert_all_images_button() {
?&gt;
&lt;script type="text/javascript"&gt;
//&lt;![CDATA[
jQuery(document).ready(function($){
  $('p.ml-submit>input.button[name=save]')
    .after(
      '&lt;input type="submit" class="button" name="bulkinsert" value="&lt;?php esc_attr_e( 'すべての添付画像を投稿に挿入' );   ?&gt;" /&gt;'
    );
});
//]]&gt;
&lt;/script&gt;
&lt;?php
}

add_action( 'media_upload_image', 'my_bulk_insert', 1);
add_action( 'media_upload_gallery', 'my_bulk_insert', 1);
add_action( 'media_upload_library', 'my_bulk_insert', 1);
function my_bulk_insert() {
  if ( isset($_POST['bulkinsert']) ) {
    $postid = $_REQUEST['post_id'];
    $images = get_children(array(
      'post_parent' =&gt; $postid,
      'post_type' =&gt; 'attachment',
      'post_mime_type' =&gt; 'image',
      'order' =&gt; 'ASC',
      'orderby' =&gt; 'ID'
    ));
    $html = '';
    if($images){
      $ids = array_keys($images);
      $first = true;
      foreach((array)$ids as $id){
        if($first)
          $first = false;
        else
          $html .= '&lt;p&gt;&lt;br class="spacer_" /&gt;&lt;/p&gt;';
        $html .= wp_get_attachment_link($id, 'large');
      }
    }
    return media_send_to_editor($html);
  }
}</code></pre>
<p>コードだけ見ると結構短いが、ここに到達するまでには地道な捜査と検証を毛が抜ける思いをしながら繰り返しているのだ。キミがお手軽便利に使っているそのプラグイン、仕上げるまでにどれほどの労力が費やされているか。そのサポートにどれほどの労力を費やさなければならないか。そういったことを少し考えてみると、改めて、感謝せずにはいられなくなるだろう。<br />
感謝のカタチはそれぞれで良い。寄付（ドネーション）も良いし、パッチやアイデアの提供でも良い。毎晩ありがとうございますとプラグイン作者に祈るのも、まぁ、良いかもしれん。そして、いつかは与える側になって欲しい。それがお世話になったコミュニティへの最大の恩返しになる。そういう流れを繰り返すと世の中はどんどんキレイになっていくのだ。ステキやん。<br />
最後に、恩知らずはロクな死に方をしない、とだけ言っておこう。</p>
<h4>プログラムを作る仕事に就きたい皆さんへ</h4>
<p>ん、全然最後になっとらへん。<br />
仕様仕様と偉いさんは口にするが、そんなものは実在しない。キミのかわいい彼女と同じだ。マボロシなのだよ。いいかい、現場ではソースコードがすべてだ。なので、今のうちにソースを読み解く力をつけておくと良い。<br />
どうやってそんな力をつければいいんですか、ってそりゃアンタ人の書いたコード読み倒しゃぁええがね。世の中にはオープンソースと呼ばれる、世界中のステキな開発者達が書いたコードがそこら中に転がっている。超絶クールなコードもなにこれウンコなコードもあるだろう。何でもいいから読み倒すのだ。WordPress なんて読んで試してがヤリたい放題だぜ。猿並みに限度を知らない思春期のキミにはうってつけだ。<br />
そしてキミが男性なら、もっと女性と接すると良い。話し易いあんまり女っぽくないコじゃダメだぜ。話しかけ難い超イカすあのコ、そうムラムラしちゃうあのコだ。そういうえびちゃんとどう接すると良いかは、今まで wpxtreme で散々説明しているので改めて全記事を読み直すと良い。GW だから時間はたっぷりあるだろう。で、どんなコだろうとメロメロにさせることができるようになれば、何故だかソースを読むセンスが養われていることに気づくはずだ。<br />
読み解く力とは察する力である。察する力を身につけるには女性と接するのが良い。世の中にえびちゃんほどわけのわからんものはないのだ何の話だ。</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 2.9.2</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/insert-all-uploaded-images-simultaneously-into-the-post/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/insert-all-uploaded-images-simultaneously-into-the-post" />
	</item>
		<item>
		<title>Twitter＠Anywhereの使い方WordPress編</title>
		<link>http://wpxtreme.jp/how-to-use-twitter-at-anywhere-with-wordpress</link>
		<comments>http://wpxtreme.jp/how-to-use-twitter-at-anywhere-with-wordpress#comments</comments>
		<pubDate>Sun, 18 Apr 2010 15:31:39 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[HOW-TO]]></category>
		<category><![CDATA[anywhere]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=295</guid>
		<description><![CDATA[Twitter が発表した <a href="http://dev.twitter.com/anywhere/">@Anywhere</a>、各種サービスがこぞって取り入れることでどんな風に WEB が変わっていくのかとても楽しみです。Google が連発するマイナーサービスのように出ては消え、なんてことにはならないといいですね。<a href="http://dev.twitter.com/anywhere/begin">Getting Started</a> の翻訳記事もチラホラ出てきましたが、こういうところに書いてあるサンプルやドキュメントなどは、始まったばかりのサービスならなおさら、だいたい内容が意味不明です。平気でウソも書いてありますが、訂正されることはあまりありません。<br />
なので、良識ある wpist の皆さんは原文や日本語になった記事を読んだだけで納得してしまわないように。見聞きしただけでその世界がわかった気になるのはクラブのおねーちゃん達の得意技です。皆には目先の欲望に振り回されず、その浅さを愉しむ大人になって欲しい。<br />
そういったわけで wpxtreme では現場第一主義を貫き、実際にやってみたちゃんと動く @Anywhere の使い方を長々とお届けします。<a class="excerpt-more" href="http://wpxtreme.jp/how-to-use-twitter-at-anywhere-with-wordpress">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>まずは API キーを取得しよう</h4>
<p>Twitter の機能がラクチン API でボク達のサイトでも利用できるようになるという夢の @Anywhere。まずは「http://example.com ってサイトで使いますよ」っていうことを Twitter 様に申し出る必要があります。そうすると Twitter 様から「じゃぁ、お前んとこはこの API キーを使え」と呪文（APIキー）を授けられます。これはヨソのドメインでは使えません。めんどくさいですがイイナリになるしかないのでこの手順を踏む必要があります。</p>
<p><a href="http://dev.twitter.com/anywhere/apps/new">New Twitter Application</a> をクリックすると以下のような画面になります。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/anywhere-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/anywhere-1-620x601.jpg" alt="" title="New Twitter Application" width="620" height="601" class="alignnone size-large wp-image-383" /></a></p>
<ul>
<li>Application Name：サイトの名前</li>
<li>Application Website： サイトのURL</li>
<li>Callback URL：とりあえず同上で OK</li>
<li>Application Icon：72x72くらいでどうでしょう（指定しなくても OK）</li>
<li>CAPTCHA：2単語読んで</li>
</ul>
<p>のように必要事項を入力して［Register application］ボタンをクリックすると利用規約のウインドウが表示されるので［Accept］ボタンをクリックします。無事登録完了すると以下のような画面になります。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/anywhere-2.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/anywhere-2-620x381.jpg" alt="" title="@Anywhere Setup" width="620" height="381" class="alignnone size-large wp-image-384" /></a>サンプルコードの <code>id=なんちゃら</code> が API キーなのでメモっておくように。どうせ HTML ソースに丸出しになるのでモザイクをかける必要も彼女に内緒にしておく必要もありません。</p>
<p>これで自分のサイトで @Anywhere を使う準備ができました。</p>
<h4>WordPress で利用するには</h4>
<p>functions.php に以下を追加して、@Anywhere のスクリプトと @Anywhere を使用するアナタのスクリプトを読み込ませます。<code>wp_enqueue_script()</code> だと @Anywhere の URL の最後に <code>&amp;ver=2.9.2</code> とか WordPress が勝手に付けますが<del>ちゃんと動作しますのでご安心ください</del> WebKit系でちゃんと読めないようなので <code>echo</code> に変更。</p>
<pre><code>add_action('wp_print_scripts', 'my_enqueue_scripts');
function my_enqueue_scripts(){
/*
  wp_enqueue_script( // @Anywhere のスクリプト
    'twitter-anywhere', 
    'http://platform.twitter.com/anywhere.js?id=アナタのAPIキー&amp;v=1',
    array(), false, true
  );
*/
  echo '&lt;script src="http://platform.twitter.com/anywhere.js?id=アナタのAPIキー&amp;v=1" type="text/javascript"&gt;&lt;/script&gt;';

  wp_enqueue_script( // @Anywhere を使うアナタのスクリプト
    'my-script', 
    'http://example.com/〜/my-script.js',
    array(/* 'twitter-anywhere' */), false, true
  );
}</code></pre>
<p>WprdPress で、っていうのはコレだけなので詐欺的な記事タイトルですね。</p>
<h4>さぁ、始めるよ！</h4>
<p>@Anywhere は jQuery ライクな 使い方ができる API です。my-script.js とかなんとかを作成して以下のような書き方で利用すると良いでしょう。</p>
<pre><code>jQuery(document).ready(function($){
  var myTwitter;                 // オレ達が使う Twitter オブジェクト用変数。

  // @Anywhere を初期化。初期化完了後は onAnywhereLoad をコールバック！
  twttr.anywhere(onAnywhereLoad /*, ウインドウコンテキストも指定可能 */);
  
  // @Anywhere 初期化コールバック。オレ達専用の初期化はここで行う。
  function onAnywhereLoad(twitter){
    myTwitter = twitter;         // オレ達用に @Anywhere から授けられた Twitter オブジェクトを保存しておく。
    myTwitter.linkifyUsers();
    myTwitter('.hovercards-target').hovercards();
    myTwitter('.follow-kz').followButton("kzxtreme");
    /* ... などなど、お好みの初期処理を記述 */
  }

  // myTwitter を使っていつでもどこでも @Anywhere を利用できます。
  // クリックされる度に指定ユーザーのフォローボタンを追加
  $('.add-follow-button').click(function(){
    myTwitter('.follow-user').followButton($('input#user-to-follow').val());
    return false;
  });
});</code></pre>
<p>anywhere.js を読み込むと twttr オブジェクトが使えるようになります。<code>twttr</code> は 初期化とかサインアウトとかを行うための、ボク達が色々イジくれるオブジェクトとは別次元に存在するオブジェクトです。<br />
まず始めに <code>twttr.anywhere()</code> で @Anywhere を初期化します。引数にはコールバック関数 <code>onAnywhereLoad()</code> を指定し、ソコで自分の初期化処理を行います。一部のウインドウコンテキストでのみ @Anywhere を使いたい場合は、第2引数にソレを指定します。未指定の場合は、現在のページがまるっと対象です。<br />
<code>onAnywhereLoad()</code> で受け取った <code>twitter</code> がボク達が色々イジくれる Twitter オブジェクトです。上のコードのように myTwitter に Twitter オブジェクトを保存しておけば <code>onAnywhereLoad()</code> の外でも使うことができて便利ですね。ただし実際にお外で使うときは、オブジェクトが null だか undefined じゃないことをまず確認しましょう。<br />
この Twitter オブジェクトには jQuery のセレクタと同様に操作対象となる DOM 要素を指定することができます。</p>
<ul>
<li>myTwitter.linkifyUsers()<br />
linkifyUser() の対象は myTwitter のウインドウコンテキスト全体（ページ全体）。</li>
<li>myTwitter('.linkify-target').linkifyUsers()<br />
linkifyUser() の対象は myTwitter のウインドウコンテキスト内で linkify-target クラスを持つ DOM 要素以下すべて。</li>
</ul>
<p>ただし、このセレクタは <code>twttr.anywhere()</code> で初期化を行う前の DOM要素しか見ていません。<code>twttr.anywhere()</code> 以降に javascript で追加された DOM 要素はセレクトしてくれないので注意してください。</p>
<h5>Linkify - ユーザー名を自動でリンクさせる</h5>
<p>例えば ページ中のテキストに @kzxtreme のような Twitter ユーザー名があれば、それに Twitter ユーザーページへのリンクを付けてくれる。以下の文章をよく読んで linkify ! リンクをクリックしてみよう。@kzxtreme 他がリンクされるぞ。変化の瞬間を見逃さないようにね。</p>
<p class="linkify-target append">この文章には class="linkify-target" が指定されているので、この @kzxtreme にリンクが付けられるはずだ。大文字小文字は関係ない @KzXtReMe。存在しないユーザー名でもリンクする @sonnnayatu_ine_yo。非twitter ユーザー名 @ab-bc @オレ様 だとどうなるかは己の目で確かめて欲しい。@Anywhere の動向については @anywhere をフォローすると良いぞ。wpist なキミは @jawordpressorg  もマストだ。</p> 
<p>では、心を無にして、レッツ <a href="#" class="linkify">linkify！</a><br />
<br />
どうだね！非常に地味だろう！ linkify はちょっと便利だけども、たかがリンクを張るだけなのでイマイチ面白くない。真面目過ぎてツマランのだ。視野がチョー狭い思春期ならともかく、大人ならもっと遊び心が欲しい。それが大人の余裕。私年上じゃないとダメなの、というえびちゃんの真意を読み取ろう。この linkify のサンプルは以下のようなコードで実現している。</p>
<pre><code>$('.linkify').click(function(){                 // linkify クラスをもつ DOM 要素がクリックされた！
  myTwitter('.linkify-target').linkifyUsers();  // twttr では linkifyUser() はできんのだよ ...
  return false;                                 // このクリックのイベントはここで終わらせてくれ。
})</code></pre>
<p>日本語で説明すると linkify クラスを持つアンカーリンクがクリックされたときに「linkify-target クラスを持つ DOM 要素以下すべてに対して <code>linkifyUsers()</code> を実行」してユーザー名のリンクを作成しています。<br />
なお、実際にはこのように閲覧者のアクションで linkify することはないはずなので、初期化のコールバック関数内で始めから <code>linkifyUsers()</code> しちゃいましょう。</p>
<h5>コネクトしよう</h5>
<p>以降のサンプルがフルで動作するためには、今まさにキミがウチのサービスにサインイン（ログイン）＝Twitter にコネクトしている必要がある。していなくても必要になったらサインイン的コネクトウインドウが出てくるのでヨロシク。コネクトのためのボタンは <code>connectButton()</code> を使って以下ようなコードで表示する。</p>
<pre><code>myTwitter('#signin-anywhere').connectButton({
  authComplete: function(signedInUser){  // コネクト／サインイン完了後のコールバック
    /* 好きなことができます */
  }
});</code></pre>
<p>これで id が signin-anywhere の DOM 要素内にボタンが表示される。コネクト／サインイン後に何もしない＝ボタンの表示だけなら、<code>authComplete</code> オプションなしで単に <code>myTwitter('#signin-anywhere').connectButton()</code> などとすれば OK。なお、原文には <code>signOut</code> っていうオプションでユーザーがサインアウトしたときに何かやれまっせ的なことが書いてあるが、そんなイベントは今のところ発生しないぞ？</p>
<div class="append">
<p id="to-current-user"></p>
<p id="signin-anywhere"></p>
</div>
<p>アンコネクト／サインアウトのためのボタンは提供されないが、<code>twttr.anywhere.signOut()</code> を実行すればサインアウトできる。ので以下のように何かのクリックイベントで呼んでやれば良い。クリックしてもシー・・・ンとしてるので親切な方は「サインアウトしましたよ」とか表示してあげてください。</p>
<pre><code>$('.signout-anywhere').click(function(){
  alert('signout しますー');
  twttr.anywhere.signOut();
  return false;
});</code></pre>
<p class="append">右のリンクをクリックするとサインアウトします... <a class="signout-anywhere" href="#">【サインアウトする】</a></p>
<p>サインインしたりサインアウトしたりコネクトしたりアンコネクトしてみるが良い。非コネクト状態でこの記事を一通り読んだ後で、コネクトしてからこのページの表示を更新するとまた違った世界が見えてくるはずなのでぜひお試しください。</p>
<p>ところで、ユーザーがコネクト／サインインしているかの判定やユーザー情報の取得方法を説明している <a href="http://dev.twitter.com/anywhere/begin">Welcome to @Anywhere | dev.twitter.com</a> の Working with the current user にある以下のサンプル（一部）は 2010.4.18 16:00 現在ウソなので信用しないように。</p>
<pre><code>if(twitter.isConnected) {
  currentUser = twitter.User.current;
  screenName = currentUser.data('screen_name');</code></pre>
<p>以下がこのコードの具体的な真実だ。</p>
<ul>
<li>twitter.isConnected はいつでも true。だって関数だもの。isConnected() だろ。</li>
<li>twitter.User は attributes を設定するファンクション。current なんて無い。</li>
<li>data なんてファンクションは無い。</li>
</ul>
<p>正しくは、現在の（コネクト／サインインしている）ユーザーの情報は以下のように取得する。</p>
<pre><code>if(myTwitter.currentUser)
    screenName = myTwitter.currentUser.attributes.screen_name;
    profileImage = myTwitter.currentUser.attributes.profile_image_url;</code></pre>
<p>サインインしているコネクテッドなキミならわかると思うが、上に表示されているキミの情報が <code>Twitterオブジェクト.currentUser</code> で取得できる。それに続けて <code>.attributes.screen_name</code> などとたどれば必要な値を取得することができる。例えば、現在コネクト／サインインしているユーザーのプロフィール／自己紹介の内容なら以下のようにすれば OK。</p>
<pre><code>myTwitter.currentUser.attributes.description</code></pre>
<p class="append">アナタの自己紹介を <a class="get-info" href="#">取得する</a><br /><span class="your-info">[your info]</span></p>
<h5>Hovercards - ユーザー名にホバーするとツールチップが！</h5>
<p>次は linkify よりちょっとワクワクするぜ。先ほどの linkify されたユーザー名にマウスポインタをマウスオーバー（長いので以降ホバー）させると、ユーザの公開情報がイカしたツールチップで表示されるのだ。そのツールチップのことをホバーカードと呼ぶ。商標取るなら今のうちだぜ。では早速下の @kzxtreme にキミのマウスポインタをホバーさせてみて right now !</p>
<p class="hovercards-target append">この @kzxtreme にレッツホバー！</p>
<p>どうだね！ちったぁ オォッ ってなったかね！ツールチップ内の「もっと読む ...」をクリックするとさらに詳細な情報が表示させるぜ。<code>hovercards()</code> では指定の DOM 要素内をまず linkify して、そのホバーイベントで ajax なツールチップを表示させている。こ、これがマッシュアップってやつか！違うな、ハッシュドポテト食べたい。こういうオシャレなことがしたかったら、以下のようなコードを我らがイニシャライザーコールバック <code>onAnywhereLoad()</code> に追記します。hovercards で 1 語だから c は小文字でヨロシク。</p>
<pre><code>myTwitter('.hovercards-target').hovercards();</code></pre>
<p>とくに DOM 要素を限定せずページ全体に適用したい場合は <code>myTwitter.hovercards()</code> で OK。この hovercard は対象リンクが画面上のどこにあっても、リンクの上下いずれかシックリくる方に表示される。ステキ。</p>
<h5>素のユーザー名以外でもホバーカードできる？</h5>
<p>はい、私達はアナタが好き勝手に書いたリンクテキストや画像や、そしてリンクもクソも無い素のテキストにさえも ホバーカード を使えるように設計しました。すばらしい、そういった心配りがあるから Twitter はバブリーな存在になれるのだ。例えば既にリンクとなっている文章がユーザー名を含んでいる場合は、<code>hovercards()</code> の <code>infer</code> オプションに <code>true</code> を指定する。</p>
<pre><code>myTwitter('.hovercards-target-infer').hovercards({
  infer: true
});</code></pre>
<p><code>onAnywhereLoad()</code> でこんな風に書いておけば、下の <code>class="hovercards-target-infer"</code> なオレ様のアンカーリンクでもホバー時に hovercard が表示される。</p>
<p class="append"><a class="hovercards-target-infer" href="#">リンク内のテキストの一部に @kzxtreme なんてユーザー名を含む場合もOK</a></p>
<p>うむ、使いどころがよくわからんぞ。リンクテキスト内のユーザー名捜索には正規表現を使っているとのことです。</p>
<p class="append"><a class="hovercards-target-infer" href="#">えっ、じゃぁ @jawordpressorg @kzxtreme みたいにユーザー名が複数ある場合は？</a></p>
<p>始めに一致するユーザー名が hovercard の大賞おめでとう、ちゃう、対象になります。</p>
<p>次にユーザー名を含まないテキストや、もはやテキストですらない画像であってもホバーカードはご利用可能です。VISA/MASTER カードに迫る勢いだね。キタるべきカード至上社会に備えよ！ワンランク上を行く大人のステイタス、ホバーカード。まずはイメージから。</p>
<p class="append" style="overflow:hidden;"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/01/atavar_kz1-150x150.png" alt="recent kz" title="kzxtreme" width="150" height="150" class="hovercards-target-image alignleft size-thumbnail wp-image-145" />やぁ！オレは kz。<br />もうさすがに WEB 3.0 とか言い出すヤツはいないと思ってるよ！<br />ところで、そろそろ「なんで今ドキえびちゃんなんですか？」っていうご意見があっても良さそうなんだけど、一向に無いってことはまだまだえびちゃんはアツイってことなんだね。<br />ちなみに、はてブ的にはこのサイトのキーワードは「WordPress, えびちゃん」だ。計画通り。</p>
<p>こういう場合は <code>hovercards()</code> の <code>username</code> オプションにユーザー名を指定すれば OK。パンが無ければケーキでいいじゃないの法則です。以下のようにオプション値にファンクションを書いてさんざん好きなことをした後で、思い出したように return でユーザー名を返しても良いです。</p>
<pre><code>myTwitter(".hovercards-target-image").hovercards({
    username: function(node){  // ファンクションにすると「この」DOM要素のオブジェクトを受け取れる。  
      /* do stuff */
      return node.title;       // img 要素なら title 属性にユーザー名を指定しておくと良いね！
    }
});</code></pre>
<p>ん、title 属性の値をヒント表示するブラウザだと、ウザい。では素テキストの場合。通常は太字にしたり色変えたりしないとホバーカードが出てくるなんて誰も気づかんのでご注意ください。以下、サンプルのご利用方法：</p>
<ul>
<li>「けーずぃーえくすとりぃーむ」にホバー！</li>
<li>何も起こらない ...</li>
<li>「ホバーカード対応させる！」のリンクをクリック</li>
<li>黄色くなった ...</li>
<li>怪訝な表情で再度「けーずぃーえくすとりぃーむ」にホバー</li>
<li>おおぉ「けーずぃーえくすとりぃーむ」がホバーカード対応されておる！</li>
<li>嬉しくって何度もホバー</li>
<li>「ホバー！」だらけ</li>
</ul>
<p class="append"><span class="hovercards-target-text">けーずぃーえくすとりぃーむ</span><br />
<a class="hovercards-text" href="#">上のテキストをホバーカード対応させる！</a></p>
<p>これは、以下のような jQuery を用いた javascript プログラミングで実現されています。</p>
<pre><code>$('.hovercards-text').click(function(){
  $('.hovercards-target-text').css('color', 'yellow');
    myTwitter('.hovercards-target-text').hovercards({						
      username: function(node){
        $(node).append('  ホバー！');
	return 'kzxtreme';
      }
    });
    return false;
  });
</code></pre>
<h5>あなたのそばに、フォローボタン</h5>
<p>今までは、一般の方はサイト上で follow me とか言っても twitter.com/ユーザー名 へのリンクを張るのが精一杯でしたが、@Anywhere の登場によって 本物の「フォローする」ボタンを表示させることができるようになりました。見た目は諸々の状態によって変化します。このボタンは iframe の中にいるのでデザインは 変更できません。よね？</p>
<p class="append">オレをフォローするボタン <span class="follow-kz"></span> フォローしたり解除したりしてみて。<br />
<br />
@jawordpressorg をフォローするボタン <span class="follow-jawp"></span> もうフォローしてるよね？<br />
<br />
@jpwordpressorg をフォローするボタン <span class="follow-jpwp"></span> そんなユーザーはいません。<br />
<br />
ここ <input type="text" id="user-to-follow" /> にユーザー名を入力して、<br />
フォローするボタンを <a class="add-follow" href="#">追加</a> ... <span class="follow-user"></span></p>
<p>Twitter 上での動作通り、ボタンをクリックすると確認無しでフォローします。ログインしてない場合は、まずログインウインドウが表示されます。なお、自分をフォローするボタンをクリックすると［Can't follow @kzxtreme］な disabled ボタンに変わります。ちぇっ。</p>
<h5>Tweet Box</h5>
<p>下のツイートボックスからダイレクトにつぶやけます。アプリケーションはこのサイトなので「wpxtremeから」のツイートとなるんですよ、ワォ！</p>
<div id="tweet-box"></div>
<p class="append"><span id="tweeted-text">（ここにつぶやいた内容が表示されます。）</span></p>
<p>これも簡単、サンプルコードは以下のとおり。</p>
<pre><code>myTwitter("#tweet-box").tweetBox({
  counter: true, // あと何文字ですよの表示の有無
  height: 100,
  width: 620,
  label: 'レッツツイート！',
  defaultContent: 'ツイートボックスに予め入力しておく文字列',
  onTweet: function(tweet, renderedTweet){
    $('#tweeted-text').html(renderedTweet);
});</code></pre>
<p><code>onTweet</code> にはツイート完了後の処理を書くことができます。引数の <code>tweet</code> は生のつぶやき、<code>renderedTweet</code> はマークアップされたつぶやきです。サンプルではツイート後に <code>id="tweeted-text"</code>の DOM 要素内へマークアップされたつぶやきを放り込んで表示しています。</p>
<h4>CONCLUSION</h4>
<p>以上、ナガナガと説明しましたがコレこそが今 @Anywhere でちゃんと動くサンプルです。どうせまたコロコロ変わると思うので、うまく動かないうまく動かないうまく動かないと悩まなくてもよろしい。あんまりクヨクヨするとハゲるぜ。<br />
ドMなアナタは <a href="http://platform.twitter.com/js-api.html">@Anywhere documentation</a> を頼りに試行錯誤して悶絶してみるのもいいだろう。</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>@Anywhere 1</li><li>WordPress 2.9.2</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/how-to-use-twitter-at-anywhere-with-wordpress/feed</wfw:commentRss>
		<slash:comments>72</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/how-to-use-twitter-at-anywhere-with-wordpress" />
	</item>
		<item>
		<title>WordPress3.0beta1でカスタム投稿タイプを具体的に使う</title>
		<link>http://wpxtreme.jp/how-to-use-custom-post-types-in-wordpress-3-0-beta1</link>
		<comments>http://wpxtreme.jp/how-to-use-custom-post-types-in-wordpress-3-0-beta1#comments</comments>
		<pubDate>Sun, 11 Apr 2010 19:55:52 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[HOW-TO]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[custom]]></category>
		<category><![CDATA[post]]></category>
		<category><![CDATA[taxonomy]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=269</guid>
		<description><![CDATA[<a href="http://ja.wordpress.org/releases/#beta">WordPress 3.0 ベータ1 の日本語版</a> がリリースされ、インストールしてイジり始めた人も多いことでしょう。皆は MU との統合でサイトの複数運営が簡単になりそうねな「ネットワーク」に気がいってしまってるようだが、実際の現場で重宝されるのは圧倒的に <strong>カスタム投稿タイプ</strong> に違いないのである。多いに活用されるか否かはネーミングに因るところが大きい、ということは <a href="http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3">以前ご説明差し上げましたとおり</a> タクソノミーが証明しているのだ。それにしても「ネットワーク」か ... 遠いな。<br />
3.0 で一介のブログシステムから本格 CMS へと大きく変貌を遂げる WordPress は、3年後をメドに「前田さんとこの WordPress テーマって有料らしいわよ！」「んまぁ！見かけによらず大胆ねぇ」とご近所のおばちゃん達のヒソヒソ話でも話題になるほどメジャーな存在として認知される予定である。そのための大きな役割を担うのが <strong>カスタム投稿タイプ</strong> なのだ。今回はその <strong>カスタム投稿タイプ</strong> がどれほどの力を秘めているのか、チョー具体的に解説しよう。いつものような変態的カスタマイズはありませんので女性はもちろんお子様にも安心してご覧いただけます。<a class="excerpt-more" href="http://wpxtreme.jp/how-to-use-custom-post-types-in-wordpress-3-0-beta1">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>3.0 以前</h4>
<p>昔は本気でこんなことしてたんだねぇ、ほぇー。と懐かしむことになるであろう現在のありがちなツクリを例に挙げてみよう。</p>
<blockquote>ブログを始めたえびちゃんは、お仕事で撮影したヘアスタイルをブログに載せたいとナジミの wper にオネダリしてみた。もちろんブログ（日記）の一投稿としてではなく、別途ヘアスタイルカタログ的なものを望んでいる。さらには「ロング，ウェーブ」などの情報も付けたいし「お気に入り度」も欲しいと言う。</blockquote>
<p>ボクが欲しいのはキミだけなのに、とかグジグジ思ってはいけない。欲しがったら負けだ。オマエを選んでやってもいいぜ？くらいの気持ちで臨むのがよろしい。そんなわけで、例えキミが wpist であっても 3.0 以前では以下のようにするしか無かった。</p>
<ul>
<li>投稿のカテゴリーに「ヘアスタイル」を追加。</li>
<li>ヘアスタイルを投稿する時は「ヘアスタイル」カテゴリーを選択。</li>
<li>「ロング，ウェーブ」はタグを利用。</li>
<li>「お気に入り度」はカスタムフィールドを利用。</li>
</ul>
<p>こうするしか、無かったんだ。しかしそれはキミの都合、そして WordPress 3.0 以前の都合です。えびちゃんは「なんでヘアスタイルが投稿なのよ！なんで日記書くときにお気に入り度とか出てくんのよ！バッカじゃないの？！」とこっちの苦労も考えず好きなこと言いやがります。<br />
ですが、おっしゃることはごもっともなのです。作り手の都合を使う側に押し付けてはいけません。「投稿を新規追加してカテゴリーのヘアスタイルにチェックを入れて投稿のタグにヘアスタイル関連タグを入力してカスタムフィールドの名前からお気に入り度を選択して値に数値を入れて更新ボタンをクリックして...」なんて呪文を唱える方がイカれてるんです。エンジニアでもない人にヘルプ読めとか言う方が何もわかっとらんのです。DIGA の字幕の ON/OFF の仕方がワケわからんぞまったく。<br />
各種デザイナー＆デベロッパーの皆さんは、使う人が何も説明されなくても自然と使えてしまう、のがベストなのだと気づきましょう。</p>
<h4>3.0 ならこんな風</h4>
<p>※以降の内容は beta1 を元に説明しておりますので、正式リリースでは事情が変わるかもしれません。なんてことは今後ともイチイチ書かないのでその辺はよきにはからってください。<br />
で、3.0 ならどうなるのかと言いますと。</p>
<ul>
<li>投稿，ページと同レベルで「ヘアスタイル」を扱える。</li>
<li>「ヘアスタイル」を編集，新規追加できる。</li>
<li>「ヘアスタイル」に専用の「ロング，ウェーブ」的分類ができる。</li>
<li>「ヘアスタイル」に専用の「お気に入り度」を追加できる。</li>
</ul>
<p>見た方が早いですね。まずは「ヘアスタイル（Hair Styles）」の一覧表示画面です。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/cpt30b1-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/cpt30b1-1-620x228.jpg" alt="" title="カスタム投稿タイプの記事一覧画面" width="620" height="228" class="alignnone size-large wp-image-285" /></a>おぉぉ、イカしてますね。この一覧表示の各カラムも自由にデザインできますので色々夢が膨らみます。なお「ヘアスタイルの分類」はこの「ヘアスタイル（Hair Style）」専用のタクソノミーです。<a href="http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3">カスタムタクソノミーの記事で言ってたカスタム投稿タイプとの絡み</a> がこれなんですねー。では次に「ヘアスタイル（Hair Style）」の編集画面。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/cpt30b1-21.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/04/cpt30b1-21-620x373.jpg" alt="" title="カスタム投稿タイプの記事編集画面" width="620" height="373" class="alignnone size-large wp-image-290" /></a>すばらしい。通常の「投稿の編集」で表示されるメカメカしたメタボックス群もありませんね。これなら使い方をイチイチえびちゃんに説明しなくてもわかってくれます。グダグダ言わずにこのようにあっさり鮮やかに対応するのが男なのさ。<br />
カスタム投稿タイプのおかげでより自由度が高くなっているのに、使う人にも作る人にも優しくなっているのは流石です。3.0 以前の中途半端な実装については不問といたしましょう。やっててよかった WordPress。やはりオレの目に狂いは無いのだぜ。</p>
<h4>コード</h4>
<p>以下を functions.php に追加すれば OK。もちろん WordPress 3.0 beta1 以降でお試しください。テーマは Twenty Ten 0.7 をご使用です。見ればわかる内容なので説明は割愛するぜ。わかんねーよ、という方はその旨コメントにてお知らせいただければそこそこ丁寧にご回答いたします。</p>
<pre><code>add_action('init', 'my_custom_stuff'); 
function my_custom_stuff(){
  register_post_type(
    'hairstyle', 
    array(
      'label' =&gt; __('Hair Styles'),
      'singular_label' =&gt; __('Hair Style'),
      'public' =&gt; true,
      'show_ui' =&gt; true,
      'capability_type' =&gt; 'post',
      'hierarchical' =&gt; false,
      'rewrite' =&gt; false, 
      'query_var' =&gt; false, 
      'supports' =&gt; array(
	'title', 
	'editor', 
	'thumbnail'
      ),
      'register_meta_box_cb' =&gt; 'my_hairstyle_meta_box'
    )
  );
  
  register_taxonomy(
    'hairstyletag', /* もうちょっとマシなタクソノミー名を考えよう */
    'hairstyle', /* どの post type で使うかを指定 */
    array(
      'hierarchical' =&gt; false,
      'update_count_callback' =&gt; '_update_post_term_count',
      'label' =&gt; 'ヘアスタイルの分類',
      'singular_label' =&gt; 'ヘアスタイルの分類',
      'public' =&gt; true,
      'show_ui' =&gt; true
    )
  );
}
//
function my_hairstyle_meta_box($post){
  add_meta_box('my_hairstyle_meta', 'お気に入り度よ！', 'my_hairstyle_meta_html', 'hairstyle', 'normal', 'high');
}
function my_hairstyle_meta_html($post, $box){
  $rating = get_post_meta($post-&gt;ID, 'rating', true);
  echo wp_nonce_field('my_hairstyle_meta', 'my_meta_nonce');
  echo 'このヘアスタイルは... ';
  echo '&lt;input type="radio" name="rating" value="めっちゃ好き"' .('めっちゃ好き' == $rating ? ' checked="checked"' : ''). '&gt;めっちゃ好き　';
  echo '&lt;input type="radio" name="rating" value="嫌い！"' .('嫌い！' == $rating ? ' checked="checked"' : ''). '&gt;嫌い！　';
  echo '&lt;input type="radio" name="rating" value="フツー"' .('フツー' == $rating ? ' checked="checked"' : ''). '&gt;フツー';
}
add_action('save_post', 'my_hairstyle_meta_update');
function my_hairstyle_meta_update($post_id){
  if(!wp_verify_nonce( $_POST['my_meta_nonce'], 'my_hairstyle_meta'))
    return $post_id;

  if(defined('DOING_AUTOSAVE') &#038;& DOING_AUTOSAVE) 
    return $post_id;

  if('hairstyle' == $_POST['post_type']){
    if(!current_user_can('edit_post', $post_id))
      return $post_id;
  }else{
    return $post_id;
  }

  $rating = $_POST['rating'];
  if($rating == '') 
    delete_post_meta($post_id, 'rating');
  else
    update_post_meta($post_id, 'rating', $rating);
}
//
add_filter('manage_edit-hairstyle_columns', 'my_hairstyle_columns');
function my_hairstyle_columns($columns){
  $columns = array(
    'cb' =&gt; '&lt;input type="checkbox"/&gt;',
    'title' =&gt; 'スタイル名',
    'image' =&gt; '画像',
    'tag' =&gt; '分類',
    'rating' =&gt; 'お気に入り度',
    'date' =&gt; '日付'
  );	
  return $columns;
}
//
add_action('manage_posts_custom_column', 'my_hairstyle_column');
function my_hairstyle_column($column){
  global $post;
  if('image' == $column) the_post_thumbnail(array(64, 64), 'class=featured-image');
  elseif ("tag" == $column) the_terms(0, 'hairstyletag');
  elseif ("rating" == $column) echo get_post_meta($post-&gt;ID, 'rating', true);
}</code></pre>
<h4>register_post_type：カスタム投稿タイプの登録</h4>
<p>えびちゃん好みのカスタム投稿タイプを追加するのがこのファンクションです。詳細は <a href="http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/register_post_type">Codex：関数リファレンス/register post type</a> をご覧ください。とは言ってもやっぱりめんどくさがって見ない人がいらっしゃるに違いないので、ご丁寧に説明いたします。Codex と 3.0beta1 のソースで食い違いがある部分はソースの内容を書いておきます。</p>
<pre><code>書き方：

&lt;?php register_post_type($post_type, $args) ?&gt;

$post_type：文字列，必須　
　カスタム投稿タイプの名前を指定します。
$args：配列，任意　
　以下のパラメータを指定します。


パラメータ：

label：文字列，任意，デフォルト＝ $post_type 値
　カスタム投稿タイプの管理メニュー表示名として使用されます。
　英語なら複数形で。i18n を考慮して __('my-types') のように指定すると良い。

singular_label：文字列，任意，デフォルト＝ $label 値
　新規追加、編集のページで表示されるカスタム投稿タイプ名。i18n を考慮のこと。

description：文字列，任意，デフォルト無し
　カスタム投稿タイプの概要。使わないはず。

public：bool，任意，デフォルト＝false
　カスタム投稿タイプが管理画面で表示される（ユーザに使ってもらう用）か否（裏で使う用）か。

publicly_queryable：bool，任意，デフォルト＝public 値
　通常のクエリに含むか否か。とは言うものの true でも index.php で出てこないぞ。

exclude_from_search：bool，重要，デフォルト＝！public 値
　検索結果から除くか否か。

show_ui：bool，任意，デフォルト＝public 値
　管理メニュー＆画面を自動で表示するか否か。

capability_type：文字列，任意，デフォルト＝'post'
　読み書き削除に適用される権限
　以降、権限パラメータは通常の投稿と同じで良いなら未指定（デフォルト）で OK。
　カスタム投稿タイプ独自の権限を作るなら、これに例えばカスタム投稿タイプ名を指定して、
　各種 Role に edit_hairstyle とかなんとかを追加していけば良い。
　詳しくは <a href="http://wpdocs.sourceforge.jp/ユーザーの種類と権限">Codex：ユーザーの種類と権限</a>

edit_cap：文字列，任意，デフォルト＝"edit_$capability_type"＝'edit_post'
　このカスタム投稿タイプに属する記事の編集権限名。

edit_type_cap：文字列，任意，デフォルト＝ 'edit_' . $capability_type . 's'＝'edit_posts'
 　このカスタム投稿タイプの一覧画面での編集権限名。

edit_others_cap：文字列，任意，デフォルト＝ 'edit_others_' . $capability_type . 's'＝'edit_others_posts'
　他のユーザの作成した記事の編集権限名。

publish_others_cap：文字列，任意，デフォルト＝ 'publish_' . $capability_type . 's'＝'publish_posts'
　記事の公開権限名。

read_cap：文字列，任意，デフォルト＝ 'read_' . $capability_type . 's'＝'readt_post'
　記事を読む権限名。

delete_cap：文字列，任意，デフォルト＝ 'delete_' . $capability_type . 's'＝'delete_posts'
　記事の削除権限名。

hierarchical：bool，任意，デフォルト＝false
　ページのように階層有り（true）とするか、投稿のように階層無し（false）とするか。

supports：配列，任意，デフォルト＝なし
　カスタム投稿タイプの編集画面で表示するメタボックスを 
　add_post_type_support() を使う代わりに、登録時に指定する。
　'title'　＝　タイトル欄
　'editor'　＝　本文欄
　'author'　＝　作成者欄
　'thumbnail'　＝　投稿サムネイル／Featured Image 欄
　'excerpts'　＝　抜粋欄
　'trackbacks'　＝　トラックバック／ピンバック欄
　'custom-fields'　＝　カスタムフィールド欄
　'comments'　＝　コメント欄
　'revisions'　＝　リビジョン
　'page-attributes' (parent, template, and menu order)　＝　ページの属性欄
　※デフォルト／未指定の場合は title ＆ editor が自動で設定される。
　　何かを指定さえすれば、title や editor 無しにもできる。

register_meta_box_cb：文字列（関数名），任意，デフォルト無し
　編集画面のメタボックス設定時コールバック。
　remove_meta_box() とか add_meta_box() はこのコールバックで行いましょう。

taxonomies：タクソノミー名（文字列）の配列，任意，デフォルト無し
　カスタム投稿タイプに関連づけたタクソノミーは別途 
　register_taxonomy() や register_taxonomy_for_object_type() で登録する方が良い。
　これは、すでに登録済のタクソノミーをこのカスタム投稿タイプで使う場合に指定。

menu_postition：文字列，任意，デフォルト＝null＝一番下
　管理メニュー上での表示順位。3.0beta1 では未実装。

menu_icon：文字列，任意，デフォルト＝null＝投稿のアイコン
　管理メニュー画面で使用されるアイコンのURL。3.0beta1 では未実装。

permalink_epmask：文字列，任意，デフォルト＝EP_NONE
　パーマリンクの何かマスク。気にしなくて OK。

rewrite：配列，任意：デフォルト＝true
　※パーマリンク設定がデフォルトでない場合に有効。
　パーマリンク設定に従ってリンクを書き換えるか否か。
　false＝http://example.com/?post_type=hairstyle&#038;p=123
　true＝http://example.com/hairstyle/わんこ風
　array('slug' => 'hair-styles')＝スラッグを変更＝http://example.com/hair-styles/わんこ風
　'with_front' - defaults to true　よくわからん。

query_var：bool，任意，デフォルト＝true
　※パーマリンク設定がデフォルトの場合に URL が以下のように変わります。
　false＝http://example.com/?post_type=hairstyle&#038;p=123
　true＝http://example.com/?hairstyle=わんこ風

_builtin：bool，使わないこと，デフォルト＝false
　コア組み込みの投稿タイプ（true）かカスタム投稿タイプ（false）か。

__edit_link：bool，使わないこと，デフォルト＝'post.php?post=%d'
　記事を編集する際のリンク。</code></pre>
<p>最低限指定すべきパラメータは public。あとは label, supports, register_meta_box_cb, taxonomies くらいですね。publicly_queryable=true （public=true）なら通常のブログ記事一覧表示に出てくるはずなんですが、カスタム投稿タイプの記事は出てきませんでした（Twenty Ten 0.7）。眠いからか？とりあえず以下のようにすると、カスタム投稿タイプの記事一覧を表示することはできます。</p>
<pre><code>query_posts('post_type=hairstyle');</code></pre>
<p>今回のタイトルは「使う」でしたが、実際は「作る」まででしたね。早朝なので眠いです。もう寝ます。</p></p>
<h4>カスタム投稿タイプだからできるこんなこと</h4>
<ul>
<li>「臨時休業」カスタム投稿タイプで本文と休日だけを入力してもらうと、information の記事として表示しつつ営業日カレンダーに反映。</li>
<li>飲食店で「スタッフブログ」の他に「お知らせ」「メニュー」「スタッフ」「クーポン」をカスタム投稿タイプとして追加。カテゴリから解放される！タグ的タクソノミーがカスタム投稿タイプ別に作れる！</li>
</ul>
<p>他にもえぇっと、あのホラいっぱいあるよカスタム投稿タイプで幸せになれることが。wpxtreme ではアナタのアイデアを募集しています。コメントにてドシドシご応募ください。ドシドシって擬態語？</p><h5>動作確認バージョン</h5><ul class="tested-vers"><li>WordPress 3.0 beta1</li></ul>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/how-to-use-custom-post-types-in-wordpress-3-0-beta1/feed</wfw:commentRss>
		<slash:comments>63</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/how-to-use-custom-post-types-in-wordpress-3-0-beta1" />
	</item>
		<item>
		<title>コンタクトメッセージの正しい書き方</title>
		<link>http://wpxtreme.jp/how-to-write-a-message</link>
		<comments>http://wpxtreme.jp/how-to-write-a-message#comments</comments>
		<pubDate>Mon, 05 Apr 2010 19:46:34 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[HOW-TO]]></category>
		<category><![CDATA[text]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=257</guid>
		<description><![CDATA[欧米のブログなどを見ると、よく知らん人相手でも「Excellent!」「Genius!」的なコメントがワンサカある。欧米の方々は良く知らん日本人のサイトでもコンタクトフォームから「looks cool」的なそんだけかい！ってゆーメッセージを気軽に送ってくる。<br />
一方日本では芸能人的有名人のサイトならコメントはスリスリと多く寄せられるが、例えば技術系ブログにおいては今まさにそのネタを必要としていた人からの質問的なコメントのみがあったりなかったりの有様だ。<br />
少々意地悪なコメントは欧米でも日本でも見られるがその違いは大きい。欧米では程よいツッコミ加減で書く人も書かれた人もそして読む人もニヤニヤ（幸せ版）な感じになるのに対し、日本の場合はコメントがマイナスオーラを帯びていることが多い。書かれた人も読む人も残念だわネーとなる。書いた人はニヤニヤ（非幸せ版）かもだが、発したマイナスオーラは自身の人生に残念なカゲを落としてしまうことに早く気づいて欲しい。<br />
そう、そんなことだから日本はどんどん衰退していくということに皆気づくべきなのだ。意味がワカランかね？んでは、ちょうど良いメッセージをいただいたので、ケーススタディとしてどうすれば日本が元気になるか添削してみよう！<a class="excerpt-more" href="http://wpxtreme.jp/how-to-write-a-message">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<blockquote>
おなまえ：匿名<br />
メールアドレス：google@yahoo.com<br />
メッセージ本文：<br />
つぶやきを見て感想を述べます。失礼な表現はお許しください。<br />
Safari, Chrome, Firefox に Opera から "upgrade" は出来ません。それは downgrade です。<br />
http://www.html5.jp/blog/2010/04/04/html5-api/<br />
http://www.miketaylr.com/code/input-type-attr.html<br />
CSS3 に対応したブラウザを使わないと十分デザイン意図が再現出来ないのは、プロとしてどうでしょうか。<br />
http://en.wikipedia.org/wiki/Progressive_enhancement<br />
<br />
また冒頭で lang="ja" と宣言されていますが、メインコンテンツが全て英語ですね。content description や keyword は日本語しかありませんね。対象は日本人ですよね。この辺の意図が今一分かりかねます。英語のコンテンツはファッションでしょうか。
</blockquote>
<p>ホラ、残念な気持ちになったでしょー。これは kz のポートフォリオサイト <a href="kzxtreme.com">kzxtreme.com</a> のコンタクトフォームからいただいたメッセージである。こういう感じのメッセージを書いちゃうようだとまずえびちゃんは振り向いてはくれない。「ウザい」と言われて終わりだ。もしキミが wpist ならどんな内容だろうと誰が読んでも常に幸せになれるようにメッセージを書くことを心がけよう。そうすればえびちゃんの方からガンガンメールが来ることになる。逆にこっちから「ウゼー」と言ってやれば良い。えびちゃんはもうキミにメロメロだ。不思議に思うだろうがえびちゃんとはそういうものなのだ。<br />
このように、幸せを発すると自分も幸せになる。同様にマイナスオーラを発するとマイナスな諸々が自分に返ってくる。因果応報って知ってるよね？ん、さっぱり意味がワカランかね？</p>
<h4>経緯</h4>
<ol>
<li>WordBench 名古屋でしこたま飲む。</li>
<li>翌朝全裸で目覚める。寒い。</li>
<li>大事な用事があるのに一日酒臭い息で外出。</li>
<li>帰宅すると欧米の Opera ユーザーから「Opera is good... also !」なメッセージがいくつか届いている。</li>
<li><a href="http://twitter.com/kzxtreme/status/11635924828">kzxtreme.comをご覧のOperaユーザ達からOperaもモダンブラウザじゃ！メールがいっぱい来るよーわーん</a> とつぶやく。</li>
<li>すかさず冒頭のメッセージをいただく。</li>
<li><a href="http://twitter.com/kzxtreme/status/11637438113">ファッションですよ☆</a> 他、つぶやく。</li>
<li>投稿サムネイルネタは保留にして本投稿を執筆。</li>
</ol>
<p>とりあえず今日は酒が残ってるので kz がそういう状態の時はめんどくさいメッセージは日を改めていただくとありがたい。まずはそういう 他人に対する配慮、粋な心配り といったところから意識して始めてみよう。</p>
<h4>添削</h4>
<pre><code>おなまえ：匿名</code></pre>
<p>匿名はダメです。なんで匿名にするのかというと、それは自分に自信が無いからです。自信のない人にえびちゃんはナビきません。根拠が無くても胸を張って背筋を伸ばして、目を見てはっきり話せば自信に満ちあふれた人物を演出できるのでお試しください。ただし、自信は不遜とは違います。己を信じているということです。新年を明けまして、ちゃうわ、信念を持って恥じること無く自分の人生を生きているという意味です。</p>
<pre><code>メールアドレス：google@yahoo.com</code></pre>
ウソアドレスはダメです。これがコメントだったらせっかくの <a href="http://ja.gravatar.com/">Gravatar</a> が正しく表示されません。また、テキトウに書いたものが誰かのアドレスと同じになるとご迷惑なことになります。幸いこのアドレスは取得されていません（多分取得できません）が、例示する場合は me@example.com などとしましょう。<br />
うっかり匿名と入力するのはいたしかたない。人間だもの。でも、そこからさらにウソアドレスを入力してまで送信すべき価値ある内容なのかどうか、そしてそれを「今からコレ送信するよー」と親や子供やかわいい嫁に見せられるか、そういった事を判断基準にすると良いです。
<pre><code>つぶやきを見て感想を述べます</code></pre>
<p>つぶやき見てならつぶやき返しましょう。いったい何のためにフォローしているんだい？回りくどいことは最もえびちゃんが嫌います。立ち振る舞いはいつもスマート＆シンプルに。</p>
<pre><code>失礼な表現はお許しください</code></pre>
<p>こういった日本人的な一文は不要です。「もし失礼な表現がありましたら」だと「そんなつもりは無いのですが」といったエクスキュースが入って柔らかくなりますが、いずれにしても不要です。まして失礼な表現をしてやるぞという意気込みがあるなら、失礼に徹底した方が潔い。えびちゃんは卑屈な文面にはイラつきます。「今夜空いてるかな？もし空いてて、イヤじゃなかったら食事でもどう？」なんてメール送ったらアドレス消去されますよ。「今夜飯行こうぜ」で OK なんです。まだ彼女じゃなくてもね。信じられない？いいからやってみなって。それでうまく行かなかったらそのコはそれほど大した女性じゃないのでハナから相手にせんでよろしい。</p>
<pre><code>Safari, Chrome, Firefox に Opera から "upgrade" は出来ません。それは downgrade です。

http://www.html5.jp/blog/2010/04/04/html5-api/


http://www.miketaylr.com/code/input-type-attr.html</code></pre>

<p><a href="kzxtreme.com">kzxtreme.com</a> では IE な方にはもっと良いブラウザの提案を、Firefox の方には Webkit 系のご提案をしています。Opera のことはすっかり忘れてたので IE 用の処理を通って「Safari, Chrome, Firefox 辺りに upgrade しなよ」と表示されておりました。現在は WebKit 系と同じ処理に修正しましたけども、忘れててすまんかった。でも、どのサイトでも Opera は 2%未満なので今後もよく忘れると思います。<br />
あとなんかリンクが張られていますが、ただのうっかりなのでわざわざクリックしてまで見ないぜ！<br />
こういう場合は、前述の欧米の方のように「Opera もモダンですYO☆」とサラリと反応するのが吉です。「Opera から "upgrade" は出来ません」言われてもそりゃできないですよね、ですし「それは downgrade です」とかどんどん不要なフレーズを追加するたびにえびちゃんは「めんどくさいなこの人」って気持ちになります。めんどくさがられるのってイヤでしょ？<br />
なんかしくってる？と思ったら「ミスってね？」とか親切につぶやきましょう。Opera からじゃアップグレードにならねぇだろうが、と思った方はすぐ切れてムカつくことが何も幸せにつながらないこと、そういうマイナスオーラをまとっている時間がもったいないこと、に気づくと色んなことが良い方向に動き出します。<br />
kz ほどまったりされてない方相手にこのような接し方をすると Opera ユーザ＆Opera そのものに良くないイメージを持たれてしまうかもしれません。Opera を愛しているからこそ発言する場合は、そういったことも考慮した文面にしましょう。</p>
<pre><code>CSS3 に対応したブラウザを使わないと十分デザイン意図が再現出来ないのは、プロとしてどうでしょうか。

http://en.wikipedia.org/wiki/Progressive_enhancement</code></pre>

<p>CSS3 で transition すげーとかって遊んでる、の、ね。自分のサイトくらい好き勝手にノビノビやろうぜ！「できない」のか「してないのか」など、明確でない部分はまずそこんとこを尋ねましょう。そして A ならこうですね、B ならこうですねと予め書いておくと無駄なやり取りが減って親切です。何ごとも相手の真意を確かめずにこうだ！と思い込んで反応するのは多くの場合、アナタにとって良くない結果を招きます。わかりやすく言うとちょっと恥ずかしい思いをします。</p>
<pre><code>また冒頭で lang="ja" と宣言されていますが、メインコンテンツが全て英語ですね。
content description や keyword は日本語しかありませんね。対象は日本人ですよね。
この辺の意図が今一分かりかねます。英語のコンテンツはファッションでしょうか。</code></pre>
<p>何も意図などな、い、よ　。description や keyword はめんどくさくなってテキトウに書いただけだと思うぜ。人の言動のヒトツヒトツに意味などそうそう無いことを知ると、生きて行くのが楽になります。えびちゃんがあの時言ったヒトコトをずっと引きずって悶々とせんで良い。何故ならえびちゃんはそんな事は忘れているし、そもそも始めからその言葉に意味など無いのだ。キミもすっかり忘れて「飯行くぞ」って軽くメールすればよろしい。「あのときのことだけどさ、」とかネチネチするのはヤメなさい。そこをクリアにしたいっていうのはキミのエゴだ。ネチネチグルグルするほどえびちゃんは離れて行くし、そんなことしてる時間がもったいないぞー！<br />
さらに kz は対象とか考えてないです。WordPress でなんか作りたいスイッチが入った時に、ポートフォリオの話題を目にしたり CSSMania などのギャラリー？を知ったので submit したろって思ってテキトウに作っただけなのだ。英字フォントのが好きなのでファッションなのは正解◎よくできました。</p>
<h4>正しい記述例</h4>
<pre><code>おなまえ：kz
メールアドレス：me アット wpxtreme どっと jp
メッセージ本文：
Opera で見たら Safari とか使え言われたけど CSS3 動くんだぜ Opera☆
あと全部英語だとわかんねーw　このカッコつけ！ウリウリ
</code></pre>
<p>微笑ましいですね。コンタクトを取るというのはこういうことを言います。<br />
攻撃してやるぞー！という気持ちでわざわざコンタクトするのはものすごく非生産的です。家族と楽しく過ごしているときの穏やかな自分で、そのときの自分を見つめ直していただくとバカバカしくなるのでオススメです。<br />
何十億といる人々の中から、特定の相手と何らかの接点を持つということはすごく素敵なことですよね。ならばお互いが幸せになるような、これからの人生の幅を広げるような、そんな接し方をしたいものです。<br />
例えば kz ってヤツが調子こいてやがる、一発ガツンとイったらなあかんな、っていうのはヤンキー中学生の発想です。ちょっと恥ずかしいですよね。<br />
なんかこいつイラつく、というのはアナタの心に余裕が無いからです。イラついていいのはえびちゃんだけなんですよ。例えば子供達が大声をあげて遊んでいるとしましょう。「うるせーガキンチョだな」と思うか「元気な子供達だね（音符」と思うかはアナタの心の健康度によって変わります。心が不健康だと思考も言動も不健康になり周りにマイナスオーラをまき散らして幸せを遠ざけてしまいます。<br />
どうしても天狗っパナをへし折りたい場合は、圧倒的な力の差を目の当たりにさせると良いです。ドヤ顔無しで紳士的に。そうすると天狗はアナタを尊敬します。そして交流が始まって、意外とイイやつだな kz となって、コラボしたりしてそのうち大金持ちになってウハウハかもしれません。でも、ウソアドレスで発展しにくい内容だと、そういった可能性も無くなります。もったいない。<br />
また、知らん人は敵、な考え方も改めましょう。自分の属するユニットと同規模のユニットとは敵対しがちですよね。だから世界が一致団結するには宇宙人が攻めて来ないといけない。んなアホな。仲良くするためには敵が必要とかめんどくさい。これからはよく知らん人のブログでも気軽に「いいね！」とか「勉強になったぜ」とかコメントしましょう。その積み重ねが日本のダメなところを改善し、世界平和にもつながっていくのです。物事の良い面を見つけるようにしてると、お肌がキレイになります。悪い面ばかりを追いかけてムキーッとなってると脳にダメージを与えてしまいます。気をつけてくださいね。</p>
<h4>以上を踏まえて</h4>
<p>粋なコメントやメッセージをお待ちするよ。<br />
以下ダメな例。もう一回 wpxtreme.jp を隅々まで読み直しなさい。</p>
<ul>
<li>なげー</li>
<li>ウゼー</li>
<li>メールをさらすのはいかがなものでしょう</li>
<li>意味がワカラン</li>
<li>IE をけなさないでください！</li>
<li>どっちもどっち</li>
<li>えびちゃんかわゆす</li>
</ul>
<h4>フォーラムにて</h4>
<p>勉強熱心で努力家な方々からすると、質問者に対して色々思うところがあったりするかもしれません。そんなときは、おじいちゃんおばあちゃんや子供に接する時の優しい気持ちを思い出してください。ちったぁ自分でなんとかかんとかと思わないように。ましてそんな事を書いてしまわないように。そのうえ twitter でつぶやいたりしないように。そうしてしまう自分が荒れているのだと考えて心を鎮めましょう。質問者は誰も攻撃していません。なので攻撃してはいけません。<br />
フォーラムに書き込むのは敷居が高いことなんです。わらにもすがる思いで書き込んだら怒られるわ解決せんわでは WordPress ＆コミュニティーにイヤなイメージを持ってしまいます。困っていることがズバッと解決すれば、嬉しい → WordPress ますます大好き → 貢献したい となってシメシメなんです。<br />
例えば投稿ルールを守って欲しい時などは、冷たい書き方じゃなくて愛情を持って温かく書いてあげてください。例えがアレですが「トイレを汚すな！」って貼り紙だとウリャー！って汚されます。「いつもキレイに使っていただいてありがとうございます」だとちゃんとキレイになります。善意で接すれば善意が返ってきて発展する。マイナスオーラをブチまけたらコミュニティがマイナスオーラに包まれて衰退するし、人はアナタから遠ざかります。コミュニケーションの基本ですね。<br />
もちろん世の中には色んな人がいるので善意が返ってこないこともありますが、自分が善意で接することが大事です。他人を変えることはできません。変えられるのは自分だけです。で、自分が変わると他人も変わってきます。それに気づけばイライラギスギスムカムカとは無縁の平和な毎日を過ごせます。お布施を希望される方は <a href="http://wpxtreme.jp/contact" title="Go to お問い合わせ.">お問い合わせ</a> からお気軽に。<br />
あと、質問者があまり感心できないサイトを構築されているようなら、そっとしておくのもひとつの回答ですね。</p>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/how-to-write-a-message/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/how-to-write-a-message" />
	</item>
		<item>
		<title>ボツデザインシリーズ #4</title>
		<link>http://wpxtreme.jp/unreleased-webdesign</link>
		<comments>http://wpxtreme.jp/unreleased-webdesign#comments</comments>
		<pubDate>Sun, 21 Mar 2010 21:55:58 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[PORTFOLIO]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[rejected]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=250</guid>
		<description><![CDATA[えぇぇ、そうなの？！という理由により公開までたどりつけなかったデザインを紹介するこのコーナー。今回もまた2週間ぶりの更新でお届けします。ネタが無いわけではありません。WordPress 2.9.2 でカスタム投稿タイプを試したろと思ったらドえらいことになって頓挫しております。投稿サムネイルでお茶を濁そうかと画策中です。さらにプライベート＆クライアントワークのローンチ（<a href="http://kzxtreme.com">kzxtreme</a> 参照）が立て続けでろくにえびちゃんをかまってあげる時間もないのです。年度末めー。<br />
それはそうと Google で「ボツ」と検索すると <a href="http://wpxtreme.jp/unreleased-webdesign-3">ボツデザインシリーズ #3</a> が1ページ目に出てくるのは一体どういうことなんでしょうか。しっかりしろ Google。<br />
今回は、某串料理店の新規サイトです。ロゴや文言はそのままです。初回ご提案のデザインはボツになりましたが、テイストを変更して鋭意制作中です。ボツにならないことを祈ってくれ皆。<a class="excerpt-more" href="http://wpxtreme.jp/unreleased-webdesign">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/pincho-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/pincho-1-620x674.jpg" alt="" title="pincho" width="620" height="674" class="alignnone size-large wp-image-252" /></a>
<h4>制作の様子</h4>
<p>店舗オープン前からブランディング一切をお任せいただければ、それはもうドえらいクオリティのご提案ができるのですが、当方 WEB 業界のはじっちょでひっそり息を潜めてプルプル震えておるような状態ですので、なかなかそういったコネクション的なものは構築できておりません。営業もしませんので基本、既存クライアント様からのご紹介のみです。ホームページは欲しいけど何十万もするんではなぁ、変な業者にひっかかるとイヤだなぁ、などとあぐねていらっしゃる方々にとってはまさに救世主的存在ですのでお気軽に <a href="http://wpxtreme.jp/contact" title="Go to お問い合わせください.">お問い合わせください</a>。ただし、こちらもクライアントを選びますのでそこはヒトツよろしくお願いします。料理関連なら「マジ旨い」、サービス関係なら「マジありがとう」そう思えるクオリティがあり、かつお客様を大切にしているクライアントのみお受けいたします。お客様がお金に見えてたり、二度と来ねぇょ！なところとはお付き合いしません。お互いホレる仲が理想です。<br />
<br />
制作の様子なんですが、そういった事情により ロゴ，チラシ，店舗がある状態から WEB サイトをデザインすることがほとんどです。ちなみに名古屋では Copperplate に代表される Engraved なフォントがお気に入りのデザイン屋さんが大活躍されているようで、アチコチで「またこのフォントか」という出会いがあって微笑ましいです。<br />
まず、初回訪問で店舗の空気からクライアントが何を目指しているか五感でガッチリ感じ取ります。これ8割。で、ヒアリングと簡単な撮影を行います。ヒアリング言うてもノープランなクライアントがほとんどなので五感のインプットをまぜまぜした結果を「こんな感じで作ってみますねー」と伝えておきます。で、使えそうな資料をお借りして帰路につきます。チラシなどは既に OK が出ているデザイン的なモノのアウトプットですからインスパイアされても間違いは無いでしょう。帰ったら神様が降りてくるのを静かに待って、ダーッと Photoshop で8割方描き上げます。あとは一日掛けて細部を調整してご提案。多分ベストな提案なんです。コレ以外には無いな、って毎回思うもの。</p>
<h4>ボツの理由</h4>
<p>極上の料理とテキトウな器、テキトウなカベだけど天然木のテーブル＆チェア、などギャップを楽しんでもらうお店です。店舗名が某有名女優のモジりだったりと遊び心もたっぷりです。そしてポスティングカードのデザインはポップでかわいらしい。よし、間違いない。自信満々でドヤ！とご提案したところ「パッと見、かわいいですよね。」「ぁー、そうですね。かわいさを取り入れましたハイ。」「もっとパッと見クールな感じが良いんです。気になるサイトがありまして—」と見せていただいたのは、出た全面フラッシュサイト！イメージ写真ドーンでわけわからんナビゲーション。「ホームに何も情報がないサイトはアレやコレやでオススメしないんですけどもー」「せやけどなぁ、ウチこんなんがええねん」「どうしてもか？」「うん、そやねん」「こういうのんがええんか？」「クールなんが好きやねん」「しゃぁないやっちゃな、今回だけやで？」<br />
というやり取りの末、ソッチ方向で仕切り直ししました。料理がおいしくてクライアント様が素敵なので今回だけ特別です。生ビール6杯いただいたからかもしれません。<br />
<br />
今回皆にもぜひ学んでおいて欲しい教訓は「クライアントは印刷物はテキトウでも良いがサイトにはめっちゃこだわる」ということだ。他のクライアントでもそういう傾向がある。気のせいではない、統計的に有意なのだ。ヨソの人が作った印刷物にインスパイアされてはならん。ブランディング無視のこれでいいんですかな印刷物で OK なのにホームページとなると「ここもうちょっと大きく」とかどうでもええことさえもドえらい細かく気になるのだ。印刷物は印刷するまでよくわからんしバーッと印刷されちゃってやり直しも効かんから「まぁええか」となるんだろうか。<br />
いや、ホームページというのはやはりクライアントの夢であり、お店を作る時と同じくらいの思い入れができる楽しみなモノなんだろう。そのお手伝いができるのはとても嬉しいことであり、ありがたいことでもある。エンドユーザーから遠く離れたところで Windows のボケナスをいじくり倒していたままでは味わえなかった幸せだ。そのうえ「ホームページ見たっていうお客さんが増えたよ」なんて聞くと世界人類が平和でありますようにと祈らずにはいられない。えびちゃんにもいつも以上に優しくなれる。
<br />はじっちょではあるが WEB 業界に関われて本当に良かったと思う。いや WEB 業界に関わろうと自ら動いた自分こそが本当に素敵だと思う。ただ、ひとつだけ贅沢を言わせてもらえるならば、デザインはまるっと任せてくれ。マジで。</p>
]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/unreleased-webdesign/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/unreleased-webdesign" />
	</item>
		<item>
		<title>WordPress3.0未満でのカスタムタクソノミーの使い方</title>
		<link>http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3</link>
		<comments>http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3#comments</comments>
		<pubDate>Mon, 08 Mar 2010 04:25:59 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[HOW-TO]]></category>
		<category><![CDATA[admin]]></category>
		<category><![CDATA[category]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[taxonomy]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=241</guid>
		<description><![CDATA[WordPress の3大使われない機能のひとつにカスタムタクソノミーがあります。タクソノミーという言葉に馴染みが無くハマる日本語も見当たらないため長らくマイナーな立場に甘んじてきましたが、WordPress 3 で UI が充実しカスタム投稿タイプと絡んでようやく陽の当たる場所へ出てきそうなので予習しておきましょう。<br />
タクソノミーは分類ってことです。カテゴリーもタグもタクソノミーなんですよ。カテゴリーは階層（親子関係）有りのタクソノミー、タグは階層無しのタクソノミー。混乱してきましたね。そんなキミのためにタクソノミーとは何なのか、どうやって使うのか。ココだけ読んどけばオール OK、にしてやるぜ。<a class="excerpt-more" href="http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<h4>ことばのせつめい</h4>
<p>生涯 WordPress のカスタマイズ1本と謳っている wpxtreme でも、ブログの記事は「TUTORIALS」「PORTFOLIO」などのカテゴリーに分類されています。「メイク」「グルメ」「わんこ」と記事のカテゴリーを分けているえびちゃんもいることでしょう。<br />
ちょっと待って。「カテゴリー」と何気なく言ってますけど、デヴェロッパー的にはこれは「カテゴリーのターム」です。「TUTORIALS」「メイク」など、これらはカテゴリーじゃなくてカテゴリーのタームなんです。共学の私立ですね。通ってみたいです。<br />
同じく「投稿のタグ」も［新規タグの追加］で追加した「ADMIN」「プラグイン」などが「タグのターム」です。どちらも今まで通り「わんこカテゴリー」「ADMIN タグ」と言ってて OK ですが、タームであることを知ってて言うのと知らないで言うのとではやはり他人に気づかれない程度の差があると思います。<br />
そしてタームをグルーピングしている「カテゴリー」や「タグ」をタクソノミーと言います。なので「カテゴリーというタクソノミーで TUTORIALS，PORTFOLIO などのタームに分類する」が正確。女性相手なら「わんこカテゴリーだね☆」が正解。<br />
以上、ネチネチな言葉狩りではなく、AT がオートマなら MT はミッションじゃなくてマニュアルだろうが、っていうどうでもいい話でもなくて、誤解による混乱防止のため正しい理解の下に話を進めるのでよろしくお願いするぜ。<br />
なお、MT は MovableType では？っていうコメントは不要だ。AT って AUTOMATTIC ですよね！っていうコメントは歓迎する。</p>
<h4>具体的な分類を考えよう</h4>
<p>そもそもカテゴリー，タグなんてので説明するからわかり難いのだ。ケーススタディとして「グルメーイタリアン｜フレンチ｜和食」「動物ー犬｜猫」とブログ記事を分けたいえびちゃんを例に説明する。一般的な wper なら以下のようにカテゴリーを作るだろう。</p>
<ul>
  <li>カテゴリー
    <ul>
      <li>グルメ
        <ul>
          <li>イタリアン</li>
          <li>フレンチ</li>
          <li>和食</li>
        </ul>
      </li>    
      <li>動物
        <ul>
          <li>犬</li>
          <li>猫</li>
        </ul>
      </li> 
    </ul>
  </li>
</ul>
<p>だが、えびちゃんの反応はこうだ。「何？！カテゴリー？意味わかんない！グルメと動物がなんで一緒になってんのよ！」一方、wpist ならタクソノミーでスマートに解決するはずだ。</p>
<ul>
  <li>グルメ
    <ul>
      <li>イタリアン</li>
      <li>フレンチ</li>
      <li>和食</li>
    </ul>
  </li>    
  <li>動物
    <ul>
      <li>犬</li>
      <li>猫</li>
    </ul>
  </li> 
</ul>
<p>そして、えびちゃんの反応はこうだ。「あなたってステキね。私なんだか酔っちゃったみたい。」
説明するとは言ったが説明するまでもないだろう。なりたい自分になれるかどうかは自分次第だ。<br />
<br />
では、次にそれぞれの記事に「おいしさーまた食べたい｜二度とイラねぇ」「かわいさーゲキカワ｜ブサイク」のようなラベル付けをしたいとえびちゃんにお願いされたらどうする？一般的な wper なら以下のようにタグを作ってしまうだろう。</p>
<ul>
  <li>タグ
    <ul>
      <li>また食べたい</li>
      <li>二度とイラねぇ</li>
      <li>ゲキカワ</li>
      <li>ブサイク</li>
    </ul>
  </li>
</ul>
<p>さらに「グルメカテゴリーのときは また食べたい｜二度とイラねぇ のどちらかを選んでください。」とかメンドクサイこと言ってまたドヤされるわけだ。そして wpist はまたしてもタクソノミーで鮮やかに解決する。</p>
<ul>
  <li>おいしさ
    <ul>
      <li>また食べたい</li>
      <li>二度とイラねぇ</li>
   </ul>
  </li>
  <li>かわいさ
    <ul>
      <li>ゲキカワ</li>
      <li>ブサイク</li>
    </ul>
  </li>
</ul>
<p>えびちゃんの頬は紅潮し瞳はウルウルしている。そう、タクソノミーを制する者は人生の勝利者となるのだ。</p>
<h4>現実に戻ろう</h4>
<p>では早速タクソノミーを使ってみよう。使い方は簡単、以下を functions.php に追加すればよろしい。</p>
<pre><code>function my_init(){
  register_taxonomy('animal', 'post', array('hierarchical' =&gt; true, 'label' =&gt; '動物',
    'update_count_callback' => '_update_post_term_count'));
  register_taxonomy('taste', 'post', array('hierarchical' =&gt; false, 'label' =&gt; 'おいしさ',
    'update_count_callback' => '_update_post_term_count'));
}
add_action('init', 'my_init', 0);</code></pre>
<p class="append">各タクソノミーの管理画面でターム一覧に表示される投稿数を正しい値にするには 'update_count_callback' => '_update_post_term_count' が必要です。<br />
<br />
また、投稿数の値は下書きを含みませんがビルトインの「カテゴリー」タクソノミー，「タグ」タクソノミーのみ、投稿数のリンクをクリックして表示される投稿編集画面での投稿一覧に下書きが含まれており、ここでの表示件数と先の投稿数は一致しません。不具合なのかまだ作り中だからなのかは不明。</p>
<p>タクソノミーの追加は何よりも優先しろってことなので <code>add_action('init', 'my_init', 0);</code> のアクションで実行します。'動物' などの表示名は .mo ファイルを作成して <code>__('Animal')</code> のように指定するとデキルヤツを演出できますね。register_taxonomy() の詳細は Codex を参照のこと — <a href="http://codex.wordpress.org/Function_Reference/register_taxonomy">Function Reference/register taxonomy</a> とは言ってもメンドクサがって見ない人のために未検証のままテキトウに解説します。必要になったら各自検証すること。</p>
<pre><code>使い方：
&lt;?php register_taxonomy($taxonomy, $object_type, $args); ?&gt;</code></pre>
<ul>
<li>$taxonomy<br />
(文字列) (必須) タクソノミー名。スラッグ的なもの。<br />
デフォルト：なし</li>
<li>$object_type　というより $post_type(s) のがシックリくる<br />
(配列／文字列) (必須) 投稿／ページ／メディアなど、どの投稿タイプで使うかの指定。複数なら配列でね。<br />
デフォルト：なし<br />
例：'post',  array('post', 'page')<br />
カスタム投稿タイプが使えるようになったら、さらに夢が広がりますね。
</li>
<li>$args<br />
(配列／文字列) (任意) 各種引数の指定。<br />
デフォルト：なし<br />
引数：
<ul>
<li>label<br />
(文字列) 管理画面のメニューなどに表示されるタクソノミーの名前。<br />
例：'おいしさ'
<li>hierarchical<br />
(boolean) タクソノミーが階層を持つかどうかを指定。<br />
例：<br />
　false：階層無し＝タグ形式<br />
　true：階層有り＝カテゴリー形式</li>
<li>update_count_callback<br />
(文字列) このタクソノミーに属するタームが増減したときに呼ばれる関数名。</li>
<li>rewrite<br /> 
(配列｜false) タクソノミーアーカイブとかのパーマリンク名（スラッグ部分）の指定。指定するならキーが 'slug' の配列でね。<br />
デフォルト：$taxonomy を使う。<br />
例：<br />
　デフォルト：http://example.com/taste/matatabetai<br />
　false：rewrite 無し（意味不明）<br />
　array('slug' =&gt; "my-tax-$taxonomy") ：http://example.com/my-tax-taste/matatabetai</li>
<li>query_var<br /> 
(文字列｜false) ?query_var=term 形式のクエリ変数名の指定。<br />
デフォルト：$taxonomy を使う。<br />
例：<br />
　デフォルト： ?taste=matatabetai<br />
　false：クエリ無し（意味不明）<br />
　"my-tax-$taxonomy"： ?my-tax-taste=matatabetai
</li>
</ul>
ま、hierarchical と label <del>だけ</del>を指定すれば OK です。
 <p class="append">うそでしたごめん。<br />
'update_count_callback' => '_update_post_term_count' が無いと
ターム一覧で表示される「投稿」の数が正しく更新されないのでこれも必要。</p>
</li>
</ul>
<p>参考：「カテゴリー」タクソノミーと「タグ」タクソノミーの定義（wp-includes/taxonomy.php 17行目〜）</p>
<pre><code>register_taxonomy( 'category', 'post', array('hierarchical' =&gt; true, 'update_count_callback' =&gt; '_update_post_term_count', 
  'label' =&gt; __('Categories'), 'query_var' =&gt; false, 'rewrite' =&gt; false) ) ;
register_taxonomy( 'post_tag', 'post', array('hierarchical' =&gt; false, 'update_count_callback' =&gt; '_update_post_term_count',
  'label' =&gt; __('Post Tags'), 'query_var' =&gt; false, 'rewrite' =&gt; false) ) ;</code></pre>
<p>Codex に</p>
<blockquote>WordPress 2.8 will automatically build an admin interface for custom taxonomies. Allowing end users to add terms and associate posts with the taxonomy terms.</blockquote>
と書いてあるとおり、管理画面で「おいしさ」タクソノミーを満喫できます。
<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-1-620x271.jpg" alt="「おいしさ」タクソノミー管理画面" title="taxonomy-1" width="620" height="271" class="alignnone size-large wp-image-243" /></a><a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-2.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-2-620x316.jpg" alt="新規投稿の「おいしさ」タクソノミー" title="taxonomy-2" width="620" height="316" class="alignnone size-large wp-image-244" /></a>行頭に　ー　が来てるのはワザとなのでコメントは不要だ。これだけで「おいしさ」タクソノミーを利用できるんだから、今後の案件に積極的に取り入れていこうぜ。ちなみに「おいしさ」タクソノミーのタグクラウドを表示させたい場合は以下のようにすれば OK。</p>
<pre><code>wp_tag_cloud(array('taxonomy' => 'taste'))</code></pre>
<p><a href="http://ja.forums.wordpress.org/topic/3432" title="Codex">指定したカテゴリーに含まれるタグのみ表示したい</a>的なことはこれでスマートに解決するわけです yeah!</p>
<h4>階層有りのタクソノミーの管理画面 UI を作る</h4>
<p>前述の Codex ではカスタムタクソノミーの管理画面は自動で出てくるよ、と言ってますが実は UI が対応済みなのはタグ形式＝階層無しのタクソノミーだけなので気をつけましょう。カテゴリー形式＝階層有りのタクソノミーは バージョン 2.9.2 の時点では UI はサポートされていません。3.0 ではサポートされると思います（知らんけど）ので開発版をダウンロードしてお試しいただくと良いかもです。どこでダウンロードするのかは自分で調べるのだ。<br />
<br />
もの好きな方は引き続きついてきていただいて、階層有りのタクソノミーの UI を作りましょう。コア開発してる気になるのできっと楽しいですよ。<br />
まずは管理画面の［投稿］トップメニューのサブメニューとして［ 動物］メニューを追加します。functions.php に以下を追加。</p>
<pre id="admin-menu"><code>function my_admin_menu() {
  global $submenu;
  $i = 55;
  $submenu['edit.php'][$i++] = array( esc_attr('動物'), 'manage_categories', 'my-edit-categories.php?taxonomy=' . 'animal' );
}
add_action('admin_menu', 'my_admin_menu');
</code></pre>
<p>普通なら［投稿］トップメニューにサブメニューを追加する場合は add_posts_page（<a href="http://codex.wordpress.org/Adding_Administration_Menus#Sub-Menus">Codex：Adding Administration Menus</a>）を使います。</p>
<pre><code>add_posts_page('動物', '動物', 'manage_categories', 'animal', 'my_animal_page');</code></pre>
<p>これはメニューのリンク先が http://example.com/wp-admin/edit.php?page=animal となり、実際に画面を出力する際にコールバック関数として指定した 'my_animal_page' が呼ばれます。んが、WordPress のタグ，カテゴリーの編集の実装では redirect を多用しているので、コールバック関数内で同じことをしてもうまく動作しません。そんな時はお隣のサブメニューがどうやっているかを調べましょう。<br />
<pre><code>［投稿のタグ］サブメニューの URL：http://example.com/wp-admin/edit-tags.php?taxonomy=post_tag
［カテゴリー］サブメニューの URL：http://example.com/wp-admin/categories.php</code></pre>
タグはタクソノミー対応してるけどカテゴリーはまだよ、てのが良くわかります。ちゅうことはですよ、<br />
<pre><code>［動物］サブメニューの URL：http://example.com/wp-admin/my-edit-categories.php?taxonomy=animal</code></pre>
<p>とすれば良さそうですね。categories.php をコピって edit-tags.php を真似れば OK な気がします。できたファイルは my-edit-categories.php と名付けて wp-admin フォルダに放り込みましょう。おぉ、コア開発な気分。<br />
で、このようなオリジナルなリンクを持つサブメニューを作る方法が<a href="#admin-menu">先のコード</a>です。［カテゴリー］サブメニューは <code>$submenu['edit.php'][50]</code> に入ってるのでそれより下に表示させるために 55 番とかに入れちゃいます。詳細は、wp-admin/menu.php 46行目辺りをご覧いただくときっとなるほど納得です。</p>
<h4>my-edit-categories.php を作る</h4>
<p>今回は異様に長い内容になるので頑張ってついてくるように。ちなみにこのような不毛な作業を<a href="http://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E" title="Wikipedia">車輪の再発明</a>と言いますが、コア開発気分を味わうのが目的なので心配無用です。俺にもできそう、と思った方は WordPress の発展に深いところで貢献していきましょう。キミ達がコア開発メンバーとして名を連ねるのが先生の夢です。私にもできそうだわ！と思った方は kz にコンタクトしましょう。キミ達をはべらせるのが俺様の夢なのさ。</p>
<p>wp-admin/my-edit-categories.php　（categories.php との差分のみ）</p>
<pre><code>タクソノミー対応
- wp_reset_vars( array('action', 'cat') );
+ global $action, $cat, $cat_ID, $taxonomy; 
+ wp_reset_vars( array('action', 'cat', 'cat_ID', 'taxonomy', 'page') );
+
+ if ( empty($taxonomy) ){
+  if(isset($_POST['taxonomy']))
+    $taxonomy = $_POST['taxonomy'];
+  else
+    $taxonomy = 'category';
+ }
+
+ if ( !is_taxonomy($taxonomy) )
+   wp_die(__('Invalid taxonomy'));

タクソノミー対応のカテゴリー追加
- if ( wp_insert_category($_POST) )
-   wp_safe_redirect( add_query_arg( 'message', 1, wp_get_referer() ) . '#addcat' );
- else
-   wp_safe_redirect( add_query_arg( 'message', 4, wp_get_referer() ) . '#addcat' );
+ $ret = my_insert_category($_POST);
+ if ( $ret &#038;& !is_wp_error( $ret ) ) {
+   wp_redirect("my-edit-categories.php?taxonomy=$taxonomy&#038;message=1#addcat");
+ } else {
+   wp_redirect("my-edit-categories.php?taxonomy=$taxonomy&#038;message=4#addcat");
+ }

- wp_redirect('categories.php');
+ wp_redirect("my-edit-categories.php?taxonomy=$taxonomy");

タクソノミー対応のカテゴリー削除
- wp_delete_category($cat_ID);
- wp_safe_redirect( add_query_arg( 'message', 2, wp_get_referer() ) );
+ wp_delete_term($cat_ID, $taxonomy);
+	
+ $location = 'my-edit-categories.php';
+ if ( $referer = wp_get_referer() ) {
+   if ( false !== strpos($referer, 'my-edit-categories.php'))
+     $location = $referer;
+ }
+
+ $location = add_query_arg('message', 2, $location);
+ wp_redirect($location);

タクソノミー対応のカテゴリー削除
- wp_delete_category($cat_ID);
+ wp_delete_term($cat_ID, $taxonomy);
	
- wp_safe_redirect( wp_get_referer() );
+ $location = 'my-edit-categories.php';
+ if ( $referer = wp_get_referer() ) {
+   if ( false !== strpos($referer, 'my-edit-categories.php') )
+     	$location = $referer;
+ }
+
+ $location = add_query_arg('message', 6, $location);
+ wp_redirect($location);

タクソノミー対応の「カテゴリーの編集」フォーム
- $category = get_category_to_edit($cat_ID);
- include('edit-category-form.php');
+ $category = get_term( $cat_ID, $taxonomy, OBJECT, 'edit' );
+ if (! is_wp_error( $category ) )
+    _make_cat_compat( $category );
+ include('my-edit-category-form.php');
 
タクソノミー対応のカテゴリー更新
- if ( wp_update_category($_POST) )
+ $ret = my_update_category($_POST);
+ if ( $ret &#038;& !is_wp_error( $ret ) )

ajax 関連スクリプト無し
- wp_enqueue_script('admin-categories');
- if ( current_user_can('manage_categories') )
-   wp_enqueue_script('inline-edit-tax');

メッセージ追加
+ $messages[6] = __('Categories deleted.');

フォームに追加
+ &lt;input type="hidden" name="taxonomy" value="&lt;?php echo esc_attr($taxonomy); ?&gt;" /&gt;

- $num_cats = wp_count_terms('category');
+ $num_cats = wp_count_terms($taxonomy);

タクソノミー対応のカテゴリー一覧表示
- cat_rows(0, 0, 0, $pagenum, $cats_per_page);
+ my_cat_rows(0, 0, 0, $pagenum, $cats_per_page, $taxonomy);

タクソノミー対応のフォーム
- &lt;form name="addcat" id="addcat" method="post" action="categories.php" class="add:the-list: validate"&gt;
+ &lt;form name="addcat" id="addcat" method="post" action="my-edit-categories.php" class="add:the-list: validate"&gt;

タクソノミー対応の「親カテゴリー」ドロップダウン
- wp_dropdown_categories(array('hide_empty' =&gt; 0, 'name' =&gt; 'category_parent', 'orderby' =&gt; 'name', 
  'selected' =&gt; $category-&gt;parent, 'hierarchical' =&gt; true, 'show_option_none' =&gt; __('None'))); 
+ wp_dropdown_categories(array('taxonomy' =&gt; $taxonomy, 'hide_empty' =&gt; 0, 'name' =&gt; 'category_parent', 
  'orderby' =&gt; 'name', 'selected' =&gt; $category-&gt;parent, 'hierarchical' =&gt; true, 'show_option_none' =&gt; __('None'))); 

ajax 編集は無し
- inline_edit_term_row('categories');</code></pre>
<p>見難い。なお、ajax 関連処理はヤリ始めるとさらにオオゴトになるので今回は未対応です。</p>
<p>
<br />
<br />
あ、途中で公開してしもた。続きは明朝！
<br />
<br />
</p>
<p class="append">ここ以降はうっかり公開した後に追記されたものです。見るなって言ったのにここまで見ちゃってしまってた人は改めて始めから読み直しましょう。新たな気づきがあるかもしれません。隠れキャラとか。</p>
<h4 id="tuduki">各種カテゴリー関連ファンクションをタクソノミー対応にする</h4>
<p>続きは明朝（ミンチョウ）ってなんだよフォントかよ serif なのかよ。うっかり公開は気にせずガンガン行くぜ！では管理画面の完成イメージをどうぞ。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-31.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-31-620x316.jpg" alt="階層有りタクソノミーの管理画面" title="taxonomy-3" width="620" height="316" class="alignnone size-large wp-image-249" /></a>
タームの一覧表示は cat_rows() / wp-admin/includes/template.php で処理されてるので下請けファンクションと共にタクソノミー対応します。赤丸部分のデカイ方はアイコンを CSS で指定します。ちっさい方は当該の li 要素に class="current" を付加するとメニューの左側が ＞ って凹みます。これは皆の宿題にしておくぜ。<br />
<br />
まずはフィルタで OK なものから。<br />
get_categories() / wp-includes/category.php </p>
<pre><code>function &#038;get_categories( $args = '' ) {
  $defaults = array( 'type' =&gt; 'category' );
  $args = wp_parse_args( $args, $defaults );

  $taxonomy = apply_filters( 'get_categories_taxonomy', 'category', $args );</code></pre>
<p>get_categories_taxonomy フィルタには何も add されてないので <code>$taxonomy = ''</code> になります。$taxonomy が設定されていないと、これ以降各種ファンクションはタクソノミーを 'category' として処理します。なので functions.php で get_categories_taxonomy にフィルタを与えてやりましょう。</p>
<pre><code>function my_get_categories_taxonomy($taxonomy, $args){
  return isset($args['taxonomy']) ? $args['taxonomy'] : $taxonomy;
}
add_filter( 'get_categories_taxonomy', 'my_get_categories_taxonomy', 10, 2 );</code></pre>
<p><code>get_categories(array('taxonomy' => 'taste'))</code> と呼べば OK です。<br />
<br />
はい、次。cat_rows() 達をタクソノミー対応にします。functions.php に書くんだけどもマイブームの差分コードでお楽しみください。見難い。</p>
<pre><code>cat_rows(), _cat_rows(), _cat_row() / wp-admin/includes/template.php

- function cat_rows( $parent = 0, $level = 0, $categories = 0, $page = 1, $per_page = 20 ) {
+ function my_cat_rows( $parent = 0, $level = 0, $categories = 0, $page = 1, $per_page = 20, $taxonomy = 'category' ) {

- $args = array('hide_empty' =&gt; 0);
+ $args = array('hide_empty' =$gt; 0, 'taxonomy' =$gt; $taxonomy);

- $children = _get_term_hierarchy('category');
+ $children = _get_term_hierarchy($taxonomy);

- _cat_rows( $parent, $level, $categories, $children, $page, $per_page, $count );
+ _my_cat_rows( $parent, $level, $categories, $children, $page, $per_page, $count, $taxonomy );


- function _cat_rows( $parent = 0, $level = 0, $categories, &#038;$children, $page = 1, $per_page = 20, &#038;$count ) {
+ function _my_cat_rows( $parent = 0, $level = 0, $categories, &#038;$children, $page = 1, $per_page = 20, &#038;$count, $taxonomy ) {

- echo "\t" . _cat_row( $my_parent, $level - $num_parents );
+ echo "\t" . _my_cat_row( $my_parent, $level - $num_parents, $taxonomy );

- echo "\t" . _cat_row( $category, $level );
+ echo "\t" . _my_cat_row( $category, $level, $taxonomy );

- _cat_rows( $category-&gt;term_id, $level + 1, $categories, $children, $page, $per_page, $count );
+ _my_cat_rows( $category-&gt;term_id, $level + 1, $categories, $children, $page, $per_page, $count, $taxonomy );


- function _cat_row( $category, $level, $name_override = false ) {
+ function _my_cat_row( $category, $level, $taxonomy, $name_override = false ) {

- $category = get_category( $category, OBJECT, 'display' );
+ $category = get_term( $category, $taxonomy, OBJECT, 'display' );
+ if (! is_wp_error( $category ) )
+   _make_cat_compat( $category );

- $edit_link = "categories.php?action=edit&amp;cat_ID=$category-&gt;term_id";
+ $edit_link = "my-edit-categories.php?action=edit&amp;cat_ID=$category-&gt;term_id&amp;taxonomy=$taxonomy";

- $actions['inline hide-if-no-js'] = '&lt;a href="#" class="editinline"&gt;' . __('Quick&nbsp;Edit') . '&lt;a&gt;';

- $actions['delete'] = "&lt;a class='delete:the-list:cat-$category-&gt;term_id submitdelete' href='" . 
   wp_nonce_url("categories.php?action=delete&amp;cat_ID=$category-&gt;term_id", 'delete-category_' . $category-&gt;term_id) . "'&gt;" . __('Delete') . "&lt;/a&gt;";
+ $actions['delete'] = "&lt;a class='delete:the-list:cat-$category-&gt;term_id submitdelete' href='" . 
  wp_nonce_url("my-edit-categories.php?action=delete&amp;cat_ID=$category-&gt;term_id&amp;taxonomy=$taxonomy", 'delete-category_' .
  $category-&gt;term_id) . "'&gt;" . __('Delete') . "</a>";

- $posts_count = ( $category-&gt;count &gt; 0 ) ? "&lt;a href='edit.php?cat=$category-&gt;term_id'&gt;$category-&gt;count</a>" : $category-&gt;count;
+ $posts_count = ( $category-&gt;count &gt; 0 ) ? "&lt;a href='edit.php?$taxonomy=$category-&gt;slug'&gt;$category-&gt;count&lt;/a&gt;" : $category-&gt;count;</code></pre>
<p>次は、タームの追加／更新ファンクション。これもアレンジしたファンクションは functions.php に書きます。</p>
<pre><code>元ファンクション wp_insert_category() / wp-admin/includes/taxonomy.php

- function wp_insert_category($catarr, $wp_error = false) {
- $cat_defaults = array('cat_ID' =&gt; 0, 'cat_name' =&gt; '', 'category_description' =&gt; '', 'category_nicename' =&gt; '', 'category_parent' =&gt; '');
+ function my_insert_category($catarr, $wp_error = false) {
+ $cat_defaults = array('cat_ID' =&gt; 0, 'taxonomy' =&gt; 'category', 'cat_name' =&gt; '', 'category_description' =&gt; '', 'category_nicename' =&gt; '',
  'category_parent' =&gt; '');

- if ( empty($parent) || !category_exists( $parent ) || ($cat_ID &#038;& cat_is_ancestor_of($cat_ID, $parent) ) )
+ $id = is_term($parent, $taxonomy, 0);
+ if ( is_array($id) )
+   $id = $id['term_id'];
+ if ( empty($parent) || !$id || ($cat_ID &#038;& cat_is_ancestor_of($cat_ID, $parent) ) )

- $cat_ID = wp_update_term($cat_ID, 'category', $args);
+ $cat_ID = wp_update_term($cat_ID, $taxonomy, $args);

- $cat_ID = wp_insert_term($cat_name, 'category', $args);
+ $cat_ID = wp_insert_term($cat_name, $taxonomy, $args);


元ファンクション wp_update_category() / wp-admin/includes/taxonomy.php

- function wp_update_category($catarr) {
+ function my_update_category($catarr) {

- $category = get_category($cat_ID, ARRAY_A);
+ $category = get_term( $cat_ID, $catarr['taxonomy'], ARRAY_A, 'raw' );
+ if (! is_wp_error( $category ) )
+   _make_cat_compat( $category );

- return wp_insert_category($catarr);
+ return my_insert_category($catarr);</code></pre>
<p>最後にデカイ赤丸部分のアイコンを表示させましょう。</p>
<pre id="my-head"><code>function my_head(){
  echo '
&lt;style type="text/css"&gt;
#icon-my-edit-categories{background:url(/wp-admin/images/icons32.png) no-repeat -552px -5px;}
&lt;/style&gt;';
}
add_action('admin_head', 'my_head');</code></pre>
<p>はい、以上で階層有りタクソノミーの管理画面が完成です。おつかれさまでした。</p>
<h4>「階層有りタクソノミーの編集」画面</h4>
<p>ところが UI の作成はまだまだ終わらんのだよ。ヤリ始めたことをちょっと公開してないか？そう、うっかり［変更をプレビュー］と［更新］を押し間違えるアレだよ。投稿したよとつぶやいたのを無かったことにするプラグインはありませんか？<br />
<br />
ターム一覧で、ターム名または［編集］のリンクをクリックすると表示されるこの画面を作ります。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-4.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-4-620x241.jpg" alt="「動物」タクソノミーの編集" title="taxonomy-4" width="620" height="241" class="alignnone size-large wp-image-247" /></a>この画面は my-edit-categories.php?action=edit&amp;〜 のときにインクルードされる my-edit-category-form.php で出力します。これはもちろん edit-category-form.php をコピってタクソノミー対応したファイルです。これも wp-admin に放り込んでやります。</p>
<pre><code>+ &lt;input type="hidden" name="taxonomy" value="&lt;?php echo esc_attr($taxonomy) ?&gt;" /&gt;

タイトルの「カテゴリーの編集」をタクソノミー名に変更するなら
- &lt;h2&gt;&lt;?php _e('Edit Category'); ?&gt;&lt;/h2&gt;
+ &lt;h2&gt;&lt;?php echo get_taxonomy($taxonomy)-&gt;label; ?&gt;&lt;/h2&gt;
</code></pre>
<p>えええー！こんだけー？はい、こんだけです。なんという富豪プログラミング。</p>
<h4>投稿画面のメタボックス</h4>
<p>階層無しタクソノミーは何もしなくても表示されてるのがうらめしい完成イメージです。<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-5.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/taxonomy-5-620x378.jpg" alt="" title="taxonomy-5" width="620" height="378" class="alignnone size-large wp-image-248" /></a>早速メタボックスを作りましょう。なお、［すべてのカテゴリー］［よく使われるもの］［＋新規カテゴリー追加］に相当する UI は省略します。javascript がらみなのでね許しておくれよ。では、先ほど追加した <a href="#admin-menu">my_admin_menu() / functions.php</a> 内に以下を追加します。</p>
<pre><code>add_meta_box('taxonomydiv-animal', '動物', 'my_animal_meta_box', 'post', 'side', 'low');</code></pre>
<p>taxonomydiv-animal はメタボックスの id です。テキトウにつけます。投稿画面の右側の下の方に '動物' というタイトルのメタボックスを my_animal_meta_box() ファンクションを使って出力するよ、という意味です。<br />
その my_animal_meta_box() と下請けファンクションなども同様に functions.php に追加します。メンドクサくなったので差分はやめるよ。</p>
<pre><code>function my_animal_meta_box($post, $box){
?&gt;
&lt;div class="tabs-panel"&gt;
  &lt;ul class="list:category categorychecklist form-no-clear"&gt;
    &lt;?php my_category_checklist($post-&gt;ID, array('taxonomy' =&gt; 'animal', 'checked_ontop' =&gt; false)); ?>
  &lt;/ul&gt;
&lt;/div&gt;
&lt;?php
}

function my_category_checklist($post_id = 0, $args = array()) {
  $defaults = array(
    'taxonomy' =&gt; 'category',
    'checked_ontop' =&gt; true
  );
  extract( wp_parse_args($args, $defaults), EXTR_SKIP );
   
  $walker = new Walker_Taxonomy_Checklist;

  $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' =&gt; 'ids')));
  $args['popular_cats'] = get_terms( $taxonomy, array( 
    'fields' =&gt; 'ids', 'orderby' =&gt; 'count', 'order' =&gt; 'DESC', 'number' =&gt; 10, 'hierarchical' =&gt; false ) );
  $categories = (array) get_terms($taxonomy, array('get' =&gt; 'all'));
	  
  if ( $checked_ontop ) {
    $checked_categories = array();
    $keys = array_keys( $categories );
  
    foreach( $keys as $k ) {
      if ( in_array( $categories[$k]-&gt;term_id, $args['selected_cats'] ) ) {
        $checked_categories[] = $categories[$k];
        unset( $categories[$k] );
      }
    }
   
    echo call_user_func_array(array(&#038;$walker, 'walk'), array($checked_categories, 0, $args));
  }
  echo call_user_func_array(array(&#038;$walker, 'walk'), array($categories, 0, $args));
}

require_once(ABSPATH . '/wp-admin/includes/template.php');
class Walker_Taxonomy_Checklist extends Walker_Category_Checklist {
  function start_el(&#038;$output, $category, $depth, $args) {
    extract($args);

    $class = in_array( $category-&gt;term_id, $popular_cats ) ? ' class="popular-category"' : '';
    $output .= "\n&lt;li id='" . $args['taxonomy'] . "-$category-&gt;term_id'$class&gt;" . '&lt;label class="selectit"&gt;&lt;input value="' .
      $category-&gt;term_id . '" type="checkbox" name="post_' . $args['taxonomy'] . '[]" id="in-' . $args['taxonomy'] . '-' . 
      $category-&gt;term_id . '"' . (in_array( $category-&gt;term_id, $selected_cats ) ? ' checked="checked"' : "" ) . '/&gt; ' .
      esc_html( apply_filters('the_category', $category-&gt;name )) . '</label>';
  }
}

function my_save_post($post_id){
  if(defined('DOING_AUTOSAVE') &#038;& DOING_AUTOSAVE) 
    return $post_id;

  if('post' == $_POST['post_type']){
    if(!current_user_can('edit_post', $post_id))
      return $post_id;
  }else{
    return $post_id;
  }

  $post_animal = $_POST['post_animal'];
  if ( empty($post_animal) || 0 == count($post_animal) || !is_array($post_animal) )
    return $post_id;
	
  $post_animal = array_map('intval', $post_animal);
  $post_animal = array_unique($post_animal);
  wp_set_object_terms($post_id, $post_animal, 'animal');
}
add_action('save_post', 'my_save_post');</code></pre>
<p>my_category_checklist() の引数に <code>'checked_ontop' =&gt; true</code> を与えるとチェックの入っているタームが先（上）に表示されます。親子関係のタームをインデント表示するには先に作成した <a href="#my-head">my_head() / functions.php</a> で以下のスタイルを追加します。</p>
<pre><code>ul.categorychecklist ul{margin-left:18px;}</code></pre>
<p>こんだけやればカスタムタクソノミーはお腹いっぱいですね。ボクはもう今年は要らないです。皆さんは WordPress 3.0 を心待ちにしていてください。きっと edit-tags.php，edit-categories.php なんてのは作らずに edit-taxonomies.php とかに一本化していることでしょう。各種ファンクションも tag，category なんて名前はもう使わずに taxonomy で統一してますね きっと。さすが。<br />
<br />
そして！なんと今回の内容をダウンロードできるようにしましたので、皆様もぜひ車輪作りにチャレンジしてください。あなたのコードは全部持っておきたいの、というえびちゃんもご遠慮なくダウンロードしてくださいね。<br />
以上、今回の投稿は最近明朝づいている kz からでした。</p>
<h5>ダウンロード</h5>
<li><a href="http://wpxtreme.jp/cms/wp-content/plugins/download-monitor/download.php?id=3" title="">taxonomy-with-wordpress-2.9.2-or-lower&nbsp;&nbsp;version: 1.0</a> (.zip&nbsp;&nbsp;8.92 KB)</li>
<p>含まれるファイル：</p>
<ul>
<li>functions.php</li>
<li>my-edit-category.php</li>
<li>my-edit-category-form.php</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3/feed</wfw:commentRss>
		<slash:comments>40</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/how-to-use-cusom-taxonomy-with-wordpress-versions-lower-than-3" />
	</item>
		<item>
		<title>ボツデザインシリーズ #3</title>
		<link>http://wpxtreme.jp/unreleased-webdesign-3</link>
		<comments>http://wpxtreme.jp/unreleased-webdesign-3#comments</comments>
		<pubDate>Tue, 02 Mar 2010 17:24:32 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[PORTFOLIO]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[rejected]]></category>
		<category><![CDATA[webdesign]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=237</guid>
		<description><![CDATA[予想だにしない展開により、公開までたどりつけなかったデザインを紹介するこのコーナー。第3回は2週間ぶりの更新でお届けします。kz の安否を気遣うお便りの数々は一切届いておりません。未送信になっていないか今一度あなたのメールボックスのご確認をお願いいたします。ちなみに wpxtreme が更新されないと寂しくて眠れないの。というえびちゃんからのラブリーなメッセージも届いていません。きっと年度末だからすごく忙しいんでしょう。wpxtreme は働く女性を応援します。<br />
今回は、某語学学校関係のサイトリニューアルです。例によってロゴや文言はテキトウに差し替えております。意味不明なのがあっても気にしないでちょうだい。多言語対応、時間割管理など盛りだくさんな内容で公開寸前まで行きましたが、残念ながら初のボツ案件となりました。 <a class="excerpt-more" href="http://wpxtreme.jp/unreleased-webdesign-3">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>「ホーム」ページ<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/ecn-1.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/ecn-1-620x926.jpg" alt="" title="ホームページ" width="620" height="926" class="alignnone size-large wp-image-239" /></a><br />
その他ページ<a href="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/ecn-2.jpg"><img src="http://wpxtreme.jp/cms/wp-content/uploads/2010/03/ecn-2-620x772.jpg" alt="" title="その他のページ" width="620" height="772" class="alignnone size-large wp-image-240" /></a></p>
<h4>制作の様子</h4>
<p>現在のホームページは気に入っているが活用されておらず、今風のテクノロジーで色々やってみたい、とのリニューアル案件。web のお仕事を始めて 2ヶ月頃でした。<a href="http://wordpress.org/extend/plugins/qtranslate/">qTranslate</a> を導入して8ヶ国語対応，メルマガ配信，リアルタイムな時間割表，講座スケジュール表，javascript による Ajax でインタラクティブな英語力チェックなどなど非常に意欲的な内容で制作しました。<br />
基本的にすべて社長の判断、な組織でしかもその社長がしょっちゅう出張のため、こちらからお願いして web 担当者を選任していただきました。</p>
<h4>ボツの理由</h4>
<p>web 担当者言うても「社長に訊かないとわからないので」で、ホームページに掲載する写真のご提供をお願いすると3週間、社長との打ち合わせをセッティングしていただくのに2週間。なにかとやたらと時間がかかって、デザイン終わって制作に入ってほぼ公開できる状態になったところでやっと聞けた言葉が「今のサイト気に入ってるんだよね」。<br />
えぇ、確かに気に入ってるとは伺っておりましたけどが。<br />
90年代的なまったりフラッシュのスプラッシュ。IE でしか動作しない javascript。ほぼ VGA（640×480）に押し込められたページごとにバラバラなレイアウト。統一感の無いボタン。画面が小さい頃は大きく見えたのかなの極小フォント。テキスト無しで全面に画像貼り。<code>&lt;head&gt;</code> には <code>&lt;title&gt;</code> と <code>&lt;meta http-equiv="Content-Type" content="text/html;"&gt;</code> と javascript とスタイルのみ。<code>&lt;body&gt;&lt;table&gt;&lt;table&gt;&lt;table&gt;&lt;/table&gt;&lt;/table&gt;&lt;/table&gt;&lt;/body&gt;</code> なマークアップ。<br />
なんだかとっても poetry。そうですかお気に入りですかー。まぁ、アレですね、今のがお気に入りならそもそもリニューアルの必要ないですよね。サヨナラ。<br />
こういう場合はこのデザインではダメだよ、と早めにお知らせいただくと助かります。「あ、うんうんこんな感じで進めて」だと OK や思うやないですか。あと「今のホームページより文字が小さい」とかはもう「ええええぇー？！」なんでご勘弁願います。マジで。</p>
<p>なんやねんこれイライラするわなスプラッシュページがあったりですとか、ボタンが小さくてクリックしにくいやんけですとか、スカスカで中身あらへんやんですとか、デザイン，コンテンツ，SEO と様々な観点から残念な20世紀サイトを見る度に、なんでこれこのままほっといてんのやろと思います。<br />
なぁ、イカしたサイトにリニューアルしようぜ。俺に任せろって。マジで。</p>]]></content:encoded>
			<wfw:commentRss>http://wpxtreme.jp/unreleased-webdesign-3/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://wpxtreme.jp/unreleased-webdesign-3" />
	</item>
		<item>
		<title>WordPress+SimplePieでGoogle Buzzを表示する</title>
		<link>http://wpxtreme.jp/display-google-buzz-on-wordpress-with-simplepie</link>
		<comments>http://wpxtreme.jp/display-google-buzz-on-wordpress-with-simplepie#comments</comments>
		<pubDate>Wed, 17 Feb 2010 09:12:47 +0000</pubDate>
		<dc:creator>kz</dc:creator>
				<category><![CDATA[HOW-TO]]></category>
		<category><![CDATA[buzz]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[simplepie]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://wpxtreme.jp/?p=219</guid>
		<description><![CDATA[Google から twitter ライク（パクリ言わないの）なサービス <a href="http://www.google.com/buzz">Google Buzz</a> が利用できるようになりました。「ステータス メッセージの枠を超える機能」とか言うてますが Gmail とゴッチャだし twitter と比較すると諸々わかり難いのがアレですね。シンプルの方向性は twitter を見習った方がエンジニア以外のユーザーを取り込めて良いと思うよ。<br />
<a href="http://code.google.com/intl/ja/apis/buzz/">Google Buzz API</a> はまだこれから整備されるようですが、とりあえず新しいものには飛びついてみる wpxtreme なので、まずは簡単なところからタイムライン（って言うのか？）の表示をしてみましょう。とは言っても Atom feeds を取得するだけなので難しいことはありません。feed を取り扱うには WordPress に同梱されている <a href="http://simplepie.org/">SimplePie</a> を使います。せっかくなので Google Buzz を利用するまでの手順もご説明するぜ。<a class="excerpt-more" href="http://wpxtreme.jp/display-google-buzz-on-wordpress-with-simplepie">Continue Reading &#187;</a>]]></description>
			<content:encoded><![CDATA[