CakePHP から wordpress のデータを扱う(2)

今度は、wordpress のコメント表示

CakePHP から wordpress のデータを扱う | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/1888

のところで記事の表示ができたので、これを流用します。

アクセスは http://servername/comments/recent のようにして、最近のコメントを取得。

■ビューを作る

ひな型が出来ているので、今度はいきなりビューを作ってしまいます。
モデル名やテーブルのカラム名なんかは想定で作ってしまって、後で合わせるってことができますね。テーブル仕様書ができていれば、これで分業ができるはずです。

<h2>最近投稿されたコメント</h2>
<table>
	<tr>
		<th>comment_ID</th>
		<th>comment_post_ID</th>
		<th>comment_author</th>
	</tr>
	<?php foreach($Comments as $item) : ?>
	<tr>
		<td><?php echo $item['Comment']['comment_ID']; ?>
		<td><?php echo $item['Comment']['comment_post_ID']; ?>
		<td><?php echo $item['Comment']['comment_author']; ?>
		<td><?php echo $item['Comment']['comment_author_url']; ?>
		<td><?php echo $item['Post']['post_title']; ?>
		<td><?php echo $item['Post']['guid']; ?>
	</tr>
	<?php endforeach ; ?>
</table>

<h2>最近投稿されたコメント(リンク版)</h2>
<ul>
	<?php foreach($Comments as $item) : ?>
		<li>
			<?php if ( $item['Comment']['comment_author_url'] == '' ) : ?>
				<?php echo $item['Comment']['comment_author']; ?>
			<?php else : ?>
				<a href="<?php echo $item['Comment']['comment_author_url']; ?>"><?php echo $item['Comment']['comment_author']; ?></a>
			<?php endif; ?>
			on
			<a href="<?php echo $item['Post']['guid']; ?>">
			<?php echo $item['Post']['post_title']; ?>
			</a>
		</li>
	<?php endforeach ; ?>
</ul>

開発時の手順は、

  1. プログラマがテーブルタグで、必要な部品を揃えておく&チェックする。
  2. デザイナが、部品をコピー&ペーストしながらレイアウトを組む。

って感じですかね。<?php echo … ?>なところに値が入るってことだけ説明すれば後は CSS でデザインしてもらうとか。

# 実は Microsoft の Expression Design は、仮データを XML などで作っておいて、デザイン時にもデータが表示される、ってのが売りなんですが、、、これってあまり宣伝されていない気が。って、使っている人ってどのくらい?って感じなのですが。

■コントローラーを作る

コントローラーはあっさりと作りました。
まあ、全体用の index メソッドと最新のコメントを取る recent メソッドです。

<?php
class CommentsController extends AppController {

	var $name = 'Comments';
	function index() {
		$this->set('Comments',$this->Comment->find('all'));
	}
	function recent() {
		$this->set('Comments',$this->Comment->findRecentComments(5));
	}
}
?>

CakePHP の Model::find メソッドを使っていて気づいたのですが、web の場合、mysql の limit(行数制限)は必須かもしれませんね。デスクトップアプリケーションだと、間違って数万行を出してもアプリを止めれば接続が切れるのでサーバーのダウンが避けられますが、web 経由の接続だとあっという間にダウンしてしまいそう。なので、必ず limit を指定しておいて最初の数百行に抑えておくというのが安全だと思います。
# SQL Server や Oracle だと top コマンド

■モデルを作る

Comment.comment_post_ID (*)-(1) Post.ID の連携があるので、Model::$belongTo 変数に記述します。実際は inner join にしたいところですが、Comment の親には必ず Post があるので、結果は同じになります。

<!-- models/comment.php -->
<?php
class Comment extends AppModel
{
	var $name = 'Comment';

	var $belongsTo = array(
	    'Post' => array(
				'conditions' => array(
					array('Post.post_status'=>'publish'),
					array('Comment.comment_approved'=>'1')),
			'className' => 'Post',
			'foreignKey' => 'comment_post_ID' ));

	// 最近投稿した記事を取得する
	function findRecentComments($max = 5) {
		return parent::find('all', 
			array(
				'conditions' => array(
					array('Post.post_status'=>'publish'),
					array('Comment.comment_approved'=>'1')),
				'order'=>'comment_date desc',
                'limit'=>$max));
	}
}
?>

最近投稿されたコメントのほうは、最大値を指定して、日付を逆順にして表示。
あと、記事(Post)の方のステータスが変わった場合にも対処するために、Model::$belongsTo のほうに、conditions を追加しておきます。こうすると、left join の on のところに条件が追加されます。

■結果

これも結果が見れます。

http://wpcake.moonmile.net/comments/recent

と言う訳で、お次はカテゴリ一覧とカテゴリ内の表示、これが wordpress では、ややこしい部類なのです。

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