WorePressで全投稿を取得するには、PHPからwp_get_archives関数や、get_posts関数を呼べばいいのですが、
色々カスタマイズしようとすると、(自分のスキルのなさのせいか…)コードがごちゃごちゃしてしまいます。(スマートな方法があれば教えて下さい…あるいは便利プラグインがすでにありそうですが…)
なので、自分がよく使いそうなデータを集めて、データベース上にあらかじめビュー作って置きます。
以下、WorePressが使うテーブル名のプレフィクスを”wordpress_“として説明していきます。
* * * SQL仕様 * * *
・ビューの名前は、`wordpress_view_all_contents`
・フィールドは、’投稿ID‘, ‘投稿タイトル‘, ‘投稿日時‘, ‘カテゴリID‘, ‘カテゴリ名‘, ‘URL‘
・’カテゴリ名’と’投稿日時’でソートします。
・一つの投稿が複数のカテゴリを持っている場合、カテゴリ分だけレコードが増えます。
・なんだかよくわからない(!?)カテゴリ”ブログロール”は除外します。
* * * * * * * * * * * * *
投稿は`wordpress_posts`テーブルに入っています。そのままの状態だと、未公開投稿とか、下書きとか、各種ファイル(画像ファイルなど)がごっちゃになっているので、
`post_type`が’post’かつ、`post_status`が’publish’のものを選択します。
‘カテゴリ名’は`wordpress_terms`テーブル、’カテゴリID’は`wordpress_term_relationships`テーブルに入っているので内部結合します。
‘URL‘は”WorePressのサイトアドレス” + “/?p=” + ‘投稿ID’から生成できます。
“WorePressのサイトアドレス”は、`wordpress_options`.`option_value`に入っています。
※実は`wordpress_posts`.`guid`にそのままURLが入っていますが、これは投稿した時点でのURLなので、後でドメインを変更したり、複数ドメインを使ってるとおかしくなります。そういう心配がない場合は、素直にこのフィールドをつかってやると簡単です。
以下、SQLコード
CREATE VIEW wordpress_view_all_contents AS
SELECT `wordpress_posts`.`ID` AS 'id',
`wordpress_posts`.`post_title` AS 'title',
`wordpress_posts`.`post_date` AS 'post_date',
`wordpress_terms`.`term_id` AS 'category_id',
`wordpress_terms`.`name` AS 'category',
CONCAT((SELECT `wordpress_options`.`option_value` FROM `wordpress_options` WHERE `wordpress_options`.`option_id` = 1),
'/?p=',
`wordpress_posts`.`ID`) AS 'url'
FROM `wordpress_posts`
INNER JOIN
(`wordpress_terms` INNER JOIN `wordpress_term_relationships`
ON `wordpress_terms`.`term_id` = `wordpress_term_relationships`.`term_taxonomy_id`)
ON `wordpress_posts`.`ID` = `wordpress_term_relationships`.`object_id`
WHERE `post_type` = 'post' AND `post_status` = 'publish' AND `wordpress_terms`.`name` <> 'ブログロール'
ORDER BY `category`,`post_date`;
これをデータベースクライアント(MySQLクライアントや、phpMyAdminなど)から実行すると`wordpress_view_all_contents`ビューができます。こんなの↓
あとはPHPからこのビューに接続すればOK
これでPHP側のコードはスッキリします(多分)。
PHPからPEAR::DBを使って、’表示したいカテゴリ名‘の一覧を表示する例
<?php
// PEAR DB
require_once "DB.php";
// DB接続
$dsn = array(
'phptype' => 'mysqli',
'username' => 'DBユーザー名',
'password' => 'パスワード',
'hostspec' => 'DBサーバー名',
'database' => 'データベース名'
);
$db = DB::connect($dsn);
if (PEAR::isError($db)) {
echo 'DB接続エラー<br>';
die();
}
// 文字コード設定
$db->query("SET NAMES utf8;");
// 投稿取得
$res =& $db->query('SELECT * FROM `wordpress_view_all_contents` WHERE `category` = ?;', '表示したいカテゴリ名');
// 取得結果を表示
while ($row =& $res->fetchRow(DB_FETCHMODE_OBJECT)) {
echo "<a href='{$row->url}'>{$row->title}</a> ({$row->post_date})<br>";
}
// DB切断
$db->disconnect();
?>
