正如聊天中所讨论的,正如@Rarst已经告诉你的,没有默认的WordPress方式可以完成
多种分类法及其所有术语的存档
事实上没有办法实现
单一分类法及其所有术语的存档
在WordPress中。只是因为WordPress不能做到这一点——没有自定义SQL查询。
但你可以做一些事情来简化你的方法。
正如您在聊天中所述,我将更详细地介绍以下内容:
本质上,我试图创建的是一个类别的归档。因此,对于每个类别(自定义分类法),我想显示其中一篇文章的特色图像,以及类别的标题。
$taxonomies = get_object_taxonomies( get_post_type_object( \'prints\' )->name, \'names\' );
注意:如果设置
get_object_taxonomies()
到
objects
, 您将获得完整的对象供以后使用
和get_terms()
将分类法数组作为第一个参数。因此,您可以执行以下操作来获取分配给prints
CPT。
注意:如果使用上面的第二个参数并获得完整的对象,请使用wp_list_pluck()
提取分类名称
$terms = get_terms( $taxonomies, array() );
如果需要影响订单,可以使用
orderby
(默认值:
name
) 和
order
(默认值:
ASC
Ending)函数调用的第二个参数/数组中的参数或使用筛选器:
apply_filters( \'get_terms_orderby\', $orderby, $args );
正如开头所述,没有默认方法可以实现在术语查询中获得一篇文章的目标。
But 您仍然可以构建自己的SQL查询。还有一个过滤器:
apply_filters( \'terms_clauses\', compact( $pieces ), $taxonomies, $args );
因此,您可以跳入、更改查询、包括posts表等。
add_action( \'terms_clauses\', \'wpse114800_get_terms_with_posts\', 20, 3 );
function wpse114800_get_terms_with_posts( $clauses, $taxonomies, $args )
{
// Alter the $clauses
return $clauses;
}
上述过滤器回调的结果将改变WordPress生成的查询。core中的默认值如下所示:
"SELECT $fields FROM $wpdb->terms AS t $join WHERE $where $orderby $order $limits"
The
JOIN
子句的结构如下所示:
"INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"
你现在要做的是
JOIN
这个
$wpdb->term_relationship
可能有以下情况:
INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id
借用自
wp_get_object_terms()
在核心
这个WHERE
子句看起来很可能像这样:
$wpdb->prepare( "WHERE tt.taxonomy IN (%s)", "\'".implode( "\', \'", $taxonomies)."\'" )
从现在起,你应该能够
JOIN
这个
$wpdb->posts
上的表格
ID
并为每个分类术语查询一篇文章。
我强烈建议以某种方式缓存结果,将其添加为瞬态或类似的内容,因为查询可能会变得非常慢。