带有与术语x具有不同分类的帖子的GET_TERMS

时间:2019-01-30 作者:epluribusunum

情况是这样的;

我正在使用get\\u terms从中检索所有术语Tax 1 与之关联的帖子。使用以下各项

$args = array(
            \'hide_empty\'    =>  0,
            \'orderby\'       =>  \'name\',
            \'taxonomy\'      =>  \'tax_1\'
        );

$terms  =   get_terms( $args );
非常简单。但是,它返回所有术语,并且不考虑第二种分类法Tax 2 我想比较一下term x

最终我想得到所有Tax 1 terms 有帖子也有Tax 2 term x

我很可能会直接在帖子上进行查询,并创建一个术语数组,其中帖子包含上述两个术语,但这似乎有点混乱,我希望有一种方法可以直接查询。

谢谢

2 个回复
SO网友:Jacob Peattie

首先,您会说“我正在使用get\\u terms从Tax 1中检索所有与之相关联的帖子中的术语”,但是您的实际代码会获取该分类法中的所有术语,无论它们是否有帖子。您需要设置hide_emptytrue.

这样一来,坏消息就是:你不能用get_terms(). 如果不查询帖子和比较术语,这种类型的信息是不存在的。因此,不幸的是,您想要避免的混乱解决方案是必要的。

最终,我认为在这种情况下,只使用SQL可能会更好。此代码将使用$wpdb 要从分类法A中获取术语,其中包含任何给定帖子类型的帖子,这些帖子在分类法B中具有特定术语,请执行以下操作:

$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的类别的帖子。

最后一点get_term() 确保最终数组包含相同的WP_Term 通过运行可以获得的对象get_terms().

SO网友:Alexander Holsgrove

您可以使用tax\\u query参数,例如:

\'tax_query\' => array(
    \'relation\' => \'AND\',
    array(
        \'taxonomy\' => \'tax1\',
        \'field\'    => \'slug\',
        \'terms\'    => $terms,
    ),
    array(
        \'taxonomy\' => \'tax2\',
        \'field\'    => \'slug\',
        \'terms\'    => $terms,
    )
)
获取所有包含两个术语的帖子。然后可以使用get\\u术语并传递object_ids 作为参数。请参见WP_Term_Query documentation 了解更多详细信息。

相关推荐

Get_Terms()Order by Term_Meta

我正在做一个get_terms() 我试图按自定义术语元排序的查询。自定义术语元键是\'order\' 它是一个数值(介于1和10之间)。我尝试了以下方法,但顺序似乎没有遵循元值-任何指针都是值得赞赏的。$type_terms = get_terms( \'type\', array( \'hide_empty\' => false, array( \'key\' => \'order\', ), \'or