web-dev-qa-db-ja.com

用語xで分類が異なる投稿のget_terms

これが状況です。

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もある投稿を持つすべてを取得したい

私は投稿を直接クエリして、投稿に上記の両方が含まれる用語の配列を作成する可能性が最も高いですが、これは少し面倒です。これを直接クエリする方法があるといいのですが。

ありがとう

1
epluribusunum

たとえば、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のドキュメント を参照してください。

1

最初に、あなたは"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 12Categoryに割り当てられているPostsを持つすべてのTagsを取得します。

get_term()の最後の少しにより、get_terms()を実行した場合と同じ_WP_Term_オブジェクトが最終配列に確実に含まれます。

1
Jacob Peattie