投稿内容を取得するget_post()

get_post()は投稿内容を取得する関数だ。投稿番号を指定することでsb_3_postsの内容が配列で返る。特定の記事を表示したい場合などに利用することができる。
パラメータには、数字ではなく参照値を指定しなくてはならない。
つまりget_post(投稿番号)ではなくて、

[sourcecode language=’php’]
$id=投稿番号;
get_post($id)
[/sourcecode]
とする。
はまった!

is_front_page()が使えなくなった

トップページかどうかの判断をis_front_page()で行っていた。これがあるときから、常にfalseになった。トップページかどうかでcssを切り替えているため、急にデザインが崩れて困った。is_home()で回避できるものの、腑に落ちないのでちょっと調べた。

直前に行っていた操作を思い出すうちに、管理画面で1ページに表示する最大投稿数を変更したことが原因らしかった。ためしに他のブログでもこの操作をしたら再現したのだ。しかし最大投稿数もとに戻したところで、is_front_page()はもとにはもどらなかった。

しかたがないので、Wordpressのコアソースでis_front_page()を追った。is_front_page()とは、’posts’ == get_option(‘show_on_front’) && is_home()というような意味らしい。この’show_on_front’というオプションがおかしくなっているようだ。MySql上ではではテーブルwp_optionsに設定されている。この値が空になっていたので手動で’posts’に書き直した。
is_front_page()は正常に戻ったように思う。

ググっても見当たらないけど、これはバグなのかな?

表示条件に複数カテゴリを指定する

一覧の条件を指定するには、ループの直前にquery_postsでカテゴリや表示数などの条件を加えることができる。カテゴリ”ニュース”を指定するには、
[sourcecode language=’php’]
query_posts($query_string .”&category_name=news”);
[/sourcecode]
というようにスラッグで指定するといいのだが、スラッグはひとつしか指定することができない。複数(たとえば”英語”の”ニュース”)を指定する場合には、
[sourcecode language=’php’]
query_posts($query_string .”&cat=” .get_category_by_slug(‘news’)->term_id) .”,” .&cat=” .get_category_by_slug(‘english’)->term_id));
[/sourcecode]
というようにterm_idで指定するしかない。この場合はカテゴリが”英語”または”ニュース”の記事が表示される。両方の条件を満たす記事を表示する場合には、category__andというパラメータを使う。
[sourcecode language=’php’]
query_posts(array(‘category__and’=>array(get_category_by_slug(‘news’)->term_id, get_category_by_slug(‘english’)->term_id)));
[/sourcecode]

これではまだ”ニュース”の子孫カテゴリが拾ってこれない。”ニュース”の子孫と”英語”の両方を満たす記事を表示する場合は、ちょっとまわりくどいが以下の記述で実現した。
[sourcecode language=’php’]
query_posts(array(‘category_name’=>’news’, ‘category__and’=>array(get_category_by_slug(‘english’)->term_id),’showposts’=>5));
[/sourcecode]

もうちょっとスマートな方法はないかな?

投稿画面でカテゴリーをソートしない

管理画面の投稿画面にカテゴリーを選択するリストボックスがあり、いったんチェックをつけたカテゴリーは次回から上に表示される。CMSとして利用する場合はカテゴリーに2、3の階層を持たせることがほとんどなので、これをやられるとあとからカテゴリーの階層がわからなくなって困る。
この並べ替えをしない方法。

/wp-admin/includes/meta-boxes.php の
function post_categories_meta_box() から
wp_category_checklist() を呼ぶ箇所で、
[sourcecode language=’php’]
ID, false, false, $popular_ids) ?>
[/sourcecode]
となっているところに、引数を追加するとよい。
[sourcecode language=’php’]
ID, false, false, $popular_ids, ”, false) ?>
[/sourcecode]

6番目のパラメータがチェックされているカテゴリーを上にもってくるかどうかのフラグである。デフォルトでtrueとなっているのを、falseに指定する。5番目のパラメータは不明だが、デフォルトのNULLを指定しておく。こうすることで、カテゴリーのリストが常に同じ順番で表示される。

