写真 ブログ 開発室
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 広告 写真 PHOTO
年度
2023 2022 2021 2020 2019 2018 2017 ~2016
アルバム
傑作選 北海道 石鎚山系 ネパール 屋久島 北アルプス
写真の一覧へ
ストックフォトで作品を探す
JOURNEY
2020年 冬の屋久島歩き旅
2019年 厳冬期北海道徒歩横断
旅の一覧へ
ブログ BLOG
カテゴリ
写真 よもやま話
タグ
スポット 道具 心得
ブログの一覧へ
開発室 DEVELOPMENT
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web
開発室の一覧へ
広告
サイトマップ SITEMAP
スタジオ旅路
https://tabiji.gallery
渡邊 佑
tabiji.gallery (c) 2020 Yu Watanabe サイトマップ SITEMAP 写真 PHOTO
年度
2023 2022 2021 2020 2019 2018 2017 ~2016
アルバム
傑作選 北海道 石鎚山系 ネパール 屋久島 北アルプス
写真の一覧へ
ストックフォトで作品を探す
JOURNEY
2020年 冬の屋久島歩き旅
2019年 厳冬期北海道徒歩横断
旅の一覧へ
ブログ BLOG
カテゴリ
写真 よもやま話
タグ
スポット 道具 心得
ブログの一覧へ
開発室 DEVELOPMENT
カテゴリ
ASP.NET Core C# WordPress PHP TypeScript JavaScript Web
開発室の一覧へ