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; }
Essayez ce qui suit (examiné) :
Ça devrait fonctionner.