刚刚注意到 3.1 添加了一个新的过滤器来自定义查询:posts_clauses。 我所能找到的所有信息是,您可以一次性编辑它们,而不是使用单独的查询过滤器,如 posts_where 或 posts_join。 我想知道是否有人可以举例说明新的“posts_clauses”过滤器的用法?
下面是我在某处找到并正在经历的查询。 查询的目的是根据分类法对帖子进行排序。 所以,我正在分享代码,这样它可能会帮助您理解 posts_clauses 的使用。
function color_clauses_mike( $clauses, $query ) {
global $wpdb;
if ( isset( $query->query['orderby'] ) && 'color' == $query->query['orderby'] ) {
$clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id)
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses['where'] .= " AND (taxonomy = 'color' OR taxonomy IS NULL)";
$clauses['groupby'] = "object_id";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $query->get('order') ) ) ? 'ASC' : 'DESC';
}
return $clauses;
}
add_filter( 'posts_clauses', 'color_clauses_mike', 10, 2 );
这是我找到上述查询的来源:http://scribu.net/wordpress/sortable-taxonomy-columns.html
来自 scribu / Hameedullah 的答案是一个很好的指针,但它会隐藏属于不同分类法(例如“类别”)但不属于“颜色”的帖子。 我修改了代码,这似乎很好用:
if ( isset( $wp_query->query['orderby'] ) && 'color' == $wp_query->query['orderby'] ) {
$clauses['join'] .= <<<SQL
LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id
LEFT OUTER JOIN {$wpdb->term_taxonomy} ON wp_term_taxonomy.term_taxonomy_id=wp_term_relationships.term_taxonomy_id AND wp_term_taxonomy.taxonomy='color'
LEFT OUTER JOIN {$wpdb->terms} USING (term_id)
SQL;
$clauses['groupby'] = "wp_posts.ID";
$clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
$clauses['orderby'] .= ( 'ASC' == strtoupper( $wp_query->get('order') ) ) ? 'ASC' : 'DESC';
}