Wie kann ich Produkte für den Woocommerce anpassen? [geschlossen]


14

Ich habe die folgenden Codezeilen auf meiner Website, in denen die zugehörigen Produkte am unteren Rand meiner einzelnen Produktseite in WooCommerce angezeigt werden ...

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;
}

Wie würde ich die obigen Änderungen vornehmen, um stattdessen die zugehörigen Tags anzuzeigen, da 4 Produkte angezeigt werden, die unter demselben Namen kategorisiert wurden ?

Zum Beispiel habe ich eine Produktkategorie mit dem Namen "Automotive" und in dieser Kategorie befinden sich einige Tags - "Holden", "Ford", "Toyota", "Nissan" usw.

Ich möchte, dass im unteren Bereich 4 Produkte angezeigt werden, die sich auf das Tag des Produkts beziehen, das der Benutzer gerade anzeigt.

Antworten:


29

Erstens können Sie das Ziel, das Sie mit dem in Ihrer Frage gezeigten Code beschrieben haben, nicht sofort erreichen. Um zu verstehen, warum es mit diesem Code keinen direkten Ansatz gibt, müssen Sie sich ansehen, was Sie verwenden - woocommerce_related_products()- um das zu tun, was Sie bisher getan haben.

Zweitens müssen Sie verstehen, weil Sie sonst keine Frage stellen können, die unbedingt Ihr Ziel sein sollte, um sicherzustellen, dass Sie eine Antwort erhalten. Außerdem müssen Sie bedenken, dass Wordpress Development seinen Hauptbereich auf Wordpress Core-bezogene Fragen legt. Wenn Sie interessiert sind, wird dies auf Wordpress Development Meta diskutiert. Ein spezielles Thema ist " Unser Problem und die Zukunft der Plattform-Plugins bei WPSE" . Wenn Sie also Fragen zu Plugins, wie zum Beispiel Woocommerce, stellen, sollten Sie diese so aufteilen, dass sie sich auf die Kernfunktionen beziehen, wie dies möglich ist - siehe nächster Punkt -, da Sie nicht erwarten können, dass die Leute jedes Detail jedes Plugins kennen benutze.

Drittens , lassen Sie uns nun einen tieferen Einblick in die Geschehnisse bekommen. Wie Sie sagten, verwenden Sie woocommerce_related_products()jetzt. Wenn Sie sich die Quelle ansehen, sehen Sie, dass diese Funktion woocommerce_get_template()zum Abrufen der related.phpVorlage verwendet wird. woocommerce_get_template()wird erneut verwendet woocommerce_locate_template(), um die Vorlage zu lokalisieren. Letzteres erfolgt mithilfe der WordPress-Kernfunktion locate_template().
Jetzt gibt es eine Verbindung zurück zum Kern, was zu der Erkenntnis führt, dass die oben erwähnten und hoffentlich überprüften Woocommerce-Funktionen im Wesentlichen Wrapper sind, um die Kernfunktionalität zu erweitern. Eine andere Sache, die bei der Analyse der Funktionsabhängigkeiten deutlich wurde, ist, dass Sie, wie ich bereits sagte, einen anderen Ansatz benötigen, um Ihr Ziel zu erreichen, da dieser woocommerce_related_products()- jetzt unbestreitbar offensichtlich - nicht der richtige ist.
Wenn Sie mir mit meinen Erklärungen gefolgt sind und bis jetzt gründlich gelesen haben, haben Sie gemerkt, dass das related.phpenthält, wonach Sie suchen. Ich spreche insbesondere von der get_related()Funktion, die den woocommerce_product_related_postsHook enthält und die Kernfunktionen verwendet, wp_get_post_terms()und get_posts()- get_related()wird verwendet, um eine Reihe von IDs zu erhalten. Zusätzlich gibt das ist woocommerce_related_products_argsHaken, die verwendet werden können , die Argumente der verwandten Produkte Abfrage nach innen zu verändern related.php, WP_Querywird hierfür verwendet. Die Abfrage verwendet die resultierenden IDs aus dem get_related()Aufruf.
Ich denke, Sie haben jetzt alles zur Hand, um Ihr Problem zu lösen. Dies gibt einen fast vollständigen Überblick darüber, wie die verwandten Produkte angepasst werden können. Ich erwähnte nicht jede Funktionalität - Funktion und / oder Haken - aus dem überprüften Quellcode, aber definitiv alle wichtigen. Es sollte nun klarer werden, wie die Funktionalität der verwandten Produkte von woocommerce auf die Kernfunktionen von WordPress zurückgeführt werden kann.

Viertens komme ich zu dem Punkt , an dem Sie Ihre Anpassungen vornehmen und was Sie hätten verlangen sollen. Zum Beispiel so:

Woocommerce hat den woocommerce_product_related_postsHaken, den get_posts()Aufruf anzupassen , um verwandte Produkte zu bestimmen.

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
                        )
                )
        ) ) );

Wie kann ich dies anpassen, um mein Ziel zu erreichen? Welches verwandte Produkte anzeigen soll, die derselben Produktkategorie angehören - product_cat- und dieselben Tags haben - product_tag- wie das einzelne gezeigte Produkt.

