wordpress を使って独自サイトを作ろうと思って、いくつか調べ。
どうやら、wordpress 3.0 からは、いくつかテンプレートが違っている模様で、と言いますか、PHP 初心者なものだから、何処から始めても良いということで。
Main Page – WordPress Codex 日本語版
http://wpdocs.sourceforge.jp/
カスタマイズするには、上記のサイトから始めればいいらしいです。
まぁ、この手のカスタムはコードを読んで諸々を進める訳ですが(他人様のコードのデバッグと同じですね…デバッグとは違うけど)、wordpress 3.0 から、ちょっと面白い仕組みが備わっているので紹介。
投稿したい記事を表示したり、一覧を表示したりするページをカスタムする場合、大抵はテーマのphpを直接編集すると思います。と言いますか、修正しちゃうのが「テーマ」ですよね。
けれど、wordpress 3.0 の標準で付いてくるテーマはこんな仕組みになっています。
cotegory.php を見ると
<001>
<?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>
<?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>
<?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なんですけど。
後々が心配だったり。