WordPress 2.9よりアイキャッチ画像という機能が加わっている。投稿に添付した画像のなかから、トップページなどでサムネイル的に表示する画像を1枚選択できるのだ。アイキャッチ画像を使用するには、テーマのafter_setup_theme フックでそのむね宣言しておく必要がある。functions.php に以下を記述しておけばよい。
function mysetup() {
add_theme_support( 'post-thumbnails' );
}
add_action( 'after_setup_theme', 'mysetup' );
これで投稿画面の右下あたりにアイキャッチ画像の項目が表示される。テーマを作成するうえで必須の処理となっている。
設定したアイキャッチ画像は、以下の一行でサムネイルとして表示することができる。
<?php the_post_thumbnail(); ?>
今までは、投稿記事に添付した画像からget_children()で抽出した画像を表示するために長々とコードを書いていた。こんな便利になっていたとは知らなかった。
WordPress3.0よりカスタムメニューという機能が追加された。これもテーマレビューで指摘されるまで気がつかなかった。カスタムメニューに対応しているテーマでは、管理画面の[外観]-[メニュー]でグローバルナビゲーションやサイドバーに表示するメニューを作成することができる。地味ながら「これは使える!」といいたい機能だ。
さてテーマでカスタムメニューに対応するには、after_setup_theme フックでメニュー登録を行う。例えばグローバルナビゲーションをカスタマイズしたい場合は、functions.php に以下を記述しておけばよい。
function mysetup() {
register_nav_menus( array(
'primary' => 'Primary Navigation'),
));
}
add_action( 'after_setup_theme', 'mysetup' );
これで管理画面に「ご利用中のテーマは1個のメニューに対応しています。」と表示され、メニューの編集が可能となる。
作成したメニューはheader.phpなどで表示する。
<?php wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'primary' ) ); ?>
テーマレビューで指摘があったように、3.0からコメントフォームは comment_form()で表示することになっている。single.phpなど表示したい箇所で呼べば、Twenty Ten テーマに似たものがデフォルトで表示される。
カスタマイズしたい場合は、パラメータにオプションを指定する。このオプションがほとんどHTMLであるため、まわりくどい。翻訳コードを入れると再読も難しい。
ハードコーディングをなくす方向というのはわかるものの、便利なのか不便なのかわからない。
テーマレビューがまた 「not-accepted」だった。3.0になってからの必須関数や非推奨関数があるため、Theme Review « WordPress Codex をよく見るように、とのこと。
必須関数で足りないのは、
・wp_nav_menu()
グローバルナビゲーションを表示する。ハードコーディングはNG。
・comment_form()
コメントフォームを表示する。パラメータでカスタマイズ可能。
メジャーアップデートの直後ということもあり、初心者にはつらいタイミングだったのか。くわえて英語の壁もある。スタッフの方にはお手数かけて申し訳ないけど、コツコツやろう。
WordPressとは切っても切れないjQueryである。これといった参考書が見つからないままWebの情報で済ませてたところ、オライリーから真打ち登場だ。
新宿のブックファースト(コクーンタワー)で買ったところ、オライリー謹製ブックカバーが付いてきた。ちょっと嬉しいけど、表紙のイタチっぽいやつがかわいすぎちゃうからカバーはしない。(虫とか爬虫類のときに使うことにする)
jQueryでJSONPを扱うのに、ちょっとはまったのでメモ。
jQueryでJSONP形式のWeb APIを利用する場合は、$.ajaxか $.getJSONメソッドで処理を行う。URLパラメータに渡すcallback=? という記述がミソで、このときWeb API側がどのようなコールバックの名前を設定しようとも 自動的に function(data){ のところに返ってくる。
$.getJSON( "http://example.com/service/?callback=?",
null,
function(data){
// 処理
});
さて、はまったのはWeb上に用意されているJSONP形式のファイルを扱う場合だ。データの更新頻度が少ない場合は、たまに更新される静的なJSONPファイルを扱うほうがだんぜん早い。
…ということでやってみると、ファイルの中にあらかじめコールバック(”mycallback”とする)の名前が埋め込まれているためか、上記のスクリプトではレスポンスがない。正しくは 「ない」のではなくて 別関数として function mycallback() を用意しておけば、そこに返ってくる。function(data){ へは返ってこない。当然といえば当然なのか。しかし、せっかくjQueryなんだからあくまでもスマートに記述したいのだ。いろいろやってみて以下のようなスクリプトに到達した。
$.getJSON( "http://example.com/service/example.json?callback=?",
null,
mycallback = function(data){
// 処理
});
Webや書籍でこのような例が見つからない。あまりやらない方法なのかな?
WordPress.orgよりテーマ審査のレスポンスがあった。
結果は”Cannot review theme” で、つまり通過しなかった。指摘として以下の2点。
・automatic_feed_links()が非推奨API
・mb_strimwidth()が未定義
wp-config.phpで、
define('WP_DEBUG', true);
にして警告やエラーをチェックせよとのこと。レビュー以前の問題だ。wp-config.phpをよく見ると、「テーマおよびプラグインの開発者には、その開発環境においてこの WP_DEBUG を使用することを強く推奨します。」と記述されている。デバッグモードにすると、いろいろ警告がでてきた。
非推奨APIのautomatic_feed_links()については、自分でも 「ブラウザにフィードアイコンを表示するには」 でメモしたばかりだった。実践できてない。mb_strimwidth()は致命的なエラーだ。PHPの関数なのでどうして?と思ったら、環境設定に依存する関数らしい。自分のサーバーでは動いても、他のユーザに使ってもらおうとしたらこのようなことにも気を使う必要があるのか。テーマやプラグインを作るうえでは、基本中の基本なんだろうな。
こういうこと見直す機会にもなった。
WordPress.orgにテーマを投稿し、ただいま審査中となっている。
業務や趣味でいくつかのテーマを作ってきたとはいえ、WordPress.orgに登録するには自分だけで使うのとは違った対応が必要になる。これまで作ったなかでも気に入っているフォトログのテーマについて、「WordPress.orgにテーマを登録する方法」を参照しながら、ちょこちょこと対応してみた。
まずは、GPLライセンス含め、テーマの概要、タグ、自己紹介をstyle.cssに明記する。それからウィジェット、ログイン有無での表示の違い、さまざまなアーカイブ表示など、ふだん自分に必要ない機能にもきっちり対応する。最後に言語対応。すべてのメッセージを英語で記述して、PoEditで作成した日本語ファイルを添付する。
ZIPに固めていざ投稿すると、すぐに警告がでた。単純なチェックはその場で行われるようだ。以下は警告された順。
(1)まず指定外のタグが記述されている。タグは決まったものからえらばなければならない。
(2)次に、<?php と<? の表記が混在している。<?php に統一せよとのこと。
(3)次に、wp_link_pages()がない。シングルページでの複数ページに対応していなかったので、修正した。
(4)さらに、visual editorが使用するCSSが定義されていない。そんなの知らなかったと思いつつ、示されたサンプルをstyle.cssに追加した。
警告はひとつづつでるので、直してはアップロードする。計5回のアップロードを繰り返したとことでようやく受理された。ほんとの審査はこれからだ。
どうなるのかなぁ…
カテゴリ別に年別アーカイブを表示したいとの依頼があり、いろいろやってみた。
例えばプレスリリースの2010年の一覧を表示したい場合、
http://XXXXXX.jp/2010/category/release/
http://XXXXXX.jp/category/release/2010/
のようなURLで表示できると予測したものの、どちらもダメだった。前者はすべてのプレスリリースが表示されてしまい、後者は404となる。
そうこうしているうちに、
http://XXXXXX.jp/2010/?category_name=release
のURLでプレスリリースの2010年の一覧を表示することができた。
2ページ目移行は次のようなURLになる。
http://XXXXXX.jp/2009/page/2/?category_name=release
せっかくパーマリンクを設定しているのにパラメータがついてしまって、ちょっとカッコ悪い。この場合テンプレートは、category-release.phpになる。年別表示をしているかどうかはis_year()で判断できる。
プラグインを使うとよいのだろうか?
いままでシングルサイトとして運営していたデータを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でクエリを発行して書き換える。