Maison > Questions et réponses > le corps du texte
J'ai une boutique woocommerce avec une catégorie personnalisée "Sports". La classification comporte trois niveaux - parent, enfant, enfant - par exemple : Sports d'intérieur > Sports d'arène > Basketball. Si l'utilisateur consulte l'élément Basketball, je souhaite que les produits associés affichent d'abord d'autres éléments Basketball, puis reviennent à l'élément Arena Sport s'il n'y a pas suffisamment d'éléments Basketball. Ainsi, le niveau le plus bas est vérifié en premier : sous-enfant, puis enfant, puis parent.
De plus, j'utilise RankMath et je peux définir le terme de classification comme terme "primaire". Ainsi, dans l’exemple ci-dessus, le terme principal est basket-ball. Les termes principaux sont presque toujours des sous-sous-termes, mais peuvent également être des sous-termes.
J'ai combiné les réponses des deux autres questions et le code fonctionne en sélectionnant les produits pertinents de la catégorie sport. Mais il ne s’intéresse qu’aux sous-niveaux et non aux sous-sous-niveaux. Ainsi, dans l’exemple ci-dessus, il sélectionne les éléments dans Arena Sports sans donner la priorité au basket-ball.
Quels changements dois-je apporter pour m'assurer que les produits associés voient le terme de taxonomie « principal », puis recherchent d'abord les produits avec ce terme, puis (si nécessaire) le niveau suivant dans la hiérarchie des termes ?
Merci pour toute aide ou conseil que vous pouvez fournir.
J'ai fait référence à ces deux articles lors de la rédaction du code :
Produits liés à WooCommerce par catégorie Enfants comme sauvegarde pour classer la catégorie principale des mathématiques
Utilisez des taxonomies personnalisées pour sélectionner des produits pertinents dans Woocommerce
Voici le code que j'utilise actuellement :
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
Essayez ce qui suit (examiné) :
// 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; }
Ça devrait fonctionner.