如果您有很多产品,那么定制sql查询可能是更好的选择。
我可能会建议你走这条路线。自定义查询可能会“讨厌”,但在大多数情况下,它会减轻资源负担,并且会稍微快一点*
我已经编写了一个函数,它完成了大部分工作,在其他场景中可能会派上用场(我用“soft”一词表示关系不明确)。
/**
* Get terms that are indirectly associated with others through the posts they
* are attached to.
*
* @see http://codex.wordpress.org/Function_Reference/WP_Query#Taxonomy_Parameters
* @link http://wordpress.stackexchange.com/questions/16393/
*
* @param string|array $taxonomy The taxonomy(s) of the terms you wish to obtain.
* @param array $tax_query A tax query for the posts you want to make the association with.
* @return array Array of term IDs.
*/
function get_terms_soft_associated( $taxonomy, $tax_query )
{
global $wpdb;
// so you can pass a single tax query rather than wasted nested array
if ( isset( $tax_query[\'taxonomy\'] ) )
$tax_query = array( $tax_query );
$tax = new WP_Tax_Query( $tax_query );
extract( $tax->get_sql( $wpdb->posts, \'ID\' ) );
if ( empty( $join ) || ( !$posts = $wpdb->get_col( "SELECT $wpdb->posts.ID FROM $wpdb->posts $join WHERE 1=1 $where" ) ) )
return array();
$taxonomy = implode( "\',\'", array_map( \'esc_sql\', ( array ) $taxonomy ) );
$posts = implode( \',\', wp_parse_id_list( $posts ) );
return $wpdb->get_col(
"SELECT DISTINCT t.term_id FROM $wpdb->terms AS t " .
"INNER JOIN $wpdb->term_taxonomy AS tt ON tt.term_id = t.term_id " .
"INNER JOIN $wpdb->term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id " .
"WHERE tt.taxonomy IN(\'$taxonomy\') AND tr.object_id IN($posts)"
);
}
您也可以退房
the codex on tax queries 有关更多帮助
$tax_query
. 这是我们用来过滤帖子的查询,然后再进行反向查找以收集帖子的所有术语,以用于另一种分类法。
现在开始解决方案;
// suggestion 1 - for a single post
$product_cats = get_the_terms( get_the_ID(), \'myprod_category\' );
// suggestion 2 - for a product category archive
$product_cats = get_queried_object_id();
// suggestion 3 - for all posts on the current page of an archive
foreach( $wp_query->posts as $_post ) {
$_product_cats = get_the_terms( $_post->ID, \'myprod_category\' );
foreach ( $_product_cats as $_product_cat )
$product_cats[] = $_product_cat->term_id;
}
// now get the \'associated\' tag IDs
$product_assoc_tags = get_term_soft_association( \'product_tag\', array(
\'taxonomy\' => \'myprod_category\',
\'field\' => \'term_id\',
\'terms\' => $product_cats
) );
wp_tag_cloud( array( \'taxonomy\' => \'product_tag\', \'include\' => $product_assoc_tags ) );
请注意,这些建议是如何获取所有产品类别以供以后查询的示例,具体取决于您的情况以及您希望影响结果的帖子(仅使用其中一个建议,或您自己的建议!)。
如果您发现它没有像您预期的那样工作,那么我们可能只需要调整函数第二个参数的税务查询。
*Footnote: 本机post查询提取所有post数据,而我们只需要使用ID。把内存保存在你可以帮助的地方,正如@Daniel所说,如果我们谈论很多帖子,我们也谈论了很多内存。
我还说,在开箱即用的条件下,我们使用的数据库查询要少得多;比我们使用的函数get_terms()
和get_posts()
.