web-dev-qa-db-ja.com

特定のカスタム分類法が添付されたカスタム投稿タイプのget_categories

基本的に、私は2つの分類法が添付された「商品」のカスタム投稿タイプがあります。通常の「カテゴリ」と「ブランド」と呼ばれるカスタム分類法です。

ブランド固有のページがあります。このページには、私が添付しているページの「ブランド」という用語を含む「製品」を含むすべての「カテゴリ」をリストしたいと思います。

例えば。私は "Nike"ページにいます。その中に「製品」があるすべてのカテゴリを「Nike」の「ブランド」と一緒にリストしたいのです。

私の最初の考えはget_categoriesを使うことですが、今は特定の分類法または「ブランド」を定義する方法はありますか?

$categories = get_categories('orderby=name&depth=1&hide_empty=0&child_of='.$cat);

誰かがこれを以前にやったことがあるか、必要な結果を得るためにデータベースに直接問い合わせる方法を知っていますか?

手助けは非常に心配です、ありがとう

6
daveaspinall

こんにちは @daveaspi:

やりたいことは一般的ですが、WordPressコアではうまく処理されません。カスタム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;
}
3
MikeSchinkel

カスタム投稿タイプで利用可能なすべてのカテゴリを一覧表示する場合は、このスニペットが役に立ちます。

標準のget_categories()関数を使用して、CPTに登録した分類法に関連する$argsを渡すだけです。したがって、分類法を次のように定義したとします。

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>' );

あなたはあなたの方法であなたを助けるだろう物を見るでしょう。

2
Steve Pheriche

カスタム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_catsの中にすべてのカテゴリーIDのリストを持っています。あなたはあなたがからあなたが必要とするすべての情報を得ることができます

1
Bainternet