Ohne eine abschließende Antwort zu geben - zumindest nicht, wenn Sie erwartet hatten, einen vollständigen und vorgefertigten Code zu erhalten -, sollten Sie wahrscheinlich zuerst den tax_queryParameter relationvon ORauf ändern AND.





Anmerkungen:

  • Ich machte dies zu einer längeren beschreibenden Antwort im Hinblick auf die oben verlinkte laufende Diskussion
  • Ich hoffe es macht Ihnen nichts aus, dass es nicht nur eine Antwort auf Ihre Frage ist, sondern zusätzlich einen allgemeinen pädagogischen Zweck verfolgt
  • Dies ist ungetestet , da kein eigentlicher fertiger Code vorhanden ist
  • last but not least ist absehbar, dass mit der Veröffentlichung von woocoomerce 2.1 einige bedeutende Codeänderungen implementiert werden, bedenkt man jedoch, dass der obige Code ab 2.0.19 derzeit gültig ist



Bearbeiten:

Sie sollten Kernklassen wirklich nicht direkt bearbeiten (Plugin). Dies ist problematisch, da Sie Ihre Änderungen bei Aktualisierungen erneut beibehalten müssen, da die Kerndateien aktualisiert und überschrieben werden, wenn Sie eine Aktualisierung durchführen. Vor allem, wenn es wie in diesem Fall leicht zu vermeiden ist, macht der folgende Code, was Sie beabsichtigt haben, und implementiert diese Änderung über Ihren 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;
    }



Für WooCommerce ab Version 2.1.0 funktioniert der obige Hook nicht mehr, da er nicht mehr existiert. Die Antwort ist also erst ab Version 2.0.20 verwendbar. @NathanPowell entdeckte jedoch eine nette Antwort auf StackOverflow bezüglich der ab v2.1.0 verfügbaren und für die Anpassung der verwandten Produkte verwendbaren Hakensätze .


Vielen Dank an @ialocin für die schnelle und detaillierte Antwort. Als vorübergehende Maßnahme ich das einfach geändert ORzu ANDmeiner wp-content/plugins/woocommerce/classes/abstract/abstract-wc-product.phpDatei und wird bald diese innerhalb der getan werden ändern functions.phpDatei. Danke nochmal.
user1752759

@ user1752759 Siehe meine Bearbeitung dazu überfunctions.php
Nicolai

Perfekte Antwort! Es sollte in jedem Handbuch verwendet werden, um zu erfahren, wie Sie Plugins verstehen und wie Sie sie an Ihre Bedürfnisse anpassen können. Ich
bin

@ThdK Danke, ich weiß nicht, ob es so gut ist, aber nachdem ich es das erste Mal seit dem Schreiben gelesen habe, bin ich immer noch zufrieden mit der Antwort, außerdem schätze ich das Kompliment, es ist immer schön zu hören :) Habe hast du das mit wc 2.1.x versucht?
Nicolai

Hallo da, @ialocin. In der bearbeiteten Version im unteren Bereich fehlen einige schließende Klammern und sie funktioniert in Version 2.1.8 leider nicht mehr als Lösung. Wenn es Ihnen nicht zu viel Mühe macht, können Sie dies bitte für mich aktualisieren?
user1752759

2

Machen wir uns nichts vor, Jungs. Die akzeptierte Antwort brachte den Benutzer nur zu seinem Ziel.

Das allererste Problem liegt hier:

<?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);

Eine Aktion wird entfernt und dann in die EXAKTE Position gebracht, aus der sie entfernt wurde. Das Ziel ist völlig unklar.

Ich bin bei einer Suche nach verwandten Produkten darauf gestoßen, weil ich nicht verstanden habe, dass TAGS und KATEGORIEN die woocommerce_output_related_productsFunktion in diesem Plugin steuern .

Die beste Antwort auf DIESE Frage ist der folgende Link und hat alles mit dem woocommerce_output_related_products_args()Filter zu tun : /programming/23554993/output-posts-relating-the-tags


Das ist eigentlich ganz lustig. Warum könnten Sie fragen, denn wenn Sie meine Antwort sorgfältig gelesen haben, dann hätten Sie gesehen, dass nur ein Filter verwendet wird. Um genau zu sein, der einzige Filter, der zu diesem Zeitpunkt verfügbar war, aber Sie hätten das gewusst, wenn Sie tatsächlich das gelesen hätten, was ich geschrieben habe, und sich die Zeit genommen hätten, die Quelldateien der verschiedenen Versionen anzusehen. Ich sage nur. Abgesehen davon erklärt die Antwort, die Sie verlinkt haben, die neuen Hooks, die seit v2.1 verfügbar sind, sehr gut.
Nicolai

Tut mir leid, es war eine späte Nacht. Ich hatte gehofft, etwas über den offensichtlichen Fehler im Code durch das OP zu erklären.
Nathan Powell

Keine Sorge, aber ich hatte das Gefühl, etwas sagen zu müssen.
Nicolai

Ihr Referenzlink hat für mich funktioniert Nathan, danke, ich habe 2 Stunden lang versucht, es für mich selbst zu tun. Jetzt weiß ich, Filter richtig anzuwenden :)
Marcovega
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.