前回のCakePHPとWordPressを連携するメリットとその方法 Vol.1の続きとしてCakePHPの環境にWordPressを導入する際の実装を初めて行きます。
余談ですが、CakePHPもWordPressもそこそこ人気のあるソフトウェアということで、ちょいちょい反響ありまして嬉しいです!
前回の記事ではCakePHPの中にWordPressを設置して、DBの設定をするところまで行いました。
今回はその続きで、Modelを作っていきます。
上記のModelを作成していきます。重要なのはAssociationの部分です。
全てのModelに共通しているpublic $useDbConfig = 'wordpress';
に関してですが、このModelはWordpressのDB設定を使いますよーという記述です。
また、ちょっと見づらいのでvalidationとコメントに関しては省いてあります。実際に実装する際にはそれぞれで適切な設定をしてください。
記事の情報です。
下書き、リビジョン、個別ページ、自動保存されたリビジョン、アイキャッチなどもココに含まれます。
<?php
App::uses('AppModel', 'Model');
class Post extends AppModel {
public $useDbConfig = 'wordpress';
public $primaryKey = 'ID';
public $displayField = 'post_title';
// hasMany associations
public $hasMany = array(
'Postmetum' => array(
'className' => 'Postmetum',
'foreignKey' => 'post_id',
'dependent' => false,
),
'TermRelationship' => array(
'className' => 'TermRelationship',
'foreignKey' => 'object_id',
'dependent' => false,
)
);
}
postmetaテーブルには、各投稿記事特有の情報が入っています。
構造自体はmeta_id
,post_id
,meta_key
,meta_value
と単純ですが、カスタムフィールドとして使用するほか、各投稿に情報や設定を付加するようなプラグインがあり、多種多様なデータが保存されていきます。
<?php
App::uses('AppModel', 'Model');
class Postmetum extends AppModel {
public $useDbConfig = 'wordpress';
public $primaryKey = 'meta_id';
// belongsTo associations
public $belongsTo = array(
'Post' => array(
'className' => 'Post',
'foreignKey' => 'post_id',
)
);
}
投稿にひもづけられるカテゴリーと、タグに関する基本的な情報が保存されます。
<?php
App::uses('AppModel', 'Model');
class Term extends AppModel {
public $useDbConfig = 'wordpress';
public $primaryKey = 'term_id';
public $displayField = 'name';
// hasMany associations
public $hasMany = array(
'TermTaxonomy' => array(
'className' => 'TermTaxonomy',
'foreignKey' => 'term_id',
'dependent' => false,
)
);
}
投稿とwp_term_taxonomy
テーブル(カテゴリ・タグ)との関連付け情報を保存する中間テーブルになります。
<?php
App::uses('AppModel', 'Model');
class TermRelationship extends AppModel {
public $useDbConfig = 'wordpress';
public $primaryKey = 'object_id';
// belongsTo associations
public $belongsTo = array(
'TermTaxonomy' => array(
'className' => 'TermTaxonomy',
'foreignKey' => 'term_taxonomy_id',
)
);
}
投稿のカテゴリ・タグに関するデータを保存しています。
Termがカテゴリーなのかタグなのかという情報や、それぞれの記事数カウントなどが保存されています。
<?php
App::uses('AppModel', 'Model');
class TermTaxonomy extends AppModel {
public $useDbConfig = 'wordpress';
public $useTable = 'term_taxonomy';
public $primaryKey = 'term_taxonomy_id';
// belongsTo associations
public $belongsTo = array(
'Term' => array(
'className' => 'Term',
'foreignKey' => 'term_id',
)
);
// hasMany associations
public $hasMany = array(
'TermRelationship' => array(
'className' => 'TermRelationship',
'foreignKey' => 'term_taxonomy_id',
'dependent' => false,
)
);
}
登録したユーザ情報が保存されます。
<?php
App::uses('AppModel', 'Model');
class User extends AppModel {
public $useDbConfig = 'wordpress';
public $primaryKey = 'ID';
public $displayField = 'display_name';
// hasMany associations
public $hasMany = array(
'Post' => array(
'className' => 'Post',
'foreignKey' => 'ID',
'dependent' => false,
),
);
}
という感じで上記の様に各Modelを編集します。
controllerとviewを編集して記事一覧をつくります。
<?php
// actionのみの記述
public function index() {
// 公開された記事+予約投稿になっていて公開時間になった記事を表示する。
$conditions = array (
'OR' => array (
array ('post_status' => 'publish'),
array ('post_status' => 'future'),
),
'post_date <=' => date("Y-m-d H:i:s"),
'post_type' => 'post'
);
$this->paginate = array(
'conditions' => $conditions,
'order' => 'post_modified DESC',
'limit' => 5,
);
$this->set('posts', $this->Paginator->paginate());
}
<?php foreach ($posts as $post): ?>
<article>
<header>
<h2>
<?php echo $this->Html->link(h($post['Post']['post_title']), array('action' => 'view', $post['Post']['ID'])); ?>
</h2>
<time><?php echo $this->Html->link(h($post['Post']['post_modified']), array('action' => 'view', $post['Post']['ID'])); ?></time>
</header>
<div class="main">
<p>
<?php echo nl2br(h($post['Post']['post_content'])); ?>
</p>
</div>
<footer>
<p>by <?php echo h($post['User']['display_name']); ?></p>
</footer>
</article>
<?php endforeach; ?>
<?php echo $this->Paginator->counter(array( 'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}'))); ?>
<div class="paging">
<?php echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled')); ?>
<?php echo $this->Paginator->numbers(array('separator' => '')); ?>
<?php echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled')); ?>
</div>
上記の通りにModel、Controller、Viewを編集し、http://cakephp.dev/posts
にアクセスした表示になります。
とりあえず記事一覧が表示されましたが、まだ足りない情報があります。
上記画像はWordPressの現在のデフォルトのテーマtwentyfifteen
の記事一覧の個別の記事です。
CakePHPの記事一覧と比べると、(CSSによるデザインは置いておいて)記事アイキャッチ、タグ、カテゴリーが表示されていません。
次回以降その辺りの表示を追加しながら記事詳細まで作成できたらいいなぁ。という感じです!
また次回に続きます……
株式会社カイユウでは、エンジニア・デザイナーを募集しております。
WordPressが好きなエンジニア/デザイナーさん、そしてWordPressなんてやってらんねぇよ!ってエンジニア/デザイナーの方!
あなたの力で、メディアやコンテンツの未来を明るくしていきましょう!ღゝ◡╹)ノ