これが状況です。
Get_termsを使用して、関連する投稿とともにTax 1からすべての用語を取得しています。次を使用して
$args = array(
'hide_empty' => 0,
'orderby' => 'name',
'taxonomy' => 'tax_1'
);
$terms = get_terms( $args );
ものすごく単純。ただし、すべての用語が返され、2番目の分類法Tax 2は考慮されません(term xと比較したい)。
最終的に私はTax 1 termTax 2 term xもある投稿を持つすべてを取得したい
私は投稿を直接クエリして、投稿に上記の両方が含まれる用語の配列を作成する可能性が最も高いですが、これは少し面倒です。これを直接クエリする方法があるといいのですが。
ありがとう
たとえば、tax_query引数を使用できます。
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'tax1',
'field' => 'slug',
'terms' => $terms,
),
array(
'taxonomy' => 'tax2',
'field' => 'slug',
'terms' => $terms,
)
)
両方の用語があるすべての投稿を取得する。次に、get_termsを使用してobject_ids
パラメータとして。詳細は WP_Term_Queryのドキュメント を参照してください。
最初に、あなたは"get_termsを使用して、関連付けられた投稿を含む税1からすべての用語を取得します"ですが、実際のコードは、投稿があるかどうかに関係なく、その分類法のすべての用語を取得します。 _hide_empty
_をtrue
に設定する必要があります。
ですから、それが邪魔になると、悪いニュースです。get_terms()
を使用してこれを行うことはできません。この種の情報は、投稿のクエリと用語の比較なしには存在しません。だから、あなたが避けたかった厄介な解決策は、残念ながら必要です。
結局のところ、これはSQLを使用したほうがよい状況だと思います。このコードは_$wpdb
_を使用して、分類Bに特定の用語が含まれる特定の投稿タイプの投稿を持つ分類Aから用語を取得します。
_$post_type = 'post';
$taxonomy_a = 'post_tag';
$taxonomy_b = 'category';
$term_b_id = 12;
$query = $wpdb->prepare(
"SELECT DISTINCT
terms.*
FROM
`wp_terms` terms
INNER JOIN
`wp_term_taxonomy` tt1 ON
tt1.term_id = terms.term_id
INNER JOIN
`wp_term_relationships` tr1 ON
tr1.term_taxonomy_id = tt1.term_taxonomy_id
INNER JOIN
`wp_posts` p ON
p.ID = tr1.object_id
INNER JOIN
`wp_term_relationships` tr2 ON
tr2.object_ID = p.ID
INNER JOIN
`wp_term_taxonomy` tt2 ON
tt2.term_taxonomy_id = tr2.term_taxonomy_id
WHERE
p.post_type = %s AND
p.post_status = 'publish' AND
tt1.taxonomy = %s AND
tt2.taxonomy = %s AND
tt2.term_id = %d",
[
$post_type,
$taxonomy_a,
$taxonomy_b,
$term_b_id,
]
);
$results = $wpdb->get_results( $query );
if ( $results ) {
$terms = array_map( 'get_term', $results );
}
_
つまり、そのコードは、ID 12でCategoryに割り当てられているPostsを持つすべてのTagsを取得します。
get_term()
の最後の少しにより、get_terms()
を実行した場合と同じ_WP_Term
_オブジェクトが最終配列に確実に含まれます。