Maison > Questions et réponses > le corps du texte
J'ai trouvé cette excellente solution pour afficher les produits associés en fonction des attributs du produit, mais nous souhaitons également faire de même pour les ventes incitatives.
Ce que j'ai essayé jusqu'à présent ne fonctionne pas car je pense que nous devons ajouter des informations supplémentaires car la fonction Related_products n'est pas la même chose que la vente incitative.
add_filter( 'woocommerce_upsell_products', 'upsell_products_by_attribute', 10, 3 ); function upsell_products_by_attribute( $upsells, $product_id, $args ) { $taxonomy = 'pa_attribute'; $term_slugs = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'slugs'] ); if ( empty($term_slugs) ) return $upsells; $posts_ids = get_posts( array( 'post_type' => 'product', 'ignore_sticky_posts' => 1, 'posts_per_page' => 6, 'post__not_in' => array( $product_id ), 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term_slugs, ) ), 'fields' => 'ids', 'orderby' => 'rand', ) ); return count($posts_ids) > 0 ? $posts_ids : $upsells; }
Je me demandais donc s'il était possible de faire la même chose avec la partie upsell.
P粉8068340592024-03-28 11:41:33
Vous pouvez supprimer les crochets d'action par défaut woocommerce_after_single_product_summary
并重新添加它,您可以自定义 upsells
pour les produits. Vérifiez le code ci-dessous. Le code ira dans le fichier function.php de votre thème actif.
Modifiez $taxonomy = 'pa_color';
votre taxonomie personnalisée.
function modify_woocommerce_upsell_display_based_on_attribute( $limit = '-1', $columns = 4, $orderby = 'rand', $order = 'desc' ){ remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 ); global $product; if ( ! $product ) { return; } // Handle the legacy filter which controlled posts per page etc. $args = apply_filters( 'woocommerce_upsell_display_args', array( 'posts_per_page' => $limit, 'orderby' => $orderby, 'order' => $order, 'columns' => $columns, ) ); wc_set_loop_prop( 'name', 'up-sells' ); wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_upsells_columns', isset( $args['columns'] ) ? $args['columns'] : $columns ) ); $orderby = apply_filters( 'woocommerce_upsells_orderby', isset( $args['orderby'] ) ? $args['orderby'] : $orderby ); $order = apply_filters( 'woocommerce_upsells_order', isset( $args['order'] ) ? $args['order'] : $order ); $limit = apply_filters( 'woocommerce_upsells_total', isset( $args['posts_per_page'] ) ? $args['posts_per_page'] : $limit ); // set your custom taxonomy here. $taxonomy = 'pa_color'; $term_slugs = wp_get_post_terms( $product->get_id(), $taxonomy, ['fields' => 'slugs'] ); $posts_ids = get_posts( array( 'post_type' => 'product', 'ignore_sticky_posts' => 1, 'posts_per_page' => 6, 'post__not_in' => array( $product->get_id() ), 'tax_query' => array( array( 'taxonomy' => $taxonomy, 'field' => 'slug', 'terms' => $term_slugs, ) ), 'fields' => 'ids', 'orderby' => 'rand', ) ); if( !empty( $posts_ids ) ){ // Get visible upsells then sort them at random, then limit result set. $upsells = wc_products_array_orderby( array_filter( array_map( 'wc_get_product', $posts_ids ), 'wc_products_array_filter_visible' ), $orderby, $order ); $upsells = $limit > 0 ? array_slice( $upsells, 0, $limit ) : $upsells; wc_get_template( 'single-product/up-sells.php', array( 'upsells' => $upsells, // Not used now, but used in the previous version of up-sells.php. 'posts_per_page' => $limit, 'orderby' => $orderby, 'columns' => $columns, ) ); } } add_action( 'woocommerce_after_single_product_summary', 'modify_woocommerce_upsell_display_based_on_attribute', 15 );