サイトアイコン あみだがみねのもろもろ備忘録

[SQL] WordPressの全投稿の詳細を取得する

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

このページはAMPページです。
👉元のページ(非AMPページ)を表示する
👉あみだがみねのもろもろ備忘録 TOPへ
モバイルバージョンを終了