cari

Rumah  >  Soal Jawab  >  teks badan

Pilih produk berkaitan woocommerce menggunakan taksonomi tersuai dengan hierarki 3 tahap

Saya mempunyai kedai woocommerce dengan kategori tersuai "Sukan". Klasifikasi mempunyai tiga peringkat - ibu bapa, anak, anak - contohnya: Sukan Dalaman > Jika pengguna melihat item Bola Keranjang, maka saya mahu produk yang berkaitan menunjukkan item Bola Keranjang yang lain dahulu, dan kemudian kembali ke item Sukan Arena jika tidak ada item Bola Keranjang yang mencukupi. Jadi, tahap yang paling rendah disemak dahulu - Sub-Child, kemudian Child, kemudian Ibu Bapa.

Selain itu, saya menggunakan RankMath dan saya boleh menetapkan istilah klasifikasi sebagai istilah "utama". Jadi, dalam contoh di atas, istilah utamanya ialah bola keranjang. Istilah utama hampir selalu merupakan sub-sub-istilah, tetapi mungkin juga sub-istilah.

Saya menggabungkan jawapan daripada dua soalan lain dan kod tersebut berfungsi dengan memilih produk yang berkaitan daripada kategori sukan. Tetapi ia hanya melihat pada sub-peringkat, bukan sub-sub-peringkat. Jadi, dalam contoh di atas, ia memilih item dalam Sukan Arena tanpa mengutamakan Bola Keranjang.

Apakah perubahan yang perlu saya buat untuk memastikan produk berkaitan melihat istilah taksonomi "utama" dan kemudian mencari produk dengan istilah itu dahulu, dan kemudian (jika perlu) peringkat seterusnya ke bawah hierarki istilah?

Terima kasih atas sebarang bantuan atau nasihat yang boleh anda berikan.

Saya merujuk kepada dua artikel ini semasa merangka kod:

Produk Berkaitan WooCommerce oleh Kategori Kanak-kanak sebagai Sandaran kepada Kedudukan Kategori Utama Matematik

Gunakan taksonomi tersuai untuk memilih produk yang berkaitan dalam Woocommerce

Ini adalah kod yang saya gunakan sekarang:

add_filter( 'woocommerce_related_products', 'related_products_from_rankmath_primary_esporte_taxonomy', 10, 3 );
    function related_products_from_rankmath_primary_esporte_taxonomy( $related_posts, $product_id, $args ) {
        $taxonomy     = 'sport'; 
        $term_ids     = wp_get_post_terms( $product_id, $taxonomy, array( 'fields' => 'ids' ) ); 
        $term_slugs   = array(); 
  
 if( count($term_ids) == 1 ) {
        // Get children categories
        $children_ids = get_term_children( reset($category_ids), $taxonomy );
        // Loop through children terms Ids
        foreach ( $children_ids as $tem_id ) {
            $term_slugs[] = get_term_by( 'id', $tem_id, $taxonomy )->slug; // get the slug from each term Id
        }
    } 
    elseif( count( $term_ids ) > 1 ) {
        // Get the primary taxonomy/term as saved by Rank Math SEO
        $primary_tax_id = get_post_meta( $product_id, 'rank_math_primary_taxonomy', true );
        $term_slugs[]   = get_term_by( 'id', $primary_tax_id, $taxonomy )->slug; // get the slug from the term Id
    }
        
        
        if ( count( $term_ids ) > 0 ) {
            foreach ( $term_ids as $term_id ) {
                $term_slugs[] = get_term_by( 'id', $term_id, $taxonomy )->slug; 
    
                // Gets the IDs of child terms
                $children_ids = get_term_children( $term_id, $taxonomy );
    
                foreach ( $children_ids as $child_id ) {
                    $term_slugs[] = get_term_by( 'id', $child_id, $taxonomy )->slug; // Gets the slug of each child term
                }
            }
   
   
            $related_posts = wc_get_products( array(
                'status'        => 'publish',
                'tax_query'     => array(
                    array(
                        'taxonomy' => $taxonomy,
                        'field'    => 'slug',
                        'terms'    => $term_slugs,
                    ),
                ),
                'return'        => 'ids',
                'exclude'       => array( $product_id ),
                'visibility'    => 'catalog',
                'limit'         => -1,
            ) );
        }

    
    
        return $related_posts;
    }

P粉037215587P粉037215587260 hari yang lalu856

membalas semua(1)saya akan balas

  • P粉029327711

    P粉0293277112024-04-07 14:00:50

    Cuba yang berikut (disemak):

    // Utility function: Get related product Ids with a custom tax query
    function get_related_posts_custom_query( $term_slugs, $taxonomy, $product_id ) {
        return wc_get_products( array(
            'limit'         => -1,
            'status'        => 'publish',
            'exclude'       => array( $product_id ),
            'visibility'    => 'catalog',
            'tax_query'     => array(
                array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'slug',
                    'terms'    => $term_slugs,
                ),
            ),
            'return'        => 'ids',
        ) );
    }
    
    add_filter( 'woocommerce_related_products', 'related_products_from_rank_math_primary_category', 10, 3 );
    function related_products_from_rank_math_primary_category( $related_posts, $product_id, $args  ) {
        // Get product categories set for the product
        $category_ids = wp_get_post_terms($product_id, 'product_cat', array('fields' => 'ids') ); 
        $term_slugs   = array(); // Initializing   
    
        // 1). Only one product category => Fallback (Query products from "Sport" taxonomy)
        if( count($category_ids) == 1 ) {
            $taxonomy      = 'sport';
            // Get "Sport" the term set in the product
            $sport_ids     = wp_get_post_terms($product_id, $taxonomy, array('fields' => 'ids') ); 
            $term          = get_term_by( 'id', reset($sport_ids), $taxonomy );
            $term_slugs[]  = $term ->slug;
            // Get related products from the "Sport" term
            $related_posts = get_related_posts_custom_query( $term_slugs, $taxonomy, $product_id );
    
            // IF there is not enough related products: Add the CHILDREN terms
            if ( $related_posts < 6 ) {
                $children_ids = get_term_children( reset($sport_ids), $taxonomy );
                if( count($children_ids) > 0 ) {
                    foreach ( $children_ids as $tem_id ) {
                        $term_slugs[] = get_term_by( 'id', $tem_id, $taxonomy )->slug; // get the slug from each term Id
                    }
                    // Get related products from the "Sport" terms
                    $related_posts = get_related_posts_custom_query( $term_slugs, $taxonomy, $product_id );
                }
                // IF there is not enough related products: Add the PARENT term
                if ( $related_posts < 6 ) {
                    $parent       = get_term_by( 'id', $term->parent, $taxonomy );
                    $term_slugs[] = $parent ->slug;
                    // Get related products from the "Sport" terms
                    return get_related_posts_custom_query( $term_slugs, $taxonomy, $product_id );
                } else {
                    return $related_posts;
                }
            } else {
                return $related_posts;
            }
        } 
        // 2). More than one product categories => Rank Math SEO
        elseif( count( $category_ids ) > 1 ) {
            // Get the primary category/term as saved by Rank Math SEO
            $primary_cat_id = get_post_meta( $product_id, 'rank_math_primary_product_cat', true );
            $taxonomy       = 'product_cat';
            $term_slugs[]   = get_term_by( 'id', $primary_cat_id, $taxonomy )->slug; // get the slug from the term Id
            // Get related products from the category terms via Rank Math SEO
            return get_related_posts_custom_query( $term_slugs, $taxonomy, $product_id );
        }
        return $related_posts;
    }
    

    Sepatutnya berkesan.

    balas
    0
  • Batalbalas