WordPress 4.7.2で似た内容の記事を少しずつ内容を変えて機械的に投稿したかったので、SQLで直接書き込んだ。
単に1記事投稿するだけなら、1つのINSERT文を発行すれば良い。
INSERT INTO `wp_posts` VALUES (
354 // ID
,2 // 投稿者ID
,current_timestamp // 投稿日時
,(current_timestamp - interval 9 hour) // 投稿日時GMT
,'[getSyukujitsu yyyy="2016"]\r\n' // 本文
,'2016年(平成28年)の祝日一覧' // タイトル
,'2016年(平成28年)の祝日一覧' // 抜粋
,'publish' // 投稿ステータス
,'open' // コメントステータス
,'open' // ピンステータス
,'' // 閲覧パスワード
,'syukujitsu-2016' // スラッグ
,'' // 不明
,'' // ピン通知済みURL
,current_timestamp // 更新日時
,(current_timestamp - interval 9 hour) // 更新日時GMT
,'' // 不明:post_content_filtered
,0 // 親ID 0は親記事を指す
,'http://techo.red.lan/?p=354' // GUID
,0 // 表示順
,'post' // 投稿種別
,'' // 添付ファイル時のMIMEタイプ
,0 // コメント数
);
もっと色々なテーブルが絡んでいるかと思っていたが、そうでもなかった。
WordPressの記事データとしてはこれがほぼ全てだと思って良い。
今日のわかった
テーブルレイアウト仕様
が日本語の一次情報だが…新項目に対応してないぞ…(・。・;
IDについて
INSERT INTO `wp_posts` VALUES (
null
,2
:(略)
ID欄にnullを指定すると自動発番(既存投稿の最高番号+1)される。
なので、GUIDの事を考えない・後で修正するのであればnull値でガンガンINSERTすると捗る。
GUIDについて
ぶっちゃけ、GUIDはユニークになっていなくてもWordPress自身の動きに支障はないと思われる。
が、何処でどういう問題になるか分からないので一応それなりに入れておく。
画面から普通に投稿するとパーマリンクが基本の形式でセットされる。
この仕様だとIDを含んでいるため、INSERT時にID自動発番で楽した場合は、その後でGUIDをUPDATEしておく必要がある。
記事の並び順
ブログ表示上の記事一覧やカテゴリ一覧は純粋に投稿日時だけでソートしているようだ。
INSERT INTO `wp_posts` VALUES (325, 2, …(略)…);
INSERT INTO `wp_posts` VALUES (326, 2, …(略)…);
INSERT INTO `wp_posts` VALUES (327, 2, …(略)…);
:(略)
こんな感じで機械的に投稿すると投稿日時が被るので記事の並び順がシッチャカメッチャカになってしまうので、投稿日時の振り方は工夫する必要がある。
(記事一覧表示画面がIDを第2キーにしてくれれば良いのだが…)
自分は、エレガントさのエの字もないが
update wp_posts p
set
p.post_date = current_timestamp
,p.post_date_gmt = (current_timestamp - interval 9 hour)
,p.post_modified = current_timestamp
,p.post_modified_gmt = (current_timestamp - interval 9 hour)
where p.ID = 256
てな感じで、手動で日時を書き換えていって調整した。
記事のオプション
テーマで指定する記事のオプション情報はwp_postmeta
テーブルで指定する。
(AFFINGER4の例:AMPの有無、コメント許可、noindex/nofollow指定など)
AFFINGER4では無ければデフォルト値が使われる模様。
テーマの実装によってはwp_postmeta
も対応するデータを作ってあげないと異常終了するかもしれない。