概要
フロントページのタイトルを書き換えて、リスト件数、タグ個数、引用している書籍数を載せる。
詳細
フロントページのタイトルを書き換える
タイトルを取得する get_the_title() に仕込まれている ‘the_title’ フィルターを使う。get_the_title() はメニューやウィジェット中の記事タイトルなどでも呼ばれまくっていて ‘the_title’ フィルターを使うコストは高そう。フロントページの記事タイトルだけを(テーマファイルなどに手を加えずに)動的に変える方法があればよいのだが思いつかず。
フロントページを処理中であるかどうかは通常 is_front_page() を使うが、フロントページを描画する過程でも get_the_title() が複数呼ばれる。そこで ‘the_title’ フィルターに渡される投稿 ID が get_option( ‘page_on_front’ ) で取得できるフロントページ用の固定ページ ID と同一かどうかで識別する。
リスト件数を載せる
投稿 (post) の中で投稿ステータスが publish かつカテゴリが list であるものの数を数えればよいのだが、妥当な方法を思いつくまでに意外に時間がかかった。
WP_Query() を使うと莫大な数の投稿オブジェクトが作られてしまう。特定の投稿ステータスを持った投稿の数やカテゴリの数を個別に得る関数はあるが、それらを組み合わせて投稿数だけを得る負荷の低そうな関数が見当たらず。WP_Query() 中にあるフックを活用して SELECT 文に COUNT を追加する新しいクラスを作る事例もあったが、あまりにも大がかり。
ただ調べてみると、WP_Query() は 1 回のクエリで取得する投稿オブジェクトの数にかかわらず総件数を取得している(ページネーションする場合総ページ数が必要なため)。なので、取得件数を 1 として WP_Query() を呼べばよいだけであった。
タグ個数、引用している書籍数を載せる
wp_count_terms() でOK。正確にはプライベート投稿にのみ属するタグや書籍を除く必要があるが、ほぼゼロであることはわかっているので省略。
add_filter( 'the_title', 'kh_frontpage_title', 10, 2 );
function kh_frontpage_title( $title, $id ) {
// フロントページ用の固定ページのタイトルであれば書き換える
if( $id == get_option( 'page_on_front' ) ) {
// posts_per_page => 1 とすれば戻り値に巨大な配列を得ることなく合計件数だけを得られる
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'category_name' => 'list',
'posts_per_page' => 1,
);
$q = new WP_Query( $args );
$title = sprintf(
'%s のリスト<br><span style="font-size:smaller; font-weight:normal;">%s 冊の本と %s 個のタグを添えて</span>',
$q->found_posts, wp_count_terms( 'asin' ), wp_count_terms( 'post_tag' )
);
}
return $title;
}