シングルサイトをマルチサイトに引っ越す

いままでシングルサイトとして運営していたデータをWordPress3.0のマルチサイトとして移行するには、phpMyAdminでインポート作業を行う。
MySQLのテーブル接頭辞が以下のようになっているとして、

・移行元:wp_
・移行先(2つめのブログ):wp_2_

移行元のwp_というテーブルが、移行先の2つめのブログとなるwp_2_というテーブルに上書きされるようにする。インポートするのはwp_options、wp_users以外のテーブル全部、と思っておけばよい(この2つは絶対に移してはいけない)。そうすれば投稿やカテゴリ、コメントなどのほかContact Form 7といったプラグインのテーブルも移行される。

さらに投稿者の再設定を行う。投稿者はwp-postsにユーザIDが入っているため、新しい環境のユーザIDに書き換える必要がある。phpMyAdminでクエリを発行して書き換える。

子テーマを作る

7/17(土)に行われたWordBench埼玉の勉強会に参加した。
アジェンタは、
・WordPress3.0のデフォルトテーマ「Twenty Ten」
・データベース負荷分散

ここで初めて知ったのは、子テーマという概念だ。あるテーマをフレームワークとして利用できるもので、3.0の新機能というわけではないものの「Twenty Ten」ベースにすることによって、3.0を最大限に生かしたテーマが作成できるとのことだ。

子テーマを作成するには、style.css冒頭のコメント部分に以下を加える。
[sourcecode language=’php’]
Template: twentyten
[/sourcecode]

twentytenというディレクトリのテーマを継承する、という意味になる。最低限このstyle.cssだけを用意すれば、子テーマとして利用可能となる。あとは、必要に応じてテンプレートやfunction.phpをオーバーライドしていけばよい。注意したいのは、function.phpの中に親テーマと同じ関数名がある場合は、子テーマの関数のみが有効になるということだ。
Twenty Tenを複製してからテーマを作る場合に比べて、将来WordPressのバージョンアップによってTwenty Tenが更新された場合に、子テーマも自動的にバージョンアップされるというメリットがある。

ひとりでは気づかないこともあるので、たまには勉強会よいな。子テーマをさっそく作ってみたい!

参考:子テーマ – WordPress Codex 日本語版

ブラウザにフィードアイコンを表示するには

feedブラウザ(FireFoxであればアドレスバーの右端)にフィードアイコンを表示するにはHTMLの<head>内に<link rel=”alternate”…>でフィードのURLを指定する。
WordPressの場合もちろん同様でもよいが、function.phpでautomatic_feed_links();を呼ぶと、自動的に<head>内に<link rel=”alternate”…>が挿入される。

WordPress3.0のデフォルトデーマを見ると、この部分は”after_setup_theme”という新しいフックを利用している。

[sourcecode language=’php’]
function my_theme_setup() {
add_theme_support( ‘automatic-feed-links’ );
}
add_action( ‘after_setup_theme’, ‘my_theme_setup’ );
[/sourcecode]

テーマでウィジェット対応

widgetいつかはWordPress.org にテーマを登録してみたい。それにはウィジェット対応が必須なため、ちょっとやってみた。
テーマでウィジェットに対応するには、widgets_init フックを利用してウィジェットを表示するエリアを登録する。functions.phpでウィジェット領域のidや、ウィジェットの前後のタグを指定する。こうしておくことで管理画面の[外観]-[ウィジェット]の設定でウィジェットを選択することができるようになる。

[sourcecode language=’php’]
function my_widgets_init() {

  if ( function_exists(‘register_sidebar’) ){
    register_sidebar( array (
      ’name’ => ‘widget-area’,
      ’id’ => ‘widget-area’,
      ’description’ => ‘Widget Area for sidebar’,
      ’before_widget’ => ‘

‘,
      ’after_widget’ => ‘

‘,
      ’before_title’ => ‘

‘,
      ’after_title’ => ‘

‘,
   ) );
 }
}

add_action( ‘widgets_init’, ‘my_widgets_init’ );

[/sourcecode]

ウィジェットの表示はsidebar.phpで行う。以下の例では、上記で登録した’widget-area’を表示する。ウィジェットがひとつも登録されていない場合には、代替としてカテゴリーの一覧を表示する。

[sourcecode language=’php’]

if(!dynamic_sidebar(‘widget-area’)): ?>
  

[/sourcecode]

ウィジェットはアーカイブ、タグクラウド、カレンダーなどデフォルトで用意されているほかにプラグインでも提供されている。WordPress 2.8以降ではウィジェットを簡単に作成できるクラスも提供されている。

WP-Furigana ふりがなを自動入力するプラグイン

wp-furigana投稿画面で、ふりがなを自動入力するプラグインを作成した。
個人ブログ「お菓子の虜」で、お菓子名のふりがなをカスタムフィールドに手入力する手間を、なんとか軽減できないかと思っていたのを実現したものだ。以前はお菓子データをAccessで管理していたため、ふりがなの機能が付いていたのだ。
さて今回のプラグインでは、投稿タイトルを入力しフォーカス移動した際にふりがなが空白であれば、自動的に設定するようにした。カスタムフィールドを使っているので、手修正も可能だ。すでに何かしら入力されている場合はなにもしない。
誰もが欲しい機能ではないものの、本人としてはまずまずの使い心地である。

ふりがなを取得するには、Yahoo! JAPANが提供している「日本語形態素解析」というWeb APIを利用した。プラグインを使う際にYahoo! JAPANのアプリケーション IDを取得し、設定画面から登録する必要がある。

