Wie dem ein oder anderen bekannte sein dürfte, baue ich nebenher auch ab und an ein paar Nischenseiten für “den Taler nebenher”. Warum man damit Geld verdienen kann, schrieb ich hier, und was eine Nischenseite überhaupt ist und wie sie funktioniert, schrieb ich bereits hier auf. Heute soll es nun um eine Anpassung am Affiliatheme von Affiliatetheme.io gehen, welches von vielen Nischenseitenbetreibern zur Umsetzung ihrer Webseiten genutzt wird.
Innerhalb des Themes gibt es zwei Möglichkeiten ein Produkt zu bewerten. Zum einen die Bewertungen unterhalb des “Weitere Informationen”-Tabs und zum anderen die Bewertungen unterhalb des “Bewertungen”-Reiters. Ich selbst nutze auf meinem aktuellen Projekt (bei dem es um einen Waschtrockner-Vergleich geht) die Bewertungen aus dem “Weitere Informationen”-Tab für Nutzer-Bewertungen. Also für Feedback von Käufern. Die Bewertungen aus dem “Bewertungen”-Tab nutze ich für Reviews. Also zur eigentlichen Bewertung des Produkts.
Die bewerteten Produkte lassen sich nun per “[produkte]”-Shortcode in verschiedenen Darstellungen ausgeben. Ich selbst nutze bevorzugt die Darstellung als Vergleichstabelle. Hierbei kann im Shortcode per orderby-Parameter angeben, nach welchem Kriterium die Produkte sortiert werden sollen. Leider gibt es dort nur einen Wert namens “rating”, der nach Bewertungen sortiert. Dieser Wert zieht jedoch die Bewertungen vom Typ 1 (siehe Screenshot, oben rechts). Das macht für meinen Fall leider wenig Sinn. Wenn ich Produkte bewerte, möchte ich diese auch anhand der Bewertung sortiert ausgeben können.
Affiliatetheme.io – Sortierung nach Review/Bewertung
Um die Produkte nun nach dem Review-Ergebnis sortiert ausgeben zu können, ist eine kleine Anpassung am Theme notwending. Zwar stellt das Theme ein paar Filter wie z.B. “at_set_product_shortcode_query” und “at_product_shortcode_loop_before”, die jedoch nicht ausreichend sind, da das Ergebnis nach Ausführung der Query bearbeitet werden muss und diese Filter vor der Ausführung greifen. Dementsprechend müssen wir die Änderungen direkt in einer der Core-Dateien vornehmen.
Um eine Sortierbarkeit nach “Review-Ergebnis” zu ermöglichen, müssen wir die Datei shortcodes.php anpassen. Die Datei befindet sich in folgendem Verzeichnis eurer WordPress-Installation: /wp-content/themes/affiliatetheme/library/product
Innerhalb dieser Datei legen wir zuerst eine neue Funktion namens “clean_products” an:
/* * Produkte nach Review sortieren - Raffael Herrmann */ function clean_products($orderby, $order, $limit, $products){ if ($orderby == "review"){ foreach($products as $product) { $product_review_ratings = get_field('product_review_ratings', $product->ID); if($product_review_ratings) { $summary = ''; foreach($product_review_ratings as $rating) { $summary = $summary + $rating['value']; } $summary = $summary / count($product_review_ratings); $product_items[$product->ID] = number_format($summary, 2, '.', ','); } } if($product_items) { arsort($product_items); $product_items = array_slice($product_items, 0, $limit, true); } $products_temp = array(); foreach (array_keys($product_items) as $ordered_id){ foreach ($products as $product){ if ($product->ID == $ordered_id){ $products_temp[] = $product; } } } $products = $products_temp; } return $products; }
Diese Funktion nimmt eine Liste an Produkten (alle gepflegten Produkte) an, berechnet für alle Produkte den Review-Score und sortiert die Produkte anschließend anhand des Scores. Danach nimmt es die Anzahl der gewünschten Produkte aus der sortierten Liste und gibt diese zurück, damit sie mittels der Standard-Theme-Funktionen dargestellt werden können.
Damit die neue Sortier-Funktion funktioniert, müssen wir diese noch aufrufen. Hierzu müssten wir zwei Stellen innerhalb der shortcodes.php-Datei anpassen. Die erste Änderung findet unterhalb der $args-Array Definition (ca. Zeile 72) statt. Hier fügen wir eine Abfrage ein, die überprüft, ob die Sortierung (orderby-Paramter) nach Review-Score erfolgen soll und passen in diesem Falle die Query an:
/* * args */ $args = array( 'post_type' => 'product', 'posts_per_page' => $limit, 'orderby' => $orderby, 'order' => $order ); //Ab hier fügen wir unseren neuen Code ein //Sortieren nach Review-Score if ($orderby == "review"){ unset($args['orderby']); unset($args['order']); $args['posts_per_page'] = -1; $args['meta_key'] = 'product_review_ratings'; }
Nun, da die Query angepasst ist, müssen wir nur noch unsere neue clean_products-Funktion aufrufen. Die Aufrufe geschehen jeweils innerhalb der “Layout”-if-Blöcke für Tabellen direkt vor dem “ob_start()”-Befehl. Nachfolgend zeige ich das einmal für die Tabelle mit X-Ausrichtung:
if($layout == "table-x") { /* * Layout: table-x */ global $products; $products = get_posts($args); if($products) { //Direkt vor ob_start() rufen wir unsere clean_products-Funktion auf! $products = clean_products($orderby, $order, $limit, $products); ob_start(); get_template_part('parts/product/loop', 'table-x'); $output .= ob_get_contents(); ob_end_clean(); } } else if($layout == "table-y") { [...]
Das war es auch schon. Nun kann im produkte-Shortcode im orderby-Parameter der Wert “review” angegeben werden, um die Produkte-Tabelle anhand der Bewertungs-Punkte zu sortieren. Ein Beispiel-Shortcode könnte wie folgt aussehen:
[produkte limit="5" orderby="review" order="desc" layout="table-x" review="true" detail_button="true" buy_button="true" details_fields="true" details_tax="true" reduced="false" align="left" slider="false"]
Der Parameter “limit” funktioniert weiterhin, was für den Parameter “order” leider nicht gilt. Wer möchte, kann jedoch gerne den order-Parameter in der “clean_products”-Funktion noch berücksichtigen. So viel Aufwand ist es ja nicht mehr…
Fazit
Auch wenn es erstmal viel aussieht – so groß ist der Eingriff nicht, um die Sortierbarkeit nach Review-Score herzustellen. Schade ist lediglich, dass das ganze nur per Eingriff in die Core-Datei geht. Zwar gibt es den “toprated”-Shortcode, der Produkte genau in dieser Sortierung wiedergibt, jedoch ist dieser in seiner Darstellung längst nicht so flexibel wie der “produkte”-Shortcode.
Vielleicht übernehmen die beiden Entwickler des Affiliatethemes, in einer zukünftigen Version ja meine Änderungen mit in den Core. Dann wäre das ganze auch bei Updates sicher. Den Code stelle ich hiermit auf jedenfall kostenfrei zur Verfügung. (Über eine Gratis-Lizenz für das Theme würde ich mich im Gegenzug natürlich dennoch freuen. ;-) )
If you’re still on the fence: grab your favorite earphones, head down to a Best Buy and ask to plug them into a Zune then an iPod and see which one sounds better to you, and which interface makes you smile more.
Super vielen Dank! Genau was ich gesucht habe.
Hallo zusammen,
mir geht es wie Raffael. Habe auch noch die alte Version des Affiliatethemes laufen. Lohnt sich das Update denn? Bzw. kann hier jemand kurz und bündig über interessante neue Features berichten?
Danke und Gruß
Mike
Wie ist es, wenn man nach anderen Faktoren sortieren möchte? Ist der Code auf andere Faktoren adaptierbar? Bsp. wenn ich nach Aktualität sortieren möchte.. Danke!
Hallo Raffi,
die Gesamtbewertung wird doch seit der Version 01.03.2017 – Version 1.5.0 in der datenbank abgelegt. Also kann das summieren der einzelnen Unterbewertungen raus.
Gruß Julian
bzw. kann man mittlerweile nach der Bewertung von Haus aus sortieren mit orderby “rating”
OrderBy “rating” sortiert aber nach der 5 Sterne Bewertung und nicht nach den Testergebnissen oder hat sich das in den neueren Releases auch geändert?
Hallo Julian, danke für den Hinweis. Da meine Update-Lizenz leider ausgelaufen ist, hänge ich noch vor dem 1.5er Release. Da ich sonst zufrieden bin und alles andere noch funktioniert, war die hier aufgezeigte Lösung für mich definitiv günstiger. ;-)
Ja, vor der neuen Version ist deine Lösung perfekt.
Das es nicht ging, hat viele Nutzer gestört denke ich.