CakePHP から wordpress のデータを扱う

再び CakePHP 本体に戻って、その実力なぞ…というか自分的に調査。

そういえば、v1.3.x からは Model::findAll メソッドが動かず Model::find(‘all’) に切り替えられたんだそうだ。

find :: データを取得する :: モデル :: CakePHPによる開発 :: マニュアル :: 1.3コレクション :: The Cookbook
http://book.cakephp.org/ja/view/1018/find

この変更は、ちと大きいのかなぁ。古いマニュアルを読んでいると findAll を使っているところが多いので、悩んだりします。因みに、findAllByカラム名 は動くんですよね(何故か、findAll だけが動かないという現象で悩んだ)

wordpress のデータベースの構造は比較的簡単で、11 個しかありません。詳しいところは、

Amazon.co.jp: PHPによるWordPressカスタマイズブック―2.8対応 テンプレートの改造からプラグインの作成まで: 藤本 壱: 本
[amazon http://www.amazon.co.jp/dp/4883376745]

を参照して貰うとして。2.8 ベースなのですが、私的にはこれで十分な状態。

  • wp_posts: 投稿記事/ページ
  • wp_comments: コメント
  • wp_users: ユーザー情報

あと、カテゴリやカスタムフィールド関係が

  • wp_terms
  • wp_term_taxonomy
  • wp_term_relationships

に入っています。

これらの関係を、CakePHP から扱うにはどうするのか?ってのを実践してみれば、実運用で使える技術が鍛えられるはず。

ひとまず、プレフィックスの「wp_」が邪魔なのですが、CakePHP のデータベースの設定で prefix を指定できるので、これを使います。

class DATABASE_CONFIG {
	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => '127.0.0.1',
		'login' => 'manabook',
		'password' => 'manabook',
		'database' => 'manabook',
		'prefix' => 'wp_',	★
	);

こうしておくと、テーブル名が「wp_posts」でも Post モデルとして参照できます。

■最初はURLを入れる

CakePHP はマニュアル無しでサイトを作れるのか? | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/1753 

自分でやったことを、もう一度試してみるるので、最初は url を決めます。
http://servername/posts

と入力します。

■コントローラー作る

当然エラーが出て、コントローラーが無いとのお達しなので、PostsController を作ります。

<?php
class PostsController extends AppController {

	var $name = 'Posts';
	// ひとまず一覧
	function index() {
		$this->set('Posts',$this->Post->findPublish());
	}
	// 最近の一覧
	function recent() {
		$this->set('Posts',$this->Post->findRecentPosts(5));
	}
}
?>

ここで findPublish メソッドと findRecnetPosts メソッドを作っていますが、実は wp_posts は、公開(post_status)の状態があって、一覧の場合はこのカラムを必ずみることになります。
この条件をコントローラーで指定してもよいのですが、ここは Post モデルに任せることにします。

■モデルを作る

色々試行錯誤した結果、こんな感じになります。

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

	var $belongsTo = array(
	    'User' => array(
			'className' => 'User',
			'foreignKey' => 'post_author' ));

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

Model::find メソッドの記法がややこしいのですが、Post.post_status の $conditions を必ずいれておいて、後は order by するのを忘れないように。

Model::$belongsTo を指定しているのは、投稿したユーザー名(wp_user)にリンクさせるためです。

■ビューを作る

これを踏まえて、ざっくりとビューを作ると、

<table>
	<tr>
		<th>ID</th>
		<th>post_date</th>
		<th>post_title</th>
		<th>guid</th>
	</tr>
	<?php foreach($Posts as $item) : ?>
	<tr>
		<td><?php echo $item['Post']['ID']; ?>
		<td><?php echo $item['Post']['post_date']; ?>
		<td><?php echo $item['Post']['post_title']; ?>
		<td><?php echo $item['Post']['guid']; ?>
	</tr>
	<?php endforeach ; ?>
</table>

まあ、ひとまずはテーブル表示をするだけ。下記で実行できます。

http://wpcake.moonmile.net/posts

■最近投稿した記事も表示させる

wordpress のように最近投稿した記事(recent posts)も表示させてみます。

<h2>最近投稿した記事</h2>
<table>
	<tr>
		<th>ID</th>
		<th>post_date</th>
		<th>post_title</th>
	</tr>
	<?php foreach($Posts as $item) : ?>
	<tr>
		<td><?php echo $item['Post']['ID']; ?>
		<td><?php echo $item['Post']['post_date']; ?>
		<td><?php echo $item['Post']['post_title']; ?>
		<td><?php echo $item['Post']['post_author']; ?>
		<td><?php echo $item['User']['user_nicename']; ?>
		<td><?php echo $item['Post']['guid']; ?>

	</tr>
	<?php endforeach ; ?>
</table>
<h2>最近投稿した記事(リンク版)</h2>
<ul>
<?php foreach($Posts as $item) : ?>
	<li>
		<a href="<?php echo $item['Post']['guid']; ?>"><?php echo $item['Post']['post_title']; ?></a> by <?php echo $item['User']['user_nicename']; ?> at <?php echo $item['Post']['post_date']; ?>
	</li>
<?php endforeach; ?>
</ul>

先にテーブルで値を確認した後に、ペタペタとリンクの表示を作っていきました。

下記で実行できます。

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

お次は、コメント一覧なぞ。

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

CakePHP から wordpress のデータを扱う への1件のコメント

  1. masuda のコメント:

    追記
    post_status = ‘pusblish’ だけだと、削除した記事も拾ってきているようで、2重に表示されています。ちょっと条件が足りないみたい。あとで見直します。

コメントは停止中です。