WordPress には、著者ごとのテンプレートやカテゴリーごとのテンプレートが用意されており、要求されたページごとにカスタマイズできるようになっている。テンプレートは通常テーマに含まれており、たとえば Twenty Twelve を利用している場合は、「wp-content/themes/twentytwelve」の下に各種テンプレートが格納されている。このブログの環境では、ディレクトリの内部は以下のような構造になっている。
814 Oct 27 2012 404.php 2068 Jul 4 16:25 archive.php 2418 Jul 28 21:07 author.php 2131 Jul 28 21:03 category.php 2167 Nov 17 2012 comments.php 1390 Oct 27 2012 content-aside.php 1256 Oct 27 2012 content-image.php 1170 Jul 4 16:22 content-link.php 593 Oct 27 2012 content-none.php 731 Jul 4 16:23 content-page.php 1113 Jul 4 16:23 content-quote.php 1359 Jul 4 16:23 content-status.php 2955 Jul 4 16:20 content.php 4096 Jan 25 2013 css(ディレクトリ) 413 Oct 27 2012 editor-style-rtl.css 5464 Nov 15 2012 editor-style.css 749 May 7 13:04 footer.php 16430 Mar 25 14:59 functions.php 3289 Jul 10 13:10 header.php 2842 Jul 4 16:36 home.php 4079 Oct 27 2012 image.php 4096 Jul 11 17:42 images(ディレクトリ) 4096 Jan 25 2013 inc(ディレクトリ) 2061 Jul 4 16:35 index.php 4096 Jan 25 2013 js(ディレクトリ) 4096 Jan 25 2013 languages(ディレクトリ) 4096 Jan 25 2013 page-templates(ディレクトリ) 726 Oct 27 2012 page.php 4712 Nov 29 2012 rtl.css 171045 Nov 8 2012 screenshot.png 1348 Oct 27 2012 search.php 987 Oct 27 2012 sidebar-front.php 1594 Jul 11 17:47 sidebar.php 1949 Jul 4 16:34 single.php 37611 Jul 10 13:20 style.css 1404 Oct 27 2012 tag.php
single.php や page.php、home.php、category.php などがテンプレートだ。テンプレートの一覧は、WordPress Codex 日本語版のテーマの作成ページのテンプレートファイル一覧に記述がある。いつ、どのテンプレートが使われるのかは、テンプレート階層の概観図がわかりやすい。
テンプレートが呼び出される前に、WordPress が表示する記事の条件などを解析して設定しているため、条件を独自に解析する必要はなく、用意された関数で取得できる。また、テンプレートはページの一部を構成する要素なので、記述するコードはページの一部分のみになる。
今回は、著者ごとのリンクをクリックしたときに表示するページをカスタマイズするので、author.php を編集していく。author.php は、著者を指定した URL で WordPress にアクセスしたときに呼び出される。たとえば、このブログで、https://www.united-bears.co.jp/blog/archives/author/dslという URL でアクセスしたときには、dsl の著者の記事を表示する。
Twenty Twelve のデフォルトのテンプレートは、指定された著者の最新の記事から順に表示していくようになっているが、記事の一覧を出すように変更してみる。
指定された著者の記事の一覧取得
指定された著者を取得するには、get_query_var(‘author’) を利用できる。get_query_var() は、投稿検索に関連する変数の値を取得する関数だ。また、記事数が多い場合はページ移動したいので、get_query_var(‘paged’) で何ページ目の記事を表示するのかも取得する。
記事の取得は、query_posts() 関数を利用した。実は query_posts() 関数の利用は推奨されていないのだが、グローバル変数 $wp_query を上書きしたかったのであえて利用している。コードは以下のような感じ。なお、WordPress Codex では、WP_Query か get_posts() 関数を利用することを推奨している。
<?php $author = get_query_var('author'); $paged = get_query_var('paged'); $posts = query_posts('posts_per_page=20&author=' . $author . '&paged=' . $paged); ?>
query_posts() の引数で、最大20件、指定された著者、指定されたページを取得するように検索条件を指定している。SQL を実行することになるので、get_query_var() で取得した値にエスケープ処理等が必要なのかどうかコードを調べてみたが、設定したクエリーを直接実行するのではなく、query_posts() 内(正確には query_posts() が呼び出している WP_Query のメソッド内だが)で、author や paged の値は数値に変換しているようなので、特に処置を行っていない。
著者情報の取得
著者情報の取得と表示は、Twenty Twelve のデフォルトの状態とほぼ変わらない。指定された著者の記事の一覧取得で、記事を取得しているので the_post() 関数を使えばグローバル変数 $post に記事の情報を設定できる。記事を1つ読み出しているので、rewind_posts() で戻している。
<?php if($posts) : the_post(); ?> <header class="archive-header"> <h1 class="archive-title"> <?php printf( __( 'Author Archives: %s', 'twentytwelve' ), '<span class="vcard"><a class="url fn n" href="' . esc_url( get_author_posts_url( get_the_author_meta( "ID" ) ) ) . '" title="' . esc_attr( get_the_author() ) . '" rel="me">' . get_the_author() . '</a></span>' ); ?> </h1> <?php if ( category_description() ) : ?> <div class="archive-meta"><?php echo category_description(); ?></div> <?php endif; ?> </header> <?php rewind_posts(); ?>
記事一覧の表示
記事一覧は $posts 変数に取得済みなので、一覧を表示するのは $posts 変数をループするだけでよい。記事名だけだと寂しいので、記事の日付とカテゴリーを表示している。カテゴリーは、複数表示するべきだろうが、レイアウトの関係で1つだけ表示している。
<div class="entry-summary"> <table style="width: 100%"> <?php foreach($posts as $post): setup_postdata($post); ?> <tr style="height:4em;"> <td width="62%" style="padding-right: 2em;"> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> </td> <td width="24%"> <?php echo get_the_date();?> </td> <td width="14%"> <?php $categories = wp_get_post_categories($post->ID); $category = get_category($categories[0]);?> <a href="<?php echo get_category_link($categories[0]);?>"><?php echo $category->name;?></a> </td> </tr> <?php endforeach; ?> </table> </div>
ページのナビゲーションの挿入
ページのナビゲーションは、next_posts_link() と previous_posts_link() で取得できる。関数名が少しややこしく、next_posts_link() が古い記事、previous_posts_link() が新しい記事を取得するためのリンクになっている。