recherche

Maison  >  Questions et réponses  >  le corps du texte

Sélectionnez les produits liés au woocommerce à l'aide d'une taxonomie personnalisée avec une hiérarchie à 3 niveaux

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粉037215587P粉037215587241 Il y a quelques jours818

répondre à tous(1)je répondrai

  • P粉029327711

    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.

    répondre
    0
  • Annulerrépondre