Comment personnaliser les produits liés au woocommerce? [fermé]

14

J'ai les lignes de code suivantes sur mon site Web qui afficheront les produits connexes au bas de ma page de produit unique dans WooCommerce ...

functions.php:

// display upsells and related products within dedicated div with different column and number of products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

function woocommerce_output_related_products() {
    $output = null;

    ob_start();
    woocommerce_related_products(4,4); 
    $content = ob_get_clean();
    if($content) { $output .= $content; }

    echo '<div class="clear"></div>' . $output;
}

Comme il affiche 4 produits classés sous le même nom, comment modifierais-je les éléments ci-dessus pour afficher les balises associées à la place?

Par exemple, j'ai une catégorie de produits appelée «Automobile» et dans cette catégorie, il y a quelques balises - «Holden», «Ford», «Toyota», «Nissan» etc.

Je voudrais qu'il affiche 4 produits en bas, liés à la balise du produit que l'utilisateur consulte actuellement.

user1752759
la source

Réponses:

29

Premièrement , vous ne pouvez pas atteindre immédiatement l'objectif que vous avez décrit avec le code que vous montrez dans votre question. Pour comprendre pourquoi il n'y a pas d'approche directe avec ce code, vous devez jeter un œil à ce que vous utilisez - woocommerce_related_products()- pour faire ce que vous avez fait jusqu'à présent.

Deuxièmement , vous devez comprendre, car sinon vous ne pouvez pas poser une question précise, qui devrait absolument être votre objectif, pour vous assurer d'obtenir une réponse. En plus de cela, vous devez garder à l'esprit que Wordpress Development a sa portée principale définie sur les questions liées à Wordpress Core - si vous êtes intéressé, cela est en cours de discussion sur Wordpress Development Meta , un sujet spécifique étant Nos courtiser et l'avenir des plugins de plate-forme chez WPSE . Donc, si vous posez des questions sur les plugins, comme woocommerce, vous devez le décomposer pour le rendre aussi lié que possible aux fonctions de base - voir le point suivant - car vous ne pouvez pas vous attendre à ce que les gens connaissent tous les détails de chaque plugin que vous utilise.

Troisièmement , permet maintenant de mieux comprendre ce qui se passe. Comme vous l'avez dit, vous utilisez woocommerce_related_products()maintenant. Si vous regardez la source, vous voyez que cette fonction utilise woocommerce_get_template()pour obtenir le related.phpmodèle. woocommerce_get_template()utilise woocommerce_locate_template()à nouveau pour localiser le modèle, ce dernier le fait en utilisant la fonction principale de wordpress locate_template().
Maintenant, il y a une connexion au noyau, conduisant à la réalisation que les fonctions de woocommerce mentionnées ci-dessus - et, espérons-le, inspectées - sont essentiellement des enveloppes pour étendre les fonctionnalités du noyau. Une autre chose qui est devenue claire en analysant les dépendances des fonctionnalités est, ce que j'ai dit auparavant, que vous avez besoin d'une approche différente pour atteindre votre objectif, car woocommerce_related_products()- maintenant indéniablement évident - n'est pas la bonne.
Si vous m'avez suivi avec mes explications et que vous avez lu attentivement jusqu'à présent, vous vous êtes rendu compte que le related.phpcontient ce que vous recherchez. Je parle en particulier de la get_related()fonction, qui comprend le woocommerce_product_related_postscrochet et utilise les fonctions de base wp_get_post_terms()et get_posts()- get_related()est utilisée pour obtenir un ensemble d'identifiants. De plus, le woocommerce_related_products_argshook, qui peut être utilisé pour modifier les arguments de la requête de produits connexes à l'intérieur related.php, WP_Queryest utilisé pour cela. La requête utilise les identifiants résultants de l' get_related()appel.
Je pense que vous avez tout en main pour résoudre votre problème. En fait, bien plus que cela, cela donne un aperçu presque complet sur la façon de personnaliser les produits connexes. Je n'ai pas mentionné toutes les fonctionnalités - fonctions et / ou hook-out du code source inspectées, mais certainement toutes les plus importantes. Il devrait maintenant être plus clair comment la fonctionnalité des produits connexes de woocommerce peut être retracée aux fonctions principales de wordpress.

Quatrièmement , j'arrive à, où vous devez appliquer vos personnalisations et ce que vous auriez dû demander. Par exemple, comme ceci:

Woocommerce a le woocommerce_product_related_postscrochet pour personnaliser l' get_posts()appel afin de déterminer les produits associés.

Code:

        // Get the posts
        $related_posts = get_posts( apply_filters('woocommerce_product_related_posts', array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                        'relation' => 'OR',
                        array(
                                'taxonomy' => 'product_cat',
                                'field' => 'id',
                                'terms' => $cats_array
                        ),
                        array(
                                'taxonomy' => 'product_tag',
                                'field' => 'id',
                                'terms' => $tags_array
                        )
                )
        ) ) );

Comment puis-je personnaliser cela pour atteindre mon objectif? C'est-à-dire pour montrer les produits connexes qui sont dans la même catégorie de produits - product_cat- et ont la même étiquette (s) - product_tag- que le produit unique montré.

Sans vous donner de conclusion - du moins pas si vous vous attendiez à obtenir un code complet et prêt à l'emploi -, la première chose que vous devriez probablement faire est de changer le tax_queryparamètre relationde ORen AND.





