wordpressで検索して、facetみたいなものを実装したかったのです。

データベースから直接クエリで引っ張り出す

本当は何かいい関数があるのかもしれないけれど、色々欲しい機能に限ってなかったりするので、クエリを叩いて直接facetを出す関数を作ることにした。

ひとまずデータベースを見て見ると…非常にめんどくさい構成になっていて、joinを数回しないと実現できない模様。RDBとしては正しいのかもしれないけど…。

ひとまず、以下クエリを実行。クエリの頭にWP7_と付いていたので、サイト別の環境によっては適宜差し替えるということで。

$query_sql='select name,slug,count(*) as con from (
SELECT  ID,tbl4.term_id,tbl4.name,tbl4.slug  FROM wp7_posts  as tbl1
left join wp7_term_relationships as tbl2
on tbl1.ID=tbl2.object_id
left join wp7_term_taxonomy as tbl3
on tbl2.term_taxonomy_id=tbl3.term_taxonomy_id
left join wp7_terms as tbl4 
on tbl3.term_id=tbl4.term_id
WHERE 1=1  AND (((tbl1.post_title LIKE :word1) OR (tbl1.post_excerpt LIKE :word2) OR (tbl1.post_content LIKE :word3)))  AND tbl1.post_type = "post" AND ((tbl1.post_status = "publish"))  and 
tbl3.taxonomy="category" and tbl3.parent>0
) as all_tbl group by name order by con desc limit 10';

$query=$db->prepare($query_sql);
$query->bindvalue(':word1',"%'.$word.'%");
$query->bindvalue(':word2',"%'.$word.'%");
$query->bindvalue(':word3',"%'.$word.'%");
$query->execute();
$query=$query->fetchall();

foreach($query as $q){
//ex) echo $q["slug"].'+++'.$q["con"];
}

条件としては、マッチした記事についてるカテゴリをカウントして、多いカテゴリから10件抜いた的な。

そんな感じでひとまず作成したので、メモ程度に。

コメント