ここ数時間、分類用語に基づいて投稿を検索するためにフィルタフックposts_where
とposts_join
を使用しようとしています。この場合、分類は「カテゴリ」で、用語は「政治」です
これが私が試した結果、空のクエリになったのです。
この行はフックposts_where
の内側です
$where .= " OR ($wpdb->term_taxonomy.taxonomy IN ('category') AND $wpdb->terms.name = 'politics')";
そしてこれが私が異なったテーブルを結合するのに使用したものです:
$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
$join .= " LEFT JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) ";
$join .= " LEFT JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) ";
$join .= " LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id) ";
私はうまくいく代替案を思い付きましたが、私は前のコードで何が間違っているのか、そしてそれをどのように機能させるのかを知りたいのです。
実用的な代替手段はこれです(これはposts_join
フックを使用していません)。
$search .= " OR ($wpdb->posts.ID IN(
SELECT $wpdb->term_relationships.object_id as post_id
FROM $wpdb->term_taxonomy, $wpdb->terms, $wpdb->term_relationships
WHERE $wpdb->term_taxonomy.term_id = $wpdb->terms.term_id
AND $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
AND $wpdb->term_taxonomy.taxonomy in ('category')
AND ($wpdb->terms.name LIKE 'politics')
)
)";
それでは、posts_where
およびposts_join
フックを使用して分類法の用語を照会するにはどうすればよいでしょうか。
さて、さまざまなことを試した後、私は以下のことを思いつきました。
posts_join
を使用するとき、接頭辞$wpdb->
とクエリされるテーブルを追加する必要はありません。列名だけが必要です。この場合、以下のようにname
とtaxonomy
が必要です。
の前に
$where .= " OR ($wpdb->term_taxonomy.taxonomy IN ('category') AND $wpdb->terms.name LIKE 'politics')";
の後
$where .= " OR ( taxonomy IN ('category') AND name LIKE 'politics')";
クエリがより複雑になるにつれて、エイリアスを使用する必要があることを指摘するのは良いことです。
エイリアスを使用すると、次のようになります。
posts_where
フックの場合:
$where .= " OR (wtt.taxonomy IN ('category') AND wt.name LIKE 'politics' )";
posts_join
フックの場合:
$join .= " LEFT JOIN $wpdb->term_relationships as wtr ON ($wpdb->posts.ID = wtr.object_id) ";
$join .= " LEFT JOIN $wpdb->term_taxonomy as wtt ON (wtr.term_taxonomy_id = wtt.term_taxonomy_id) ";
$join .= " LEFT JOIN $wpdb->terms as wt ON(wtt.term_id = wt.term_id) ";