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かな、と
出来上がりは、こんな感じ。
スタイルシートを変えれば、もうちょっとマシになるかなと。
同様に、カレンダーで月を選択した場合は 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 タグを使っているのは、ご愛嬌ということで。
そうなんですよね、
先日触っていてloop.php引っ張ってるので
気がついた(´・ω・)ス
これから何かと皆ゴニョゴニョし始めますものね。
loop.php って、is_category 関数とかで場合分けをしているので、
loop-category.php のほうがすっきりするかな、と。
ただ、loop-category.php 自身にデータを持ってきているから、いまいち View としての独立性は低いんですよねぇ。このぐらいの処理ならばOKなんですけど。
後々が心配だったり。