web-dev-qa-db-ja.com

商品の主な親カテゴリを取得する

誰かが私を助けてもらえますか、私はWooCommerce製品の主な親製品カテゴリを見つける方法を探していますか?たとえば、製品はガジェットの下にマークされていますが、それらのすべての主要な親はエレクトロニクスです。

各投稿にそのメインの親であるproduct_catを表すクラスを追加したいので、投稿ごとにこれが欲しいのです。

製品カテゴリはカスタム分類法であり、get_category_parents()を使用して検索することはできません。それらは用語としてリストされています。

前もって感謝します。

//編集:

これは私がすでに持っているコードです、私は各記事でこれを呼んでいます、そして私の記事はアーカイブページのようにレンダリングされます。

function all_cat_classes($post) {
    $cats = "";

    $terms = get_the_terms($post->ID, "product_cat");

    $count = 0;
    $count = count($terms);
    $key = 0;
    foreach ($terms as $cat) {

        $key++;
    }

    return $cats;
}
1

私は自分自身の機能を「連鎖」まで上がるために書いた。私の再帰は、これまで見た中で最高の実装ではないかもしれませんが、うまくいきます。

function get_parent_terms($term) {
    if ($term->parent > 0) {
        $term = get_term_by("id", $term->parent, "product_cat");
        if ($term->parent > 0) {
            get_parent_terms($term);
        } else return $term;
    }
    else return $term;
}

# Will return all categories of a product, including parent categories
function all_cat_classes($post) {
    $cats = ""; 
    $terms = get_the_terms($post->ID, "product_cat");
    $key = 0;

    // foreach product_cat get main top product_cat
    foreach ($terms as $cat) {
        $cat = get_parent_terms($cat);
        $cats .= (strpos($cats, $cat->slug) === false ? $cat->slug." " : "");
        $key++;
    }

    return $cats;
}
1

誰かに役立つかもしれない代替ソリューションを提供するためだけに:

コード

function wc_Origin_trail_ancestor( $link = false, $trail = false ) {

    if (is_product_category()) {
        global $wp_query;
        $q_obj = $wp_query->get_queried_object();
        $cat_id = $q_obj->term_id;

        $descendant = get_term_by("id", $cat_id, "product_cat");
        $descendant_id = $descendant->term_id;

        $ancestors = get_ancestors($cat_id, 'product_cat');
        $ancestors = array_reverse($ancestors);

        $Origin_ancestor = get_term_by("id", $ancestors[0], "product_cat");
        $Origin_ancestor_id = $Origin_ancestor->term_id;

        $ac = count($ancestors);

    } else if ( is_product() ) {

        $descendant = get_the_terms( $post->ID, 'product_cat' );
        $descendant = array_reverse($descendant);
        $descendant = $descendant[0];
        $descendant_id = $descendant->term_id;

        $ancestors = array_reverse(get_ancestors($descendant_id, 'product_cat'));
        $ac = count($ancestors);

    }


    $c = 1;
    if( $trail == false ){

        $Origin_ancestor_term = get_term_by("id", $ancestors[0], "product_cat");
        $Origin_ancestor_link = get_term_link( $Origin_ancestor_term->slug, $Origin_ancestor_term->taxonomy );

        if($link == true) 
            echo '<a href="'. $Origin_ancestor_link .'">';
        echo $Origin_ancestor_term->name;
        if($link == true) 
            echo '</a>';

    }else{

        foreach ($ancestors as $ancestor) {
            $ancestor_term = get_term_by("id", $ancestor, "product_cat");
            $ancestor_link = get_term_link( $ancestor_term->slug, $ancestor_term->taxonomy );

            if($c++ == 1) 
                echo '» '; 
            else if($c++ != 1 || $c++ != $ac) 
                echo ' » ';

            if($link == true) 
                echo '<a href="'. $ancestor_link .'">';
            echo  $ancestor_term->name;
            if($link == true) 
                echo '</a>';

        }

        $descendant_term = get_term_by("id", $descendant_id, "product_cat");
        $descendant_link = get_term_link( $descendant_term->slug, $descendant_term->taxonomy );

        echo ' » ';
        if($link == true) 
            echo '<a href="'. $descendant_link .'">';
        echo $descendant->name;
        if($link == true) 
            echo '</a>';

    }

}

使い方

  • ちょうどトップレベル、Originの祖先。リンクなし
    wc_Origin_trail_ancestor();
  • ちょうどトップレベル、Originの祖先。リンク付き
    wc_Origin_trail_ancestor(true);
  • 祖先トレイル。リンクなし
    wc_Origin_trail_ancestor(false,true);
  • 祖先トレイル。リンク付き
    wc_Origin_trail_ancestor(true,true);

ノート

  • 商品に複数のメイン/トップレベルのカテゴリがある場合、または少なくともそれらすべてが表示されない場合は機能しません。
  • 同じレベルの複数のサブカテゴリについても同様です。
  • 上記の点についてはこれ以上テストを行いませんでした。その機能は、そのプロジェクトに必要なすべての機能を果たすためです。
2
Nicolai

これを試すことができます:

<?php
  $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) );
  $parents = get_the_terms($term->parent, get_query_var('taxonomy') );

  foreach( $parents as $parent ) {
    echo $parent->name;
  }

?>
0