情况就是这样;
我使用get_terms检索Tax 1中的所有术语,并发布与其相关的帖子。使用以下内容
$args = array(
'hide_empty' => 0,
'orderby' => 'name',
'taxonomy' => 'tax_1'
);
$terms = get_terms( $args );很简单。然而,这将返回所有的术语,并且不考虑第二个分类法Tax 2,我想将它与term x进行比较。
最后,我希望得到所有的Tax 1术语,其中的帖子也有Tax 2术语x
我最有可能直接在帖子上进行查询,并创建一组包含上述两种内容的术语,但这似乎有点混乱,我希望有一种方法可以直接查询这一点。
谢谢
发布于 2019-01-30 13:26:02
首先,您可以说“我正在使用get_terms从赋税1中检索与其相关的所有术语”,但是您的实际代码获得了该分类法中的所有术语,不管它们是否有posts。您需要将hide_empty设置为true。
因此,抛开这一问题,坏消息是:您将无法在get_terms()中做到这一点。如果不查询帖子和比较术语,这种类型的信息是不存在的。因此,您想要避免的混乱解决方案不幸是必要的。
最终,我认为在这种情况下,只使用SQL可能会更好。此代码将使用$wpdb从分类法A中获得具有在分类法B中具有特定术语的给定post类型的帖子的术语:
$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()的最后一点确保最终数组包含与运行get_terms()所获得的相同的WP_Term对象。
发布于 2019-01-30 12:58:23
您可以使用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_术语_查询文档。
https://wordpress.stackexchange.com/questions/327139
复制相似问题