漆黒な技術メモ

管理人が必要に応じて自分のメモを好き勝手に投下するたまり場的ブログ

【更新】記事カテゴリの自動更新とかいう頭おかしいことをやってみる(その2)

【4/26更新】ソースコードを貼り付け

ありえないぐらい久々の更新なのだが、途中で終わるのも何なのでとりあえず続きを書いてみる。

前回は「カスタムフィールドの値が今日と一緒の日付だった記事idを取り出す」的なことをした。

今回は「自動更新前と自動更新後に使うカテゴリのidを取り出す」ということをやる。


今回自分が使うカテゴリは二つ。

  • 開催予定のイベント
  • 過去のイベント

見てもらえばわかると思うが、上が更新前のカテゴリ、下が更新後のカテゴリである。

普通idを取り出す場合だったら「カテゴリ名が入っているテーブルから、上記二つのカテゴリ名で検索して引っかかったidが答え」というくそ単純な話で終わるのだが、WordPressではそうもいかない。
それはなぜかというと、WordPressのDB構造にある。

WordPressのDB構造

これを見ていただこう。
f:id:igbt3116redtrain:20141027043420p:plain
(http://wpdocs.sourceforge.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0より抜粋して引用)

テーブルがやたら多い。
一応各テーブルについてざっくり説明を

  1. wp_posts…投稿データそのものが入ってるテーブル
  2. wp_term_relationships…投稿データとタクシノミーを関連付けるテーブル
  3. wp_term_taxnomy…各タクシノミーと語句を関連付けるテーブル
  4. wp_terms…タクシノミーで使用する語句を格納しておくテーブル

まず、「タクシノミー」とはカテゴリやタグなど、記事を分類するための概念をひっくるめて言うものらしい。
なのでWordPressではwp_terms内にカテゴリの語句もタグの語句もひっくるめて格納される。この際に同じ語句であればカラムを一つ増やす必要がなくなるため、このような構造が採用されていると思われる。

そのため、実際に記事と各タクシノミーを関連づけてるのは wp_term_relationshipsテーブルということがわかる。
ということは、「自動更新前と自動更新後に使うカテゴリのidを取り出す」ということを行いたい場合は、

  1. wp_termsテーブルからカテゴリ名が一致するterm_idを取り出す
  2. wp_term_taxnomyテーブルからterm_idが一致し、かつtaxonomyが"category"のterm_taxonomy_idを取り出す

という複雑な手順を踏まなければならない。
これをSQL(文を記述したwordpress向けPHP)になおすと…

<?php
//開催予定のイベント のterm_idを取得し、それに紐付けされたterm_taxonomy_idを取得する
$sql=$wpdb->prepare('SELECT * FROM '.$table_prefix.'terms WHERE slug=%s','future_event');
$future_id_temp=$wpdb->get_results($sql);
$sql=$wpdb->prepare('SELECT * FROM '.$table_prefix.'term_taxonomy WHERE term_id=%d AND taxonomy=%s',$future_id_temp[0]->term_id,'category');
$future_id=$wpdb->get_results($sql);
?>

これであとはいよいよ更新するだけ…なのだが、これにも1手間必要である。
それはまた次回へ続く(本当に書くのだろうか…)