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 を指定できるので、これを使います。

[code lang=”php”]
class DATABASE_CONFIG {
var $default = array(
‘driver’ => ‘mysql’,
‘persistent’ => false,
‘host’ => ‘127.0.0.1’,
‘login’ => ‘manabook’,
‘password’ => ‘manabook’,
‘database’ => ‘manabook’,
‘prefix’ => ‘wp_’, ★
);
[/code]

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

■最初はURLを入れる

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

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

と入力します。

■コントローラー作る

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

[code lang=”php”]
<?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));
}
}
?>
[/code]

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

■モデルを作る

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

[code lang=”php”]
<!– 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));
}
}
?>
[/code]

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

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

■ビューを作る

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

[code lang=”php”]
<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>
[/code]

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

http://wpcake.moonmile.net/posts

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

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

[code lang=”php”]
<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>
[/code]

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

下記で実行できます。

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

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

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

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

  1. masuda のコメント:

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

コメントは停止中です。