<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sun Limited Mt. &#187; WordPress</title>
	<atom:link href="http://blog.syuhari.jp/archives/category/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.syuhari.jp</link>
	<description>I love iPhone, CakePHP and WordPress.</description>
	<lastBuildDate>Thu, 20 Oct 2011 19:36:15 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>WordCamp Yokohama 5/29 開催！</title>
		<link>http://blog.syuhari.jp/archives/2113</link>
		<comments>http://blog.syuhari.jp/archives/2113#comments</comments>
		<pubDate>Sat, 01 May 2010 20:45:51 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[WordCamp]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=2113</guid>
		<description><![CDATA[WordCamp が横浜で 5/29 に開催されます。会場は都筑区にある東京都市大学です。 実は開催されることはずいぶん前に知っていたのですが、チェックを怠り受付が開始されていることを知りませんでした。慌てて参加登録しましたが、懇親会は既に満員でした（まあ懇親会は行きたいのですが、行けるか分からないのであれなのですが。）]]></description>
			<content:encoded><![CDATA[<p>WordCamp が横浜で 5/29 に開催されます。会場は都筑区にある東京都市大学です。</p>
<p>実は開催されることはずいぶん前に知っていたのですが、チェックを怠り受付が開始されていることを知りませんでした。慌てて参加登録しましたが、懇親会は既に満員でした（まあ懇親会は行きたいのですが、行けるか分からないのであれなのですが。）</p>
<p><a href="http://yokohama2010.wordcamp.jp/" target="_blank" class="liimagelink"><img src="http://www.syuhari.jp/blog/wp-content/uploads/2010/05/468_60_banner.jpg" alt="468_60_banner" title="468_60_banner" width="468" height="60" class="alignnone size-full wp-image-2114" /></a></p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F2113&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/2113/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WordPress] 予約投稿が失敗するときの対処法</title>
		<link>http://blog.syuhari.jp/archives/1941</link>
		<comments>http://blog.syuhari.jp/archives/1941#comments</comments>
		<pubDate>Thu, 03 Dec 2009 07:55:43 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[cron]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1941</guid>
		<description><![CDATA[WordPress では投稿の公開日時を予約することができます。しかし、予約投稿がうまく動作しないことがあります。予約投稿が失敗するときの解決方法です。 WordPress の予約投稿の仕組み 予約投稿は cron などで動作しているのではなく、ブログへのアクセスをトリガーにした疑似 cron になっています。 wp-includes/cron.php の wp_cron 関数で現在時刻で実行すべきイベントがあるかチェックしてあればそのイベントに起動します。 予約投稿では予約時刻が過ぎている投稿があると、publish_future_post というイベントが予約日時とともに登録されます。ブログへのアクセス時に wp_cron 関数で publish_future_post というイベントがあり、実行日時を過ぎていると、spawn_cron 関数が呼ばれます。この関数で WordPress のトップレベルにある wp_cron.php に HTTP リクエストを発行します。 wp-cron.php では処理すべきイベントに publish_future_post があると、wp-includes/posts.php の wp_publish_post 関数を呼びます。wp_publish_post 関数では、投稿の状態を公開状態に変更して、管理画面から行うのと同じ処理で編集、保存処理を行います。 予約投稿が失敗するときのチェックポイント サーバに SSH で接続して、以下のコマンドを実行します。 $ wget http://example.com/wp-cron.php このコマンドを実行して、サーバレスポンスで 200 が返ってくれば問題ありません。失敗している原因は他にあります。 もし、200 が返って来ないときや、接続ができないようなときはサーバ内から自ドメインの名前解決ができていないことが原因かもしれません。 予約投稿の仕組みで説明したように、WordPress は自分自身に対して HTTP リクエストを出します。そのために自分のドメインがサーバで解決できないとアクセスできずに予約投稿が失敗します。 解決策は /etc/hosts に以下のように指定します。 127.0.0.1 example.com [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress では投稿の公開日時を予約することができます。しかし、予約投稿がうまく動作しないことがあります。予約投稿が失敗するときの解決方法です。</p>
<h4>WordPress の予約投稿の仕組み</h4>
<p>予約投稿は cron などで動作しているのではなく、ブログへのアクセスをトリガーにした疑似 cron になっています。<br />
wp-includes/cron.php の wp_cron 関数で現在時刻で実行すべきイベントがあるかチェックしてあればそのイベントに起動します。<br />
<span id="more-1941"></span><br />
予約投稿では予約時刻が過ぎている投稿があると、publish_future_post というイベントが予約日時とともに登録されます。ブログへのアクセス時に wp_cron 関数で publish_future_post というイベントがあり、実行日時を過ぎていると、spawn_cron 関数が呼ばれます。この関数で WordPress のトップレベルにある wp_cron.php に HTTP リクエストを発行します。</p>
<p>wp-cron.php では処理すべきイベントに publish_future_post があると、wp-includes/posts.php の wp_publish_post 関数を呼びます。wp_publish_post 関数では、投稿の状態を公開状態に変更して、管理画面から行うのと同じ処理で編集、保存処理を行います。</p>
<h4>予約投稿が失敗するときのチェックポイント</h4>
<p>サーバに SSH で接続して、以下のコマンドを実行します。</p>
<pre class="shell">
$ wget http://example.com/wp-cron.php
</pre>
<p>このコマンドを実行して、サーバレスポンスで 200 が返ってくれば問題ありません。失敗している原因は他にあります。<br />
もし、200 が返って来ないときや、接続ができないようなときはサーバ内から自ドメインの名前解決ができていないことが原因かもしれません。</p>
<p>予約投稿の仕組みで説明したように、WordPress は自分自身に対して HTTP リクエストを出します。そのために自分のドメインがサーバで解決できないとアクセスできずに予約投稿が失敗します。</p>
<p>解決策は /etc/hosts に以下のように指定します。</p>
<pre class="shell">
127.0.0.1 example.com
</pre>
<p>ググっていると WordPress2.7 にしてから予約投稿が失敗するようになったという現象がちらほらあります。また、wp-includes/cron.php を WordPress2.7 以前のものにすると成功するというような話もあります。これは 2.7 から現在のように HTTP リクエストを出して予約投稿を公開状態にするようになったためだと思われます。</p>
<p>2.7 以前はソケット接続して wp-cron.php を呼び出していました。しかし、予約投稿すると ping が送信されないなどの不具合がありました。多分これを解消するために、通常の編集、保存処理をして公開するように HTTP リクエストを出すようにしたのでしょう。ですので、cron.php を書き換えての対処方法はオススメできません。</p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1941&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1941/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mac で poファイルを moファイルに変換する方法</title>
		<link>http://blog.syuhari.jp/archives/1835</link>
		<comments>http://blog.syuhari.jp/archives/1835#comments</comments>
		<pubDate>Mon, 28 Sep 2009 05:12:54 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[gettext]]></category>
		<category><![CDATA[mo]]></category>
		<category><![CDATA[po]]></category>
		<category><![CDATA[Terminal]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1835</guid>
		<description><![CDATA[多国語対応させるために gettext を使用します。WordPress などでも使われています。ざっくり説明すると、まずエディタで po ファイルを作成して、それをバイナリの mo ファイルに変換します。gettext はこの mo ファイルを使用して各国語に変換します。 Windows では poEdit など専用のソフトがありますが、Mac では手頃なソフトがないのでエディタで編集して msgfmt コマンドを使用して mo ファイルに変換します。 以下、変換方法です。 まず適当なエディタで編集する po ファイルを開き編集 ターミナルから以下のコマンドで mo ファイルに変換 $ msgfmt -o /path/to/file.mo /path/to/file.po]]></description>
			<content:encoded><![CDATA[<p>多国語対応させるために gettext を使用します。WordPress などでも使われています。ざっくり説明すると、まずエディタで po ファイルを作成して、それをバイナリの mo ファイルに変換します。gettext はこの mo ファイルを使用して各国語に変換します。</p>
<p>Windows では poEdit など専用のソフトがありますが、Mac では手頃なソフトがないのでエディタで編集して msgfmt コマンドを使用して mo ファイルに変換します。<br />
<span id="more-1835"></span><br />
以下、変換方法です。</p>
<ol>
<li>まず適当なエディタで編集する po ファイルを開き編集</li>
<li>ターミナルから以下のコマンドで mo ファイルに変換
<pre class="shell">
$ msgfmt -o /path/to/file.mo /path/to/file.po
</pre>
</li>
</ol>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1835&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1835/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WordPress] サイドバーウィジェットに対応したプラグイン作成方法</title>
		<link>http://blog.syuhari.jp/archives/1821</link>
		<comments>http://blog.syuhari.jp/archives/1821#comments</comments>
		<pubDate>Thu, 17 Sep 2009 01:01:30 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sidebar]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1821</guid>
		<description><![CDATA[WordPress でサイドバーウィジットに対応したプラグイン方法です。 管理画面にウィジェットを表示する 管理画面の「外観」>「ウィジェット」にウィジェットを表示する。 function widget_control() { echo "My Widget"; } register_widget_control('Widget Name', 'widget_control'); 以下のように表示されます。 このウィジェットをサイドバーにドラッグ&#038;ドロップすると以下のようになります。 ウィジェットの表示 ブログのサイドバーを表示した際に出力する内容を設定する。 function widget_view() { echo "My Widget"; } register_sidebar_widget('Widget Name', 'widget_view'); ウィジェットのオプションを設定する サイドバーにドラッグ&#038;ドロップした後に、ウィジェットのオプションを設定できるようにします。 widget_control 関数を下記のように変更します。値を設定できるような HTML タグを出力することと、POST された値を options に保存する処理を追加しています。 function widget_control() { if (isset($_POST['mywidget_value'])) { update_option('mywidget_option', $_POST['mywidget_value']); } $option = get_option('mywidget_option'); echo "My Widget"; echo "&#60;input type='text' [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress でサイドバーウィジットに対応したプラグイン方法です。</p>
<h4>管理画面にウィジェットを表示する</h4>
<p>管理画面の「外観」>「ウィジェット」にウィジェットを表示する。</p>
<pre class="php" name="code">
function widget_control() {
  echo "My Widget";
}
register_widget_control('Widget Name', 'widget_control');
</pre>
<p>以下のように表示されます。<br />
<img src="http://www.syuhari.jp/blog/wp-content/uploads/2009/09/スクリーンショット（2009-09-17-9-17木-9.26.27）.png" alt="スクリーンショット（2009-09-17 9-17木 9.26.27）" title="スクリーンショット（2009-09-17 9-17木 9.26.27）" width="267" height="70" class="size-full wp-image-1822" /><br />
<span id="more-1821"></span><br />
このウィジェットをサイドバーにドラッグ&#038;ドロップすると以下のようになります。<br />
<img src="http://www.syuhari.jp/blog/wp-content/uploads/2009/09/スクリーンショット（2009-09-17-9-17木-9.26.59）.png" alt="スクリーンショット（2009-09-17 9-17木 9.26.59）" title="スクリーンショット（2009-09-17 9-17木 9.26.59）" width="309" height="165" class="size-full wp-image-1823" /></p>
<h4>ウィジェットの表示</h4>
<p>ブログのサイドバーを表示した際に出力する内容を設定する。</p>
<pre class="php" name="code">
function widget_view() {
  echo "My Widget";
}
register_sidebar_widget('Widget Name', 'widget_view');
</pre>
<h4>ウィジェットのオプションを設定する</h4>
<p>サイドバーにドラッグ&#038;ドロップした後に、ウィジェットのオプションを設定できるようにします。<br />
widget_control 関数を下記のように変更します。値を設定できるような HTML タグを出力することと、POST された値を options に保存する処理を追加しています。</p>
<pre class="php" name="code">
function widget_control() {
  if (isset($_POST['mywidget_value'])) {
    update_option('mywidget_option', $_POST['mywidget_value']);
  }
  $option = get_option('mywidget_option');
  echo "My Widget";
  echo "&lt;input type='text' name='mywidget_value' value='".$option."' /&gt;";
}
</pre>
<p>これで以下のように表示されます。<br />
<img src="http://www.syuhari.jp/blog/wp-content/uploads/2009/09/スクリーンショット（2009-09-17-9-17木-9.50.17）.png" alt="スクリーンショット（2009-09-17 9-17木 9.50.17）" title="スクリーンショット（2009-09-17 9-17木 9.50.17）" width="305" height="177" class="size-full wp-image-1825" /></p>
<p>あとは widget_view関数の方で get_option() で設定した値を取得して表示に反映させたりします。</p>
<h4>管理画面のウィジェットに説明を入れる</h4>
<p>上記の例では、管理画面のウィジェット一覧でウィジェットの説明がウィジェット名と同じです。他のウィジェットと同様に説明を入れるには以下のようにします。</p>
<pre class="php" name="code">
$options['description'] = 'My Widget Description';
wp_register_sidebar_widget('Widget Name', 'Widget Name', 'widget_control' ,$options);
</pre>
<p>$options['description'] に設定した文字列がウィジェット名の下に説明として表示されます。<br />
<img src="http://www.syuhari.jp/blog/wp-content/uploads/2009/09/スクリーンショット（2009-09-17-9-17木-9.42.07）.png" alt="スクリーンショット（2009-09-17 9-17木 9.42.07）" title="スクリーンショット（2009-09-17 9-17木 9.42.07）" width="267" height="65" class="size-full wp-image-1824" /></p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1821&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1821/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[WordPress] カスタマイズした wpdb クラスを使用する方法</title>
		<link>http://blog.syuhari.jp/archives/1782</link>
		<comments>http://blog.syuhari.jp/archives/1782#comments</comments>
		<pubDate>Tue, 08 Sep 2009 07:25:58 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[wpdb]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1782</guid>
		<description><![CDATA[WordPress で DB にアクセスするには wpdb クラスを使います。グローバル変数 $wpdb でアクセスすることが可能です。 この辺のことは以下のエントリをご参考ください。 WordPress の設定を使ってデータベースにアクセスする方法 しかし、WordPress をカスタマイズする際にプラグインやテーマだけではどうしても出来ずに DB とのやり取りをカスタマイズしたい場合が出て来た時に、wpdb クラスを直接カスタマイズするのはバージョンアップの時などを考えるとやりたくありません。 そういう場合に有効な方法が wp-content/db.php をいうファイルを使う方法です。wpdb クラスは wp-includes/wp-db.php で定義されていますが、それを読み込んでいるのは wp-includes/functions.php の require_wp_db という関数です。その関数のコードは以下のようになっています。 /** * Load the correct database class file. * * This function is used to load the database class file either at runtime or by * wp-admin/setup-config.php We must [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress で DB にアクセスするには wpdb クラスを使います。グローバル変数 $wpdb でアクセスすることが可能です。<br />
この辺のことは以下のエントリをご参考ください。<br />
<a href="http://www.syuhari.jp/blog/archives/410" class="liinternal">WordPress の設定を使ってデータベースにアクセスする方法</a></p>
<p>しかし、WordPress をカスタマイズする際にプラグインやテーマだけではどうしても出来ずに DB とのやり取りをカスタマイズしたい場合が出て来た時に、wpdb クラスを直接カスタマイズするのはバージョンアップの時などを考えるとやりたくありません。<br />
<span id="more-1782"></span><br />
そういう場合に有効な方法が wp-content/db.php をいうファイルを使う方法です。wpdb クラスは wp-includes/wp-db.php で定義されていますが、それを読み込んでいるのは wp-includes/functions.php の require_wp_db という関数です。その関数のコードは以下のようになっています。</p>
<pre class="php" name="code">
/**
 * Load the correct database class file.
 *
 * This function is used to load the database class file either at runtime or by
 * wp-admin/setup-config.php We must globalise $wpdb to ensure that it is
 * defined globally by the inline code in wp-db.php.
 *
 * @since 2.5.0
 * @global $wpdb WordPress Database Object
 */
function require_wp_db() {
	global $wpdb;
	if ( file_exists( WP_CONTENT_DIR . '/db.php' ) )
		require_once( WP_CONTENT_DIR . '/db.php' );
	else
		require_once( ABSPATH . WPINC . '/wp-db.php' );
}
</pre>
<p>wp-content/db.php というファイルは素の WordPress にはないのですが、このファイルを作っておくと wp-db.php をインクルードせずに db.php をインクルードしてくれるようになります。つまり wpdb クラスのカスタマイズが可能ということです。</p>
<p>wp-content/db.php で以下のような感じで wpdb クラスを継承したクラスを定義してそのクラスのインスタンスを $wpdb に入れておけば、WordPress 全体でカスタマイズした wpdb クラスを使用することができます。</p>
<pre class="php" name="code">
require_once( ABSPATH . WPINC . '/wp-db.php' );
class my_wpdb extends wpdb {
    // カスタマイズしたい wpdb のメソッドをオーバーライドする
}
if ( ! isset($wpdb) ) {
    $wpdb = new my_wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
}
</pre>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1782&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1782/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WordPress]ダッシュボードに情報を表示するプラグインの作り方</title>
		<link>http://blog.syuhari.jp/archives/1786</link>
		<comments>http://blog.syuhari.jp/archives/1786#comments</comments>
		<pubDate>Tue, 08 Sep 2009 07:24:07 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[dashboard]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1786</guid>
		<description><![CDATA[WordPress のダッシュボードに情報を表示するプラグインを作成する方法です。 まず簡単な雛形から紹介 function my_plugin_dashboard_test() { echo "ダッシュボードに表示する内容"; } function my_plugin_dashboard_setup() { wp_add_dashboard_widget( 'my_plugin_dashboard_test', __( 'Widget Title' ), 'my_plugin_dashboard_test'); } add_action('wp_dashboard_setup', 'my_plugin_dashboard_setup'); ダッシュボードから設定を変更する方法 ダッシュボードウィジットによってはウィジットの右上に「設定」というリンクがあり、クリックすると値などを変更できるものがあります。 wp_add_dashboard_widget 関数は wp-admin/includes/dashboard.php で以下のように定義されています。 function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null ) 最初の例では第４引数の $controll_callback は定義していません。この $control_callback を設定するとダッシュボードウィジットに「設定」というリンクがつきます。この設定をクリックすると、$control_callback で指定した関数で出力した内容が表示されます。この表示は以下のようになります。 &#60;form action=&#34;&#34; method=&#34;post&#34; class=&#34;dashboard-widget-control-form&#34;&#62; ここに $control_callback で出力した内容が表示される &#60;p class='submit'&#62; &#60;input type='hidden' name='widget_id' [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress のダッシュボードに情報を表示するプラグインを作成する方法です。</p>
<h4>まず簡単な雛形から紹介</h4>
<pre class="php" name="code">
function my_plugin_dashboard_test() {
    echo "ダッシュボードに表示する内容";
}
function my_plugin_dashboard_setup() {
	wp_add_dashboard_widget( 'my_plugin_dashboard_test', __( 'Widget Title' ),  'my_plugin_dashboard_test');
}
add_action('wp_dashboard_setup', 'my_plugin_dashboard_setup');
</pre>
<p><span id="more-1786"></span></p>
<h4>ダッシュボードから設定を変更する方法</h4>
<p>ダッシュボードウィジットによってはウィジットの右上に「設定」というリンクがあり、クリックすると値などを変更できるものがあります。</p>
<p>wp_add_dashboard_widget 関数は wp-admin/includes/dashboard.php で以下のように定義されています。</p>
<pre class="php" name="code">
function wp_add_dashboard_widget( $widget_id, $widget_name, $callback, $control_callback = null )
</pre>
<p>最初の例では第４引数の $controll_callback は定義していません。この $control_callback を設定するとダッシュボードウィジットに「設定」というリンクがつきます。この設定をクリックすると、$control_callback で指定した関数で出力した内容が表示されます。この表示は以下のようになります。</p>
<pre class="html" name="code">
&lt;form action=&quot;&quot; method=&quot;post&quot; class=&quot;dashboard-widget-control-form&quot;&gt;
ここに $control_callback で出力した内容が表示される
&lt;p class='submit'&gt;
&lt;input type='hidden' name='widget_id' value='suzuki_news_dashboard_test' /&gt;
&lt;input type='submit' value='実行' /&gt;
&lt;/p&gt;
&lt;/form&gt;
</pre>
<p>つまり、$controll_callback で指定した関数でフォームの内容を出力すれば、それを POST で受け取れます。例えば $controll_callback に my_plugin_option と設定すれば、以下のようにして options テーブルに値を入れておくことも可能です。</p>
<pre class="php" name="code">
function my_plugin_option() {
  if ( 'post' == strtolower($_SERVER['REQUEST_METHOD']) &#038;&#038;
       isset( $_POST['widget_id'] ) &#038;&#038;
       'my_plugin_dashboard_test' == $_POST['widget_id'] ) {
    foreach ( array( 'hoge', 'foo' ) as $key )
      $options[$key] = $_POST[$key];
      update_option( 'my_plugin_dashboard', $options );
    }
  }

  // form に表示する内容
}
</pre>
<p>ちなみに $controll_callback 関数で出力する内容は「設定」をクリックしたときに実行されるのではなく、ダッシュボードが表示されたときに実行され、CSS により非表示になっているだけです。</p>
<p>参考 URL<br />
<a href="http://rick.jinlabs.com/2009/02/01/how-add-options-to-your-wordpress-27-dashboard-widgets/" target="_blank" class="liexternal">Rick’s HideOut ? How add options to your WordPress 2.7 dashboard widgets &#8211; Archivo</a></p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1786&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1786/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSL 通信で Flash Player は自己署名証明書を受け付けない</title>
		<link>http://blog.syuhari.jp/archives/1756</link>
		<comments>http://blog.syuhari.jp/archives/1756#comments</comments>
		<pubDate>Fri, 28 Aug 2009 00:47:30 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[SWFUpload]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1756</guid>
		<description><![CDATA[WordPress の Flash Uploader が管理画面を SSL にしたところ &#8220;IO error&#8221; と出てアップロードできなくなってしまった。HTML アップローダーでは問題なくアップロードできる。 調べたところ、以下の Adobe の Tech Note に回答があった。 SSL 通信における Flash Player の問題 Flash Player ActiveX コントロールは、ブラウザに手動で追加されたもの以外の自己署名証明書（Self-Signed Certificate）を信用しません。この問題は、ユーザがテストサーバにインストールされた完全な SSL 認証を望まない場合、テスト環境でよく見られる現象です。 テストサーバの SSL 証明書が正式なものではなく自己署名証明書だったのが原因のようでした。 参考サイト SSL経由でSWFUploadするとIO Error（#2038）が発生する ? 岩家ぶろぐ]]></description>
			<content:encoded><![CDATA[<p>WordPress の Flash Uploader が管理画面を SSL にしたところ &#8220;IO error&#8221; と出てアップロードできなくなってしまった。HTML アップローダーでは問題なくアップロードできる。</p>
<p><img src="http://www.syuhari.jp/blog/wp-content/uploads/2009/08/ピクチャ-12.png" alt="ピクチャ 1" title="ピクチャ 1" width="352" height="213" class="alignnone size-full wp-image-1758" /><br />
<span id="more-1756"></span><br />
調べたところ、以下の Adobe の Tech Note に回答があった。<br />
<a href="http://www.adobe.com/jp/support/kb/ts/228/ts_228476_ja-jp.html" target="_blank" class="liexternal">SSL 通信における Flash Player の問題</a></p>
<blockquote><p>Flash Player ActiveX コントロールは、ブラウザに手動で追加されたもの以外の自己署名証明書（Self-Signed Certificate）を信用しません。この問題は、ユーザがテストサーバにインストールされた完全な SSL 認証を望まない場合、テスト環境でよく見られる現象です。</p></blockquote>
<p>テストサーバの SSL 証明書が正式なものではなく自己署名証明書だったのが原因のようでした。</p>
<p>参考サイト<br />
<a href="http://blog.iwa-ya.net/2009/07/29/100830" target="_blank" class="liexternal">SSL経由でSWFUploadするとIO Error（#2038）が発生する ? 岩家ぶろぐ</a></p>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1756&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1756/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress Mu のアクション一覧</title>
		<link>http://blog.syuhari.jp/archives/1748</link>
		<comments>http://blog.syuhari.jp/archives/1748#comments</comments>
		<pubDate>Fri, 21 Aug 2009 07:06:01 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[WordPress Mu]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1748</guid>
		<description><![CDATA[WordPress でプラグインを作成するときに、アクション・フックを使うことが多くなります。WordPress のアクションフックは下記のページで一覧になっていますが、WordPress Mu で追加されたアクションフックの一覧は探してみても見つかりませんでした。 プラグイン API/アクションフック一覧 &#8211; WordPress Codex 日本語版 そこで、自分で一覧を作成してみました。作成方法は wpmu- で始まるソースから do_action を探してアクション名を拾いました。一部 WordPress 用のアクションも入っているかもしれません。また漏れがあるかもしれませんが、これで WordPress Mu 用のプラグイン作成時にかなり助かりましたので、参考までに載せておきます。使用した WordPress Mu のバージョンは 2.8.2 です。 アクション名からだいたいアクションの概要は分かるかと思います。 アクション名 引数 activate_blog $id activate_sitewide_plugin $plugin add_user_to_blog $user_id, $role, $blog_id added_existing_user $user_id archive_blog $id deactivate_blog $id deactivate_sitewide_plugin $plugin make_ham_blog $id make_spam_blog $id manage_blogs_custom_column $column_name, $blog_id manage_users_custom_column $column_name, $user_id [...]]]></description>
			<content:encoded><![CDATA[<p>WordPress でプラグインを作成するときに、アクション・フックを使うことが多くなります。WordPress のアクションフックは下記のページで一覧になっていますが、WordPress Mu で追加されたアクションフックの一覧は探してみても見つかりませんでした。</p>
<p><a href="http://wpdocs.sourceforge.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7" target="_blank" class="liexternal">プラグイン API/アクションフック一覧 &#8211; WordPress Codex 日本語版</a></p>
<p>そこで、自分で一覧を作成してみました。作成方法は wpmu- で始まるソースから do_action を探してアクション名を拾いました。一部 WordPress 用のアクションも入っているかもしれません。また漏れがあるかもしれませんが、これで WordPress Mu 用のプラグイン作成時にかなり助かりましたので、参考までに載せておきます。使用した WordPress Mu のバージョンは 2.8.2 です。<br />
<span id="more-1748"></span><br />
アクション名からだいたいアクションの概要は分かるかと思います。</p>
<table border="1" cellpadding="5" cellspacing="0">
<tr>
<th>アクション名</th>
<th>引数</th>
<tr>
<td>activate_blog</td>
<td> $id</td>
</tr>
<tr>
<td>activate_sitewide_plugin</td>
<td> $plugin</td>
</tr>
<tr>
<td>add_user_to_blog</td>
<td> $user_id, $role, $blog_id</td>
</tr>
<tr>
<td>added_existing_user</td>
<td> $user_id</td>
</tr>
<tr>
<td>archive_blog</td>
<td> $id</td>
</tr>
<tr>
<td>deactivate_blog</td>
<td> $id</td>
</tr>
<tr>
<td>deactivate_sitewide_plugin</td>
<td> $plugin</td>
</tr>
<tr>
<td>make_ham_blog</td>
<td> $id</td>
</tr>
<tr>
<td>make_spam_blog</td>
<td> $id</td>
</tr>
<tr>
<td>manage_blogs_custom_column</td>
<td> $column_name, $blog_id</td>
</tr>
<tr>
<td>manage_users_custom_column</td>
<td> $column_name, $user_id</td>
</tr>
<tr>
<td>mature_blog</td>
<td> $id</td>
</tr>
<tr>
<td>mu_activity_box_end</td>
<td></td>
</tr>
<tr>
<td>mu_rightnow_end</td>
<td></td>
</tr>
<tr>
<td>remove_user_from_blog</td>
<td> $user_id, $blog_id</td>
</tr>
<tr>
<td>switch_blog</td>
<td> $blog_id, $prev_blog_id</td>
</tr>
<tr>
<td>unarchive_blog</td>
<td> $id</td>
</tr>
<tr>
<td>unmature_blog</td>
<td> $id</td>
</tr>
<tr>
<td>unspam_blog</td>
<td> $id</td>
</tr>
<tr>
<td>update_blog_public</td>
<td></td>
</tr>
<tr>
<td>update_wpmu_options</td>
<td></td>
</tr>
<tr>
<td>wpmu_activate_blog</td>
<td> $blog_id, $user_id, $password, $title, $meta</td>
</tr>
<tr>
<td>wpmu_activate_user</td>
<td> $user_id, $password, $meta</td>
</tr>
<tr>
<td>wpmu_blog_updated</td>
<td> $blog_id</td>
</tr>
<tr>
<td>wpmu_new_blog</td>
<td> $blog_id, $user_id</td>
</tr>
<tr>
<td>wpmu_new_user</td>
<td> $user_id</td>
</tr>
<tr>
<td>wpmu_options</td>
<td></td>
</tr>
<tr>
<td>wpmu_update_blog_options</td>
<td></td>
</tr>
<tr>
<td>wpmuadminedit</td>
<td> </td>
</tr>
<tr>
<td>wpmuadminresult</td>
<td> </td>
</tr>
<tr>
<td>wpmublogsaction</td>
<td> $blog_id</td>
</tr>
<tr>
<td>wpmueditblogaction</td>
<td> $id</td>
</tr>
</table>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1748&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1748/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WordPress] ユーザ情報を取得する方法</title>
		<link>http://blog.syuhari.jp/archives/1718</link>
		<comments>http://blog.syuhari.jp/archives/1718#comments</comments>
		<pubDate>Fri, 14 Aug 2009 01:59:43 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[user]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1718</guid>
		<description><![CDATA[WordPress でユーザ情報を取得する方法です。 取得できる情報は wp_users テーブル、wp_usermeta テーブルの情報です。 ログインしているユーザ情報を取得する $user = wp_get_current_user(); ユーザID を指定してユーザ情報を取得する $user = new WP_User($user_id);]]></description>
			<content:encoded><![CDATA[<p>WordPress でユーザ情報を取得する方法です。<br />
取得できる情報は wp_users テーブル、wp_usermeta テーブルの情報です。</p>
<h4>ログインしているユーザ情報を取得する</h4>
<pre class="php" name="code">
$user = wp_get_current_user();
</pre>
<p><span id="more-1718"></span></p>
<h4>ユーザID を指定してユーザ情報を取得する</h4>
<pre class="php" name="code">
$user = new WP_User($user_id);
</pre>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1718&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1718/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WordPress] XML-RPC を使用する方法</title>
		<link>http://blog.syuhari.jp/archives/1373</link>
		<comments>http://blog.syuhari.jp/archives/1373#comments</comments>
		<pubDate>Fri, 24 Apr 2009 06:27:46 +0000</pubDate>
		<dc:creator>matsuura</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XML-RPC]]></category>

		<guid isPermaLink="false">http://www.syuhari.jp/blog/?p=1373</guid>
		<description><![CDATA[XML-RPC を使用して、WordPress に投稿する方法です。 XML-RPC とは簡単に言うと XML を HTTP でやり取りしてリモート手続き呼び出しを行うための方法です。非常に簡単な仕様で、仕様書も短いですので興味のある方は下記サイトで仕様を確認してください。 XML-RPC Specification XML-RPC 仕様書　（上記仕様の日本語訳） その他の参考サイト PEAR の XML_RPC のマニュアル Manual :: XML_RPC WordPress でサポートされている XML-RPC API Blogger API MetaWeblog API Movable Type API WordPress の XML-RPC API XML-RPC wp ? WordPress Codex 日本語の情報では下記サイトが見やすくまとめられています。 MovableType で使える XML-RPC API 準備 PHP で XML-RPC を使用するときに PEAR の XML_RPC を使うと非常に簡単です。下記コマンドでインストールします。 [...]]]></description>
			<content:encoded><![CDATA[<p>XML-RPC を使用して、WordPress に投稿する方法です。</p>
<p>XML-RPC とは簡単に言うと XML を HTTP でやり取りしてリモート手続き呼び出しを行うための方法です。非常に簡単な仕様で、仕様書も短いですので興味のある方は下記サイトで仕様を確認してください。<br />
<a href="http://www.xmlrpc.com/spec" target="_blank" class="liexternal">XML-RPC Specification</a><br />
<a href="http://lowlife.jp/yasusii/stories/9.html" target="_blank" class="liexternal">XML-RPC 仕様書</a>　（上記仕様の日本語訳）<br />
<span id="more-1373"></span><br />
その他の参考サイト<br />
PEAR の XML_RPC のマニュアル<br />
<a href="http://pear.php.net/manual/ja/package.webservices.xml-rpc.php" target="_blank" class="liexternal">Manual :: XML_RPC</a></p>
<p>WordPress でサポートされている XML-RPC API<br />
<a href="http://code.blogger.com/" target="_blank" class="liexternal">Blogger API</a><br />
<a href="http://www.xmlrpc.com/metaWeblogApi" target="_blank" class="liexternal">MetaWeblog API</a><br />
<a href="http://www.sixapart.com/developers/xmlrpc/movable_type_api/" target="_blank" class="liexternal">Movable Type API</a></p>
<p>WordPress の XML-RPC API<br />
<a href="http://codex.wordpress.org/XML-RPC_wp" target="_blank" class="liwp">XML-RPC wp ? WordPress Codex</a></p>
<p>日本語の情報では下記サイトが見やすくまとめられています。<br />
<a href="http://www.na.rim.or.jp/~tsupo/program/blogTool/mt_xmlRpc.html" target="_blank" class="liexternal">MovableType で使える XML-RPC API</a></p>
<h4>準備</h4>
<p>PHP で XML-RPC を使用するときに PEAR の XML_RPC を使うと非常に簡単です。下記コマンドでインストールします。</p>
<pre class="shell">
# pear install XML_RPC
</pre>
<p>WordPress が当然必要になるのですが、実際に公開しているブログでテストするのはあれなので、ローカルサーバにテスト用の WordPress をインストールしました。WordPress 2.7 では XML-RPC がデフォルトで使用できないようになっていますので、「設定」>「投稿設定」の中にある XML-RPC のチェックボックスにチェックを入れてます。これで WordPress の XML-RPC が有効になります。</p>
<h4>ブログ情報の取得</h4>
<p>WordPress の URL が http://example.com/wordpress/ だとすると host は example.com 、XML-RPC サーバ（xmlrpc.php）へのパスは /wordpress/xmlrpc.php となります。<br />
ユーザ名とパスワードには WordPress に登録したユーザを指定します。appkey という項目は Blogger API で使用しますが、WordPress では使われない項目なので空白でかまいません。</p>
<p>記事を投稿したりするときには、blog_id が必要になるのでまず下記のようにして、blog_id を取得します。実際には blog_id の他にも URL やブログ名、ユーザの属性などが取得できます。</p>
<pre class="php" name="code">
require_once("XML/RPC.php");

$host = "example.com";
$xmlrpc_path = "/wordpress/xmlrpc.php";
$appkey = '';
$user = 'username';
$passwd ='password';

$c = new XML_RPC_client($xmlrpc_path, $host, 80);
$appkey = new XML_RPC_Value($appkey, 'string');
$username = new XML_RPC_Value( $user, 'string' );
$passwd = new XML_RPC_Value( $passwd, 'string' );

$message = new XML_RPC_Message(
    'blogger.getUsersBlogs',
    array($appkey, $username, $passwd) );

$result = $c->send($message);

if( !$result ){
 	exit('Could not connect to the server.');
}else if( $result->faultCode() ){
 	exit($result->faultString());
}
$blogs = XML_RPC_decode($result->value());

$blog_id = new XML_RPC_Value($blogs[0]["blogid"], "string");
</pre>
<h4>Recent Post の取得</h4>
<pre class="php" name="code">
$numbers = new XML_RPC_Value(20, "int");
$message = new XML_RPC_Message(
    'metaWeblog.getRecentPosts',
    array($blog_id, $username, $passwd, $numbers) );

$result = $c->send($message);

if( !$result ){
    exit('Could not connect to the server.');
}else if( $result->faultCode() ){
    exit($result->faultString());
}
$posts = array_map(
    'array_convEnc',
    XML_RPC_decode($result->value())
);

function array_convEnc($a){
    if( is_array($a) ){ return array_map( 'array_convEnc', $a ); }
    return mb_convert_encoding($a, mb_internal_encoding(),'UTF-8');
}
</pre>
<h4>ファイルのアップロード</h4>
<p>写真などのファイルをアップロードすることもできます。記事に写真を入れたい時には予めファイルをアップロードしておく必要があります。アップロード後に URL など取得できるのでそれを投稿する時に使用します。</p>
<pre class="php" name="code">
$image = file_get_contents("/path/to/filename.jpg");
$file = array(
    "bits" => new XML_RPC_Value($image, "base64"),
    "name" => new XML_RPC_Value("filename.jpg", "string"),
);
$file = new XML_RPC_Value($file, "struct");
$message = new XML_RPC_Message(
    'metaWeblog.newMediaObject',
    array($blog_id, $username, $passwd, $file)
);
$result = $c->send($message);
if( !$result ){
    exit('Could not connect to the server.');
}else if( $result->faultCode() ){
    exit($result->faultString());
}
$resp = XML_RPC_decode($result->value());
$image_url = $resp["url"];
</pre>
<h4>記事の投稿</h4>
<p>タイトルやカテゴリ、本文、投稿日時、公開するか下書きにするかなどを指定します。</p>
<pre class="php" name="code">
$title = 'TITLE';
$categories = array(
    new XML_RPC_Value("category name1", "string"),
    new XML_RPC_Value("category name2", "string")
);
$description = "ここに本文を入れます。&lt;p&gt;HTML も書けます&lt;/p&gt;&lt;img src='".$image_url."'&gt;";
$content = new XML_RPC_Value(
    array(
        'title' => new XML_RPC_Value($title, 'string'),
        'categories' => new XML_RPC_Value($categories, 'array'),
        'description' => new XML_RPC_Value($description, 'string'),
        'dateCreated' => new XML_RPC_Value(time(), 'dateTime.iso8601')
    ),
    'struct');
$publish = new XML_RPC_Value(1, "boolean");
$message = new XML_RPC_Message(
    'metaWeblog.newPost',
    array($blog_id, $username, $passwd, $content, $publish));

$result = $c->send($message);

if( !$result ){
    exit('Could not connect to the server.');
}else if( $result->faultCode() ){
    exit($result->faultString());
}
$post_id = XML_RPC_decode($result->value());
</pre>
<p>metaWeblog.newPost でカテゴリを指定するときは 配列にする必要があり、またカテゴリ名で指定しなければいけません。blogger.newPost ではタイトルやカテゴリは本文と一緒に下記のように指定します。そのときのカテゴリの指定はカテゴリID だったのでちょっとはまりました。</p>
<pre class="php" name="code">
$content = "&lt;title&gt;TITLE&lt;/title&gt;&lt;category&gt;4&lt;/category&gt;本文...";
</pre>
<iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.syuhari.jp%2Farchives%2F1373&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>]]></content:encoded>
			<wfw:commentRss>http://blog.syuhari.jp/archives/1373/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
	</channel>
</rss>