このようにWordPressの本体コードを修正すると、バージョンアップ時に上書きされてしまうのでおすすめできない。パラメータがあるということは、どこかに設定画面があるのだろうか?
とりあえず自分用にメモ。

body用のテンプレートタグ body_class

WordPress 2.8よりbody 要素用の新テンプレートタグ body_class が加わっている。テーマで以下のように書くことで、

[sourcecode language=’php’]
>
[/sourcecode]

homeの場合は、<body class=”home blog”>
singleページの場合は、<body class=”single postid-1″>

というように表示しているページごとにクラスが指定される。これによってページごとのスタイルを指定したり、JavaScriptでメニューの状態を変更したりすることができる。
今までは is_single()ならclass=”single”・・・と必要に応じて自分で指定していたので、いつのまにかとても便利になっていた。defaultテンプレートを見ていて気がついた。このテーマもちゃんとバージョンアップしてるんだな。たまには見直さなければ。

属性の一覧は、テンプレートタグ/body class – WordPress Codex 日本語版を参照。

アーカイブページを作成するには

アーカイブページを作成する際の小技。まずarchivesというページを作成する。そのさい内容は空白にしておく。そして、page-archives.phpというテンプレートファイルを用意する。archivesという名前のページのテンプレート、というような意味なのだろうか?月別アーカイブを表示するには、このテンプレートに以下を記述しておく。

[sourcecode language=’php’]

月別アーカイブ

‘monthly’, ‘limit’ => ”, ‘format’ => ‘html’, ‘before’ => ”, ‘after’ => ”, ‘show_post_count’ => true);
echo ‘

    ‘;
    wp_get_archives($defaults);
    echo ‘

‘;?>


[/sourcecode]

この場合アーカイブページのURLは、
ブログのURL/archives/
となる。

リビジョン管理を無効にする

最近のWordPressに搭載されいているリビジョン管理は、編集履歴を残す機能である。CMSとして複数人数で利用している場合には便利なものの、個人ブログで必要にかられることはあまりない。編集履歴はMySQL上でsb_3_postsとして保存されるため、投稿IDがどんどん増えていくのも気になる。

このリビジョン管理を無効にすることができる。wp-config.phpに以下を記述しておくとよい。

[sourcecode language=’php’]
define(‘WP_POST_REVISIONS’,  false);
[/sourcecode]

記述する位置は、「// 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。」の直前あたりだ。第2引数がfalseの場合はリビジョンが無効となる。ここに数値を指定すると、履歴を残す世代を指定することになる。

Feedをカスタマイズ

WordPressが自動で出力してくれるFeedは、全文か抜粋かを選ぶだけのシンプルなものとなっている。当ブログではこれで十分であるが、フォトログだったらやはりFeedに画像なんかを表示したいものだ。いろいろ調べているうちに、Feedの内容はテーマやプラグインでカスタマイズできることが分かった。

以下はテーマでatomの出力内容を変更する例。

[sourcecode language=’php’]
remove_action(‘do_feed_atom’, ‘do_feed_atom’, 10, 1);
automatic_feed_links(false);

function custom_feed_atom( $for_comments ) {
$template_file = ‘/feed-atom’ . ( $for_comments ? ‘-comments’ : ” ) . ‘.php’;
$template_file = ( file_exists( get_template_directory() . $template_file )
? get_template_directory()
: ABSPATH . WPINC
) . $template_file;
load_template( $template_file );
}
add_action(‘do_feed_atom’, ‘custom_feed_atom’, 10, 1);

[/sourcecode]

まずfunctions.phpで、本来のatom出力である”do_feed_atom”をremove_actionで停止し、独自の関数をadd_actionで再定義する。
次に、/wp-includes/feed-atom.phpを同じファイル名のままテーマフォルダにコピーする。中身を見るとFeedを出力するテンプレートとなっている。Feedの本文はthe_excerpt_rss();前後になるので、このあたりに画像を表示するなり手を加えるとよい。
さらに、同じ処理をrdf、rss、rss2に関しても行う。