写真 コラム 開発室
HOME開発室[WordPress] 複数のタームを持つ投稿の関連記事を取得する
キーワード
WordPress

[WordPress] 複数のタームを持つ投稿の関連記事を取得する

[WordPress] 複数のタームを持つ投稿の関連記事を取得する

複数のタームを持つ投稿の関連記事

WordPressで独自のテーマを作っている時など、個別投稿ページでその記事に関連する投稿の一覧を表示したい場合がある。

その記事に指定されたタームがひとつだけなら同じタームを持つ記事を引っ張ってくるだけでいいかもしれない。 しかし例えばその記事にタームが3つも4つも設定されていたら、どういった基準で関連記事を取得するのが良いだろうか。

色々と試行錯誤した結果、共通するタームの数が多いものから順番に取得するという形に落ち着いた。

関連記事を取得するSQL文

SQL
SELECT p2.* FROM wp_posts p2 INNER JOIN ( SELECT p.ID FROM wp_posts p INNER JOIN wp_term_relationships tr ON p.ID = tr.object_id INNER JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.term_id IN(4, 13, 21) -- 対象の投稿に紐づいたタームID AND p.post_type = 'post' AND p.post_status = 'publish' AND p.ID <> 1234 -- 対象の投稿を除外 GROUP BY p.ID, p.menu_order ORDER BY COUNT(p.ID) DESC, p.menu_order LIMIT 6 ) p3 ON p2.ID = p3.ID ORDER BY p2.menu_order

ここではまずサブクエリで共通するタームIDを持つ投稿を一覧にし、タームの数が多い順に並べる。 そこから上位6件の投稿IDを切り出し、その投稿ID一覧を元に関連記事のデータを取得している。

ボツになったSQL文

最初は同じ考え方で以下のようなSQLを組み立ててみたが、これは失敗に終わった。

SQL
SELECT p2.* FROM wp_posts p2 WHERE p2.ID IN ( SELECT p.ID FROM wp_posts p INNER JOIN wp_term_relationships tr ON p.ID = tr.object_id INNER JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.term_id IN(4, 13, 21) -- 対象の投稿に紐づいたタームID AND p.post_type = 'photo' AND p.post_status = 'publish' AND p.ID <> 1234 -- 対象の投稿を除外 GROUP BY p.ID, p.menu_order ORDER BY COUNT(p.ID) DESC, p.menu_order LIMIT 6 ) ORDER BY p2.menu_order

SQL文としては成立しているように見えるが、これをMySQLで実行しようとすると以下のようなエラーが出てしまう。

SQL エラー (1235): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

要するに「このバージョンのMySQLではIN/ALL/ANY/SOMEの中のサブクエリでLIMITは使えませんよ」というエラーだ。 これはMySQLのドキュメントにも記載されていた。

しかし今回の場合は一度共通するタームの数で並べ替える必要があったのでどうしてもサブクエリが必要になった。 なのでやや見栄えは悪いが、最初に紹介したSQL文のようにサブクエリとテーブルをINNER JOINするという形に落ち着いた。

キーワード
WordPress
シェアする
サイトマップ SITEMAP 写真データ販売中! STOCKPHOTO 写真のデータ販売について 広告 写真 PHOTO
虹雲舞う
黄金雲
曙光
お山の初詣
元旦
雪の夜明かし峠
冬の大峰山脈
朝の冬富士
未明の富士
写真の一覧へ
エリア
ネパール 北海道 東北 屋久島 沖縄 北アルプス 石鎚山系 剣山地 鳥取大山 くじゅう連山 丹沢・大山 富士山
被写体
河川・湖沼 森林 湿原・草原 雲・霧 石・岩 雪・氷 生物 植物 街・集落 鉄道 神社 寺院 人物 生活
季節
時間
夕方 マジックアワー
オレンジ・黄 ピンク・紫 茶色 虹色
キーワード
石鎚神社
販売
Aflo PIXTA imagemart
タグ
トップ画像 傑作選
JOURNEY
2020年 冬の屋久島歩き旅
旅立ち
01. 龍神杉と縄文杉
02. 雪の宮之浦岳
他7ページ
2019年 厳冬期北海道徒歩横断
旅立ち
01. 北海道の首
02. 豪雪地帯を歩く
他6ページ
旅の一覧へ
コラム PHOTO BLOG
よもやま話
登山とパニック発作
写真撮影
逆光で撮る
コラムの一覧へ
カテゴリ
写真撮影 被写体 撮影機材 旅の道具 よもやま話
開発室 DEVELOPMENT BLOG
開発室の一覧へ
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web
広告
サイトマップ SITEMAP
スタジオ旅路
https://tabiji.gallery
渡邊 佑
tabiji.gallery (c) 2020 Yu Watanabe サイトマップ SITEMAP 写真データ販売中! STOCKPHOTO 写真のデータ販売について 写真 PHOTO
虹雲舞う
黄金雲
曙光
お山の初詣
元旦
雪の夜明かし峠
冬の大峰山脈
朝の冬富士
未明の富士
写真の一覧へ
エリア
ネパール 北海道 東北 屋久島 沖縄 北アルプス 石鎚山系 剣山地 鳥取大山 くじゅう連山 丹沢・大山 富士山
被写体
河川・湖沼 森林 湿原・草原 雲・霧 石・岩 雪・氷 生物 植物 街・集落 鉄道 神社 寺院 人物 生活
季節
時間
夕方 マジックアワー
オレンジ・黄 ピンク・紫 茶色 虹色
キーワード
石鎚神社
販売
Aflo PIXTA imagemart
タグ
トップ画像 傑作選
JOURNEY
2020年 冬の屋久島歩き旅
旅立ち
01. 龍神杉と縄文杉
02. 雪の宮之浦岳
他7ページ
2019年 厳冬期北海道徒歩横断
旅立ち
01. 北海道の首
02. 豪雪地帯を歩く
他6ページ
旅の一覧へ
コラム PHOTO BLOG
よもやま話
登山とパニック発作
写真撮影
逆光で撮る
コラムの一覧へ
カテゴリ
写真撮影 被写体 撮影機材 旅の道具 よもやま話
開発室 DEVELOPMENT BLOG
開発室の一覧へ
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web