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(); ?>