プラグインを初めて公開するということで、PoEditを使いながら翻訳処理もやってみた。
ダウンロード:WP-Furigana ふりがなを自動入力するプラグイン

プラグインの管理画面をカスタマイズ

setting以前メモしたことのある、ダッシュボードにメニューを追加する方法の詳細。

プラグインに設定画面を追加するには、admin_menuというアクションフックを利用する。add_options_page()でダッシュボードのサイドメニューに項目を追加し、コールバック関数で設定画面を表示する。
設定画面はパラメータを入力するためのフォームとなる。フォームのactionに自分自身のURLを設定しておく。submitされた際にはパラメータがPOSTされてくるので、その場合の処理を入れておく。受け取ったパラメータをupdate_option()で、保存すればよい。すでにパラメータが保存されている場合はget_option()で取得することができるので、それをフォーム内のvalueとして表示する。

さらにplugin_action_linksというフィルタを利用すると、プラグインの管理に”設定”メニューを追加することができる。”設定”がクリックされた場合の処理は、上記のコールバック関数になる。こちらはあってもなくてもよいわりには苦戦した。

[sourcecode language=’php’]
add_action(‘admin_menu’, ‘add_config_page’);

function add_config_page(){

add_options_page(‘MyPlugin’, ‘MyPlugin’, 10, basename(__FILE__), ‘config_page’);
add_filter( ‘plugin_action_links’, ‘filter_plugin_actions’, 10, 2 );
}

function filter_plugin_actions( $links, $file ){

static $this_plugin;
if ( ! $this_plugin ) $this_plugin = plugin_basename(__FILE__);

if ( $file == $this_plugin ){
$settings_link = ‘Settings‘;
array_unshift( $links, $settings_link );
}
return $links;
}

function config_page(){

$my_param = ”;

if( isset( $_POST[‘submit’] ) && isset( $_POST[“my_param”] )){
$my_param = $_POST[“my_param”];
update_option( “my_param”, $my_param);
}
else{
$my_param = get_option(“my_param”);
}

?>

My Plugin


管理メニューの追加 – WordPress Codex 日本語版

WordPress 3.0 がリリース

WordPress 3.0の日本語版がリリースされた。
大きな変化は複数サイトを管理できることだろう。さっそく試してみた。複数サイトにするには、wp-config.phpに、
[sourcecode language=’php’]
define(‘WP_ALLOW_MULTISITE’, true);
[/sourcecode]
の1文を加える。すると[ツール]-[ネットワーク]メニューに手順が示されるので、それに従ってwp-config.phpや.htaccessを修正する。ログインしなおすと、特権管理者としてサイトを追加することができる。サイトを追加すると、WP_と同じDB内にWP_2_という接頭辞のテーブルがもうワンセットできていた。
参考:ネットワークの作成 – WordPress Codex 日本語版

archive新しいデフォルトのテーマは、HTML5対応の「Twenty Ten」だ。新機能がもりこまれたたテーマとのこと、すこしづつ眺めていきたい。
うまく使えるかな?いろいろ楽しみ!

single.phpが2回呼ばれる

投稿が表示された回数を、single.phpのタイミングでカウントしようとした。MySQLにテーブルを作成して、postIDと参照回数を記録していく。ところがpostID=1の記事を表示した際に、postID=1とpostID=4の2行更新される。1の次は4が登録されていることに関係があるのか。なぜかsingle.phpが2回呼ばれているようにみえる。
defaltテーマでも再現するため、プラグインを疑ってみた。「Top Level Categories Fix」を無効にすると、single.phpは1回しか呼ばれなくなった。これは、パーマリンクの設定がカスタム構造(/%category%/%postname%/)になっているときに、URLから”category”を削除するプラグインだ。そもそもカテゴリ名を含んだパーマリンクは非推奨ではあるが。CMSとして利用する場合にURLにIDや日付が入っていてはかっこ悪いため、「Top Level Categories Fix」を有効にすることが多い。
うまく回数を数える方法はないものか。

投稿一覧の表示件数

管理画面で投稿一覧の表示件数を変更できることを、いまさらながら知った。
右上あたりの[表示オプション]をクリックすると設定項目がある。ここで一覧の表示件数や表示項目を指定することができる。ダッシュボードに表示する項目や、編集画面で表示しない項目を指定することもできる。
業務によってはタグやコメントを使わない場合もあるので、非表示にしておいたほうがユーザにはわかりやすい。

投稿編集の一覧をカスタマイズ

管理画面の投稿編集の一覧に表示されるのは、通常[タイトル][作成者][カテゴリー][タグ][コメント数][日付]となっている。ここに項目を追加することができる。
以下は、右端の列に添付画像の1枚目のサムネイルを表示している。

[sourcecode language=’php’]

function my_post_column($columns) {
$columns[‘thumbnail’] = ‘添付画像’;
return $columns;
}

function my_custom_column($column, $id){

if($column == ‘thumbnail’){

$attachments = get_children(array(‘post_parent’ => $id, ‘post_type’ => ‘attachment’, ‘post_mime_type’ => ‘image’, ‘orderby’ => ‘menu_order’, ‘showposts’ => ‘1’));
if (is_array($attachments) ){
foreach($attachments as $attachment){
$thumbnail = wp_get_attachment_thumb_url(intval($attachment->ID), “thumbnail”);
echo ‘' .$id .'‘;
}
}
}
}

add_filter(‘manage_posts_columns’, ‘my_post_column’);
add_action(‘manage_posts_custom_column’, ‘my_custom_column’, 10, 2);

[/sourcecode]

フォトログなどでは、こうしておくと便利だ。