web-dev-qa-db-ja.com

WooCommerceショップページのカテゴリをフィルタして関連サブカテゴリを表示する

商品カテゴリのフィルタリングを使用していますが、成功していません。ショップページで表示したときに、すべての商品の商品titlepriceの間に商品のサブカテゴリを表示しようとしています。

私はいくつかの解決策を試してみましたが、本当に苦労しています。以下は、カテゴリDesigner -> Designer Nameの各サブカテゴリを表示しようとしているショップページへのリンクです。

ここでTitlePriceの間にDesigner Nameサブカテゴリを入れる必要があります: http://glamboutique.wpengine.com/shop/

私はいくらか進歩しました。私は現在親カテゴリを表示していますが、私が述べたようにDesignerTitleの間に表示するにはPriceのサブカテゴリ(親カテゴリ)が必要です。以下はそのコードです。

function wc_shop_product_sub_category() {
    $product_cats = wp_get_post_terms( get_the_ID(), 'product_cat' );
    if ( $product_cats && ! is_wp_error ( $product_cats ) ) {
        $single_cat = array_shift( $product_cats );
        ?>
        <h2 itemprop="name" class="product_category_title"><span><?php echo $single_cat->name; ?></span></h2>
        <?php
    }
}
add_action( 'woocommerce_after_shop_loop_item_title', 'wc_shop_product_sub_category' );

更新

そこで検討した後、私はFayazの反応をしっかりとした解決策として思いついた。

function wc_shop_product_sub_category() {
    global $post;
    // grabs a specific category based on the slug
    $brands_id = get_term_by('slug', 'designers', 'product_cat');

    // gets subcats and loops through them to display
    $terms = get_the_terms($post->ID, 'product_cat');
    foreach ($terms as $term) {
        if($term->parent === $brands_id->term_id) { ?>
            <h6 class="product-sub-cats"><?php echo $term->name; ?></h6>
            <?php  break;
         }
    }
}
// this will place the designers between title & price
add_action( 'woocommerce_shop_loop_item_title', 'wc_shop_product_sub_category' );

現在のところ、この解決策ではTitlePriceの間にDesigner Nameを配置していません。その解決方法を検討しています。

1
Erik

あなたの説明によると、私はあなたのそれぞれの製品がDesignersカテゴリの下にDesignersdesigner-nameサブカテゴリという名前のカテゴリを持っていると思います。

その場合、次のコードがあなたのために働きます(説明のためにコード内のコメントを読んでください):

function wc_shop_product_sub_category() {
    // get the category object for "designers" category
    $designers_category = get_term_by( 'name', 'designers', 'product_cat' );
    if( $designers_category ) {
        // this CODE returns all the sub-categories of "designers" category
        // that belongs to the current product in the loop
        $designers = wp_get_post_terms( get_the_ID(), 'product_cat', array( 'child_of' => $designers_category->term_id ) );
        if ( $designers && ! is_wp_error( $designers ) ) {
            // remember, there may be multiple sub categories for "Designers" category. So if you want to
            // show multiple designers, you'll need to loop through the $designers array to show them all
            $designer = array_shift( $designers );
            ?>
            <h2 itemprop="name" class="product_category_title"><span><?php echo $designer->name; ?></span></h2>
            <?php
        }
    }
}
// this will place the designers between title & price
add_action( 'woocommerce_shop_loop_item_title', 'wc_shop_product_sub_category' );
// this will place the designers after price
// add_action( 'woocommerce_after_shop_loop_item_title', 'wc_shop_product_sub_category' );
0
Fayaz