Rumah > Soal Jawab > teks badan
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粉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.