WordPress で著者の記事一覧を表示する

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() が新しい記事を取得するためのリンクになっている。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.