投稿者「あみだがみね」のアーカイブ

[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`ビューができます。こんなの↓

続きを読む