web-dev-qa-db-ja.com

Posts_whereの分類用語を問い合わせるためにfilter hook posts_joinを使用する方法?

ここ数時間、分類用語に基づいて投稿を検索するためにフィルタフックposts_whereposts_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フックを使用して分類法の用語を照会するにはどうすればよいでしょうか。

1
Gixty

さて、さまざまなことを試した後、私は以下のことを思いつきました。

posts_joinを使用するとき、接頭辞$wpdb->とクエリされるテーブルを追加する必要はありません。列名だけが必要です。この場合、以下のようにnametaxonomyが必要です。

の前に

$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) ";
4
Gixty