Remarques:

  • Je l'ai fait une réponse descriptive plus longue avec la discussion en cours liée ci-dessus à l'esprit
  • J'espère que cela ne vous dérange pas, que ce n'est pas seulement une réponse à votre question, mais cherche également à remplir un objectif éducatif général
  • ce n'est pas testé , car il n'y a pas de code prêt à l'emploi
  • Enfin et surtout, il est prévisible qu'avec la sortie de woocoomerce 2.1, d'importants changements de code seront mis en œuvre, à cela, mais pour l'instant à partir de 2.0.19, le code ci-dessus est valide



Éditer:

Vous ne devriez vraiment pas éditer (plugin) les classes de base directement. C'est problématique, car vous devez à nouveau conserver vos modifications sur les mises à jour, car les fichiers principaux sont mis à jour et remplacés si vous en effectuez une. Surtout s'il est facilement évitable, comme dans ce cas, le code ci-dessous fait de toute façon ce que vous aviez l'intention de faire, à savoir mettre en œuvre ce changement via votre functions.php.

Code:

    add_filter( 'woocommerce_product_related_posts', 
                'wpse_123436_change_wc_related_products_relation_to_and' );
    function wpse_123436_change_wc_related_products_relation_to_and() {
            $get_related_products_args = array(
                'orderby' => 'rand',
                'posts_per_page' => $limit,
                'post_type' => 'product',
                'fields' => 'ids',
                'meta_query' => $meta_query,
                'tax_query' => array(
                    'relation' => 'AND',
                    array(
                        'taxonomy' => 'product_cat',
                        'field' => 'id',
                        'terms' => $cats_array
                    ),
                    array(
                        'taxonomy' => 'product_tag',
                        'field' => 'id',
                        'terms' => $tags_array
                    )
                )
            );
            return $get_related_products_args;
    }



Pour WooCommerce version 2.1.0 et supérieure, le crochet ci-dessus ne fonctionnera pas, car il n'existe plus, donc la réponse est utilisable jusqu'à la version 2.0.20. Mais @NathanPowell a découvert une bonne réponse sur StackOverflow concernant le à partir de la v2.1.0 disponible et pour la personnalisation du jeu de crochets utilisable des produits associés .

Nicolai
la source
Merci beaucoup @ialocin pour la réponse rapide et détaillée. À titre temporaire, j'ai simplement changé le ORen ANDdans mon wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpfichier et je vais bientôt le faire à partir du functions.phpfichier. Merci encore.
user1752759
@ user1752759 Voir ma modification pour le faire viafunctions.php
Nicolai
Réponse parfaite! Il devrait être utilisé dans tout guide sur la façon de comprendre les plugins et de les étendre à vos besoins. Je ne sais pas si ces livres existent bien .. Mais
quand
@ThdK Merci, je ne sais pas si c'est si bon, mais après l'avoir lu la première fois depuis que je l'ai écrit, je suis toujours satisfait de la réponse, en plus que j'apprécie sûrement le compliment, c'est toujours agréable à entendre :) vous avez essayé avec WC 2.1.x?
Nicolai
Salut à @ialocin. La version éditée en bas manque quelques crochets de fermeture, et malheureusement, ne fonctionne plus comme solution dans la version 2.1.8. Si ce n'est pas trop compliqué, pourriez-vous mettre à jour cela pour moi?
user1752759
2

Ne nous leurrons pas ici les gars. La réponse acceptée n'a fait qu'atteindre l'utilisateur.

Le tout premier problème réside ici:

<?php
// display upsells and related products within dedicated div with different column and number of    products
remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products',20);
remove_action( 'woocommerce_after_single_product', 'woocommerce_output_related_products',10);
add_action( 'woocommerce_after_single_product_summary', 'woocommerce_output_related_products', 20);

Une action est supprimée, puis placée dans la position EXACTE dont elle a été supprimée. L'objectif n'est pas clair.

Je suis tombé sur cela avec une recherche sur les produits connexes parce que je ne comprenais pas que les TAGS et les CATÉGORIES sont ce qui motive la woocommerce_output_related_productsfonction dans ce plugin.

La meilleure réponse à CETTE question est le lien suivant, et a tout à voir avec le woocommerce_output_related_products_args()filtre: /programming/23554993/output-posts-relating-to-the-tags

Nathan Powell
la source
C'est en fait assez drôle. Pourquoi vous pourriez demander, parce que si vous avez lu attentivement ma réponse, alors vous l'auriez vu, il n'utilise qu'un seul filtre. Pour être exact, le seul filtre disponible à ce moment-là, mais vous l'auriez su, si vous aviez réellement lu ce que j'avais écrit et auriez pris le temps de regarder les fichiers sources des différentes versions. Je dis juste. En dehors de cela, la réponse que vous avez liée explique très bien les nouveaux crochets disponibles sine v2.1.
Nicolai
Désolé pour ça, c'était une nuit tardive. J'espérais expliquer un peu la faute évidente dans le code de l'OP.
Nathan Powell
Pas de soucis, mais je sentais que je devais dire quelque chose.
Nicolai
Votre lien de référence a fonctionné pour moi Nathan, merci, j'essaie de le faire moi-même depuis 2 heures maintenant. Maintenant, je sais appliquer correctement les filtres :)
marcovega