wordpress のカテゴリ一覧をアメブロ風にする

wordpress を使って独自サイトを作ろうと思って、いくつか調べ。

どうやら、wordpress 3.0 からは、いくつかテンプレートが違っている模様で、と言いますか、PHP 初心者なものだから、何処から始めても良いということで。

Main Page – WordPress Codex 日本語版
http://wpdocs.sourceforge.jp/

カスタマイズするには、上記のサイトから始めればいいらしいです。

まぁ、この手のカスタムはコードを読んで諸々を進める訳ですが(他人様のコードのデバッグと同じですね…デバッグとは違うけど)、wordpress 3.0 から、ちょっと面白い仕組みが備わっているので紹介。

投稿したい記事を表示したり、一覧を表示したりするページをカスタムする場合、大抵はテーマのphpを直接編集すると思います。と言いますか、修正しちゃうのが「テーマ」ですよね。

けれど、wordpress 3.0 の標準で付いてくるテーマはこんな仕組みになっています。

cotegory.php を見ると

<001>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
/**
 * The template for displaying Category Archive pages.
 *
 * @package WordPress
 * @subpackage Twenty_Ten
 * @since Twenty Ten 1.0
 */
 
get_header(); ?>
 
  <div id="container">
   <div id="content" role="main">
 
    <h1><?php
     printf( __( 'Category Archives: %s', 'twentyten' ), '<span>' . single_cat_title( '', false ) . '</span>' );
    ?></h1>
    <?php
     $category_description = category_description();
     if ( ! empty( $category_description ) )
      echo '<div>' . $category_description . '</div>';
 
    /* Run the loop for the category page to output the posts.
     * If you want to overload this in a child theme then include a file
     * called loop-category.php and that will be used instead.
     */
    get_template_part( 'loop', 'category' );
    ?>
 
   </div><!-- #content -->
  </div><!-- #container -->
 
<?php get_sidebar(); ?>
<?php get_footer(); ?>

な風に、get_template_part 関数なるものが用意されています。

これ、通常は、loop.php を呼び出すのですが、loop-category.php を用意すると、そっちの php ファイルを呼び出す、なかなか面白い仕組みです。

C# を知っていると、デリゲートに似ていると言えます。

ループの中身を後から、インジェクション(挿入)する仕組みですね。

これによって、便利なのは、

  • このテンプレートをバージョンアップしても、loop-category.php は上書きされない(自作だから)ので、そのままテンプレートをバージョンアップできる。
  • 他のテンプレートを適用しても、同じ仕組みであれば、loop-category.php を使い廻しできる。

という再利用性の問題がクリアできる点です。

PHP の場合、手軽にソースを書き換えられる分、それぞれのユーザー(プログラマ)がカスタムしているところを、どうやってバージョンアップするのか?という回答になっていますね。

C# な話だと、

  • インターフェースを作っておいて、DLLを動的にロード

な形になります。

さて、

この category-loop.php に至ったのは、カテゴリの一覧をカスタムしたかったからで、通常のカテゴリ一覧だと本文の一部とかが出て、ちょっと閲覧性が悪いんですよね。どうせならば、アメブロ風に一覧で出て欲しい(そのほうがクリックしやすいし)。

という訳で、作ってみたのがこれ。

<002>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 $cat_name = single_cat_title( '', false );
 $cat_id = get_cat_ID( $cat_name );
 $posts = get_posts("numberposts=1000&order=DESC&orderby=post_date&category=$cat_id");
 
 if ( $posts ) : ?>
 <table width="100%" cellpadding="0" cellspacing="0" border="0">
  <?php 
   $i = 1;
   foreach ( $posts as $post ) :  setup_postdata( $post );
  ?>
   <tr>
    <td><?php echo $i ?></td>
    <td>
     <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></td>
    <td><?php echo $post->post_date; ?></td>
    <td>コメント(<?php echo $post->comment_count; ?>)</td>
   </tr>
  <?php
   $i++;
   endforeach; ?>
 </table>
<?php endif; ?>

ページ送りが無いので、いまいちですが、ひとまずPHP初心者としてはOKかな、と

出来上がりは、こんな感じ。

20100912_01.jpg

スタイルシートを変えれば、もうちょっとマシになるかなと。

同様に、カレンダーで月を選択した場合は loop-archive.php を作ります。

<003>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
 global $wpdb;
 
 $date = get_the_date();
 $year = intval(get_the_date('Y'));
 $month = intval(get_the_date('m'));
 $day = intval(get_the_date('d'));
 
if ( is_month() ) {
 
 $sdate = $year . "/" . $month . "/01";
 if ( $month < 12 ) {
  $edate = $year . "/" . ($month+1) . "/01";
 } else {
  $edate = $year+1 . "/" . 1 . "/01";
 }
 $sql = <<< HERE
select
  *
FROM
 $wpdb->posts  
WHERE
    post_status = 'publish'
and post_type = 'post'
and '$sdate' <= post_date and post_date < '$edate'
order by post_date desc
HERE;
} else {
 $sdate = $year . "/" . $month . "/" . $day;
 $sql = <<< HERE
select
  *
FROM
 $wpdb->posts  
WHERE
    post_status = 'publish'
and post_type = 'post'
and '$sdate' = cast(post_date as date)
HERE;
 
}
 
?>
<?php
  $posts = $wpdb->get_results( $sql );
 if ( $posts ) : ?>
 <table width="100%" cellpadding="0" cellspacing="0" border="0">
  <?php 
   $i = 1;
   foreach ( $posts as $post ) :  setup_postdata( $post );
  ?>
   <tr>
    <td><?php echo $i ?></td>
    <td>
     <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></td>
    <td><?php echo $post->post_date; ?></td>
    <td>コメント(<?php echo $post->comment_count; ?>)</td>
   </tr>
  <?php
   $i++;
   endforeach; ?>
 </table>
<?php endif; ?>

データベースを直接弄っているのは、それらしい関数がなかったので。

デザイナさんが改修すると、さすがに SQL 周りは触れないのでは?と思うので、プログラマが wordpress を弄るとこんな風に、という例として。

という訳で、table タグを使っているのは、ご愛嬌ということで。

カテゴリー: Wordpress パーマリンク

wordpress のカテゴリ一覧をアメブロ風にする への2件のフィードバック

  1. konica のコメント:

    そうなんですよね、
    先日触っていてloop.php引っ張ってるので
    気がついた(´・ω・)ス
    これから何かと皆ゴニョゴニョし始めますものね。

  2. masuda のコメント:

    loop.php って、is_category 関数とかで場合分けをしているので、
    loop-category.php のほうがすっきりするかな、と。

    ただ、loop-category.php 自身にデータを持ってきているから、いまいち View としての独立性は低いんですよねぇ。このぐらいの処理ならばOKなんですけど。
    後々が心配だったり。

コメントは停止中です。