附加了特定自定义分类的自定义帖子类型的GET_Categories

时间:2011-03-03 作者:daveaspinall

基本上,我有一个自定义的“产品”帖子类型,它附带了两个分类法。。。普通的“类别”和一种称为“品牌”的自定义分类法。

我有一个特定于“品牌”的页面。在这一页上,我想列出所有包含“产品”的“类别”,并附上“品牌”一词。

假设我在“Nike”页面上。我想让它列出所有类别中都有“产品”,并附上“Nike”品牌。

我最初的想法是使用get\\u类别,但现在有办法定义特定的分类法或“品牌”?

$categories = get_categories(\'orderby=name&depth=1&hide_empty=0&child_of=\'.$cat);
有没有人曾经这样做过,或者知道直接查询数据库以获得所需结果的方法?

非常感谢您的帮助,谢谢

3 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@daveaspi:

您想做的事情在WordPress core中很常见,但处理得不好。可能有一些方法可以在没有自定义SQL的情况下做到这一点,但我认为它们不会扩展到大量帖子。下面是我编写的一个函数get_cross_referenced_terms() 这将得到您想要的,并附有一个如何使用它的示例。

以下代码可以放置在WordPress站点的根目录中test.php 文件以查看其工作情况。然后可以复制该函数get_cross_referenced_terms() 进入你的主题functions.php 文件或放入.php 您可能正在使用的插件的文件:

<?php 

  include(\'wp-load.php\');

  $nike = get_term_by(\'slug\',\'nike\',\'brand\'); // This here just to illustrate

  $terms = get_cross_referenced_terms(array(
    \'post_type\'        => \'product\',
    \'related_taxonomy\' => \'brand\',
    \'term_id\'          => $nike->term_id,
  ));
  foreach($terms as $term) {
    echo "<p>{$term->name}</p>";
  }

function get_cross_referenced_terms($args) {
  global $wpdb;
  $args = wp_parse_args($args,array(
    \'post_type\'        => \'post\',
    \'taxonomy\'         => \'category\',
    \'related_taxonomy\' => \'post_tag\',
    \'term_id\'          => 0,
  ));
  extract($args);
  $sql = <<<SQL
SELECT DISTINCT
  {$wpdb->terms}.*,
  COUNT(*) AS post_count
FROM
  {$wpdb->terms}
  INNER JOIN {$wpdb->term_taxonomy} ON {$wpdb->terms}.term_id={$wpdb->term_taxonomy}.term_id
  INNER JOIN {$wpdb->term_relationships} ON {$wpdb->term_taxonomy}.term_taxonomy_id={$wpdb->term_relationships}.term_taxonomy_id
  INNER JOIN {$wpdb->posts} ON {$wpdb->term_relationships}.object_id={$wpdb->posts}.ID
  INNER JOIN {$wpdb->term_relationships} related_relationship ON {$wpdb->posts}.ID=related_relationship.object_id
  INNER JOIN {$wpdb->term_taxonomy} related_term_taxonomy ON related_relationship.term_taxonomy_id=related_term_taxonomy.term_taxonomy_id
  INNER JOIN {$wpdb->terms} related_terms ON related_term_taxonomy.term_id=related_terms.term_id
WHERE 1=1
  AND (related_term_taxonomy.taxonomy<>{$wpdb->term_taxonomy}.taxonomy OR related_terms.term_id<>{$wpdb->terms}.term_id)
  AND {$wpdb->posts}.post_type=\'%s\'
  AND {$wpdb->term_taxonomy}.taxonomy=\'%s\'
  AND related_term_taxonomy.taxonomy=\'%s\'
  AND related_terms.term_id=%d
GROUP BY
  {$wpdb->terms}.term_id
SQL;
  $sql = $wpdb->prepare($sql,$post_type,$taxonomy,$related_taxonomy,$term_id);
  $terms = $wpdb->get_results($sql);
  return $terms;
}

SO网友:Steve Pheriche

如果要列出自定义帖子类型的所有可用类别,此代码段可能会对您有所帮助。

只需使用标准get_categories() 函数并传递$args 与您为CPT注册的分类有关。因此,如果您这样定义分类法:

register_taxonomy( \'the_taxonomy_named_in_your_CPT\' );
然后,您可以通过以下方式向前端用户显示分类法:

$args = array( 
    \'taxonomy\'     => \'the_taxonomy_named_in_your_CPT\',
    \'orderby\'      => \'name\',
    \'show_count\'   => 1,
    \'pad_counts\'   => 1, 
    \'hierarchical\' => 1,
    \'echo\'         => 0
);

$allthecats = get_categories( $args );
echo ( \'<pre>\' );
print_r( $allthecats );
echo ( \'</pre>\' );
你将看到一个物体,它将帮助你前进。

SO网友:Bainternet

您可以编写自定义sql查询代码,也可以查询该“品牌”的帖子类型,收集类别,然后显示它们,例如:

//get all your post of that type fo that spesific brand
$my_query = new WP_Query();
$my_query->query(array(
    \'post_type\' => \'products\',
    \'posts_per_page\' => -1,
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'brand\',
            \'field\' => \'slug\',
            \'terms\' => $wp_query->query_vars[\'brand\']
        )
    )
    ));
$my_cats = array(); 
if ($my_query->have_posts()){
//loop over all post and collect the categories in to an array
    while ($my_query->have_posts()){
        $my_query->the_post();
        foreach((get_the_category($post->ID)) as $category) {
            if (!in_array($category->cat_ID ,$my_cats)){
                $my_cats[] = $category->cat_ID;
            }
        } 
    }
}
这里是数组$my\\u cats中所有类别ID的列表。您可以从中获得所需的所有信息

结束

相关推荐

Custom Taxonomy Term Caching?

我有两种自定义帖子类型,“事件”和“机会”。它们共享一个自定义的层次分类法“位置”。我的客户添加了一些条款(美国(家长),然后是几个州(孩子))。我决定通过wp\\u insert\\u term添加其余的州来节省时间。这很有效!或者,看起来是这样。作为一名管理人员,这些条款对我来说很好。当我登录到一个“贡献者”帐户时,我可以去创建一个新的“机会”,所有的条件都如预期的那样显示出来。当要创建一个新的“事件”时,只会显示手工创建的术语。您可以通过“事件”在现场添加一个新术语,它在位置管理器中显示得很好。就好