• Gelöst ONEM

    (@grafikhouse)


    Vielleicht kann mir da jemand helfen.

    Wie wird der Code korrekt aufgebaut?

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

    function display_attribute_on_shop_page() {

        global $product;

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'versandkosten';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Versandkosten: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

     }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'abholung';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Abholung: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'bett-matratzengroesse';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Bett / Matratzen Grösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'bh-groesse';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>BH Grösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'kleidergroesse-damen';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Kleidergrösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'kleidergroesse-herren';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Kleidergrösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'kleidergroesse-kinder-baby

    ';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Kleidergrösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'kleidergroesse-teenager';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Kleidergrösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'pc-monitor';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Grösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'schuhgroesse';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Grösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

        // Überprüfen, ob das Produkt einfach ist

        if ( $product->is_type( 'simple' ) ) {

            $attribute_name = 'tv-groesse';

            $attribute_values = $product->get_attribute( $attribute_name );

            // Wenn das Attribut einen Wert hat, wird es ausgegeben

            if ( ! empty( $attribute_values ) ) {

                echo '<div class="shop-product-attribute">';

                echo '<strong>Grösse: </strong>' . $attribute_values;

                echo '</div>';

            }

        }

    }
Ansicht von 15 Antworten – 1 bis 15 (von insgesamt 16)
  • Moderator threadi

    (@threadi)

    Wenn ich das richtig sehe, willst du zu einfachen Produkten zusätzliche Angaben ausgeben, die als Eigenschaften an den Produkten gespeichert sind? Also „versandkosten“, „abholung“, „bett-matratzengroesse“ etc.

    Syntaktisch ist der Code so nicht richtig. Du versuchst für jede Eigenschaft den gleichen WooCommerce-Hook mehrfach zu verwenden – hast aber die dazugehörige Funktion nur 1 Mal definiert. Dabei müsstest du, wenn du so vorgehst, eine Funktion für jede Eigenschaft definieren. Hier mal als Beispiel für die ersten 2 Eigenschaften:

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page_versandkosten', 5 );

    function display_attribute_on_shop_page_versandkosten() {

    global $product;

    // Überprüfen, ob das Produkt einfach ist

    if ( $product->is_type( 'simple' ) ) {

    $attribute_name = 'versandkosten';

    $attribute_values = $product->get_attribute( $attribute_name );

    // Wenn das Attribut einen Wert hat, wird es ausgegeben

    if ( ! empty( $attribute_values ) ) {

    echo '<div class="shop-product-attribute">';

    echo '<strong>Versandkosten: </strong>' . $attribute_values;

    echo '</div>';

    }

    }

    }

    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page_abholung', 5 );

    function display_attribute_on_shop_page_abholung() {
    global $product;

    // Überprüfen, ob das Produkt einfach ist
    if ( $product->is_type( 'simple' ) ) {

    $attribute_name = 'abholung';

    $attribute_values = $product->get_attribute( $attribute_name );

    // Wenn das Attribut einen Wert hat, wird es ausgegeben

    if ( ! empty( $attribute_values ) ) {

    echo '<div class="shop-product-attribute">';

    echo '<strong>Abholung: </strong>' . $attribute_values;

    echo '</div>';

    }

    }
    }

    Das müsstest du genau so für alle anderen Eigenschaften adaptieren.

    Ein modernerer Weg wäre, nur eine einzelne Funktion zu verwenden und in dieser in einer Schleife durch alle Eigenschaften zu gehen. Das habe ich eben mal schnell wie folgt umgesetzt (Komplettlösung, aber ungetestet):

    /**
    * Zeige pro einfachem Produkt zusätzliche Eigenschaften an.
    *
    * @return void
    */
    function display_attribute_on_shop_page(): void {
    global $product;

    // Überprüfen, ob das Produkt einfach ist.
    if ( $product->is_type( 'simple' ) ) {

    foreach( display_attribute_on_shop_page_eigenschaften() as $attribute_name => $titel ) {
    // Hole den Wert des Attributs.
    $attribute_values = $product->get_attribute( $attribute_name );

    // Wenn das Attribut einen Wert hat, wird es ausgegeben.
    if ( ! empty( $attribute_values ) ) {
    echo '<div class="shop-product-attribute">';
    echo '<strong>' . esc_html( $titel ) . ': </strong>' . esc_html( $attribute_values );
    echo '</div>';
    }
    }
    }
    }
    add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );

    /**
    * Rückgabe der Liste der anzuzeigenden Eigenschaften eines Produktes.
    *
    * Aufbau:
    * Name => Titel
    *
    * @return array<string,string>
    */
    function display_attribute_on_shop_page_eigenschaften(): array {
    return array(
    'versandkosten' => 'Versandkosten',
    'abholung' => 'Abholung',
    'bett-matratzengroesse' => 'Bett-Matratzengroesse',
    'bh-groesse' => 'BH Grösse',
    'kleidergroesse-damen' => 'Kleidergrösse',
    'kleidergroesse-herren' => 'Kleidergrösse',
    'kleidergroesse-kinder-baby' => 'Kleidergrösse',
    'kleidergroesse-teenager' => 'Kleidergrosse',
    'pc-monitor' => 'Grösse',
    'schuhgroesse' => 'Grösse',
    'tv-groesse' => 'Grösse'
    );
    }

    Wenn du eine weitere Eigenschaft ergänzen willst, musst du diese nur in display_attribute_on_shop_page_eigenschaften() zur Liste ergänzen.

    Hinweis: Dein Code entspricht nicht den WordPress Coding Standards. Insbesondere sicherst du Ausgaben nicht mit Escaping ab. Details dazu hier im englischen Handbuch: https://developer.wordpress.org/apis/security/escaping/ – auch wenn du das nur für dich selbst schreibst, sich an gewisse Regeln hierbei zu halten, sichert dein Projekt gegen potentielle Fehler oder gar Angriffe ab.

    Und ich dachte immer, in diesem Forum geht es um die Anwendung von WordPress. Programmierungen sollten doch hier nicht besprochen werden, oder sehe ich das falsch?

    @bscu Wenn du Fragen zur Moderation in den Foren von wordpress.org hast, wende dich wie geschrieben an forum-moderation@wordpress.org oder den genannten Slack Channel.

    Moderator La Geek

    (@la-geek)

    Hallo @bscu

    Und ich dachte immer, in diesem Forum geht es um die Anwendung von WordPress. Programmierungen sollten doch hier nicht besprochen werden, oder sehe ich das falsch?

    Ich kann deine Verwunderung darüber nachvollziehen. Das haben wir lange so gehandhabt (nur Andwendungsfragen), zu den Zeiten als Bego, Hans-Gerd und ich hier moderierten. Seit @threadi Moderator ist und Bego nicht mehr, wurden die bisherigen Richtlinien aufgehoben. Threadi hatte sich dafür ausgesprochen, da es in den int. Guidelines keine entsprechenden Klauseln gibt.

    Kurzum: Diese Fragen sind seitdem erlaubt: CSS-Code, Programmiersprachen.

    Thread-Starter ONEM

    (@grafikhouse)

    @threadi

    Das hat soweit gut geklappt es wird auf der Einzelprodukteseite angezeigt nun habe ich nur noch das Problem auf der Archivseite dort wird es nicht angezeigt hast du da vielleicht auch eine Lösung?

    Thread-Starter ONEM

    (@grafikhouse)

    @threadi

    Ich habe hier noch einen Code für die Archivseite und müsste diesen genau so haben wie wie beim anderen den du mir geholfen hast.

    Kannst du mir da weiter helfen?

    add_action( ‚woocommerce_after_shop_loop_item_title‘, ‚zeige_attribut_auf_archivseite‘, 5 );
    function zeige_attribut_auf_archivseite() {
    global $product;

    // Ersetzen Sie ‚pa_farbe‘ mit dem Slug Ihres Attributes
    $attribut_slug = ‚pa_farbe‘;

    $attribut_wert = $product->get_attribute( $attribut_slug );

    if ( $attribut_wert ) {
    $label = wc_attribute_label( $attribut_slug );
    echo ‚<div class=“produkt-attribut-archiv“>‘ . esc_html( $label ) . ‚: ‚ . esc_html( $attribut_wert ) . ‚</div>‘;
    }
    }

    Korrekte Formatierung des Codes (mit Code-Block) von Moderator:

    add_action( 'woocommerce_after_shop_loop_item_title', 'zeige_attribut_auf_archivseite', 5 );

    function zeige_attribut_auf_archivseite() {
    global $product;

    // Ersetzen Sie 'pa_farbe' mit dem Slug Ihres Attributes
    $attribut_slug = 'pa_farbe';
    $attribut_wert = $product->get_attribute( $attribut_slug );

    if ( $attribut_wert ) {
    $label = wc_attribute_label( $attribut_slug );
    echo '<div class="produkt-attribut-archiv">' . esc_html( $label ) . ': ' . esc_html( $attribut_wert ) . '</div>';
    }
    }
    • Diese Antwort wurde vor 1 Monat, 1 Woche von La Geek geändert. Grund: Code-Block benutzen (unter + Icon, damit der Code korrekt formatiert ist, siehe Hochkommata
    • Diese Antwort wurde vor 1 Monat, 1 Woche von La Geek geändert.
    • Diese Antwort wurde vor 1 Monat, 1 Woche von La Geek geändert.
    • Diese Antwort wurde vor 1 Monat, 1 Woche von La Geek geändert.
    Moderator La Geek

    (@la-geek)

    Hier gibt es kaum User, die mit WooCommerce arbeiten. Threadi ist so ziemlich der Einzige, aber der scheint momentan in Urlaub zu sein.

    Wahrscheinlich wird deine Frage dort eher beantwortet:

    https://wpde.org/board/61-online-business-e-commerce/

    Thread-Starter ONEM

    (@grafikhouse)

    @threadi

    Erstmal Danke für deine Antwort

    wie mache ich das in in einer Schleifen abfrage

    add_action( 'woocommerce_after_shop_loop_item_title', 'zeige_attribut_auf_archivseite', 5 );function zeige_attribut_auf_archivseite() {    global $product;    // Ersetzen Sie 'pa_farbe' mit dem Slug Ihres Attributes    $attribut_slug = 'pa_farbe';    $attribut_wert = $product->get_attribute( $attribut_slug );    if ( $attribut_wert ) {        $label = wc_attribute_label( $attribut_slug );        echo '<div class="produkt-attribut-archiv">' . esc_html( $label ) . ': ' . esc_html( $attribut_wert ) . '</div>';    }}

    für

            'versandkosten' => 'Versandkosten',        'abholung' => 'Abholung',        'bett-matratzengroesse' => 'Bett-Matratzengroesse',        'bh-groesse' => 'BH Grösse',        'kleidergroesse-damen' => 'Kleidergrösse',        'kleidergroesse-herren' => 'Kleidergrösse',        'kleidergroesse-kinder-baby' => 'Kleidergrösse',        'kleidergroesse-teenager' => 'Kleidergrosse',        'pc-monitor' => 'Grösse',        'schuhgroesse' => 'Grösse',        'tv-groesse' => 'Grösse'
    Moderator threadi

    (@threadi)

    Der Code wird bereits in der Schleife aller Produkte einer aufgerufenen Kategorie ausgeführt. Ich weiß nicht, welche andere Schleife du meinst?

    ardianithelp

    (@ardianithelp)

    Hallo,

    der Fehler passiert, weil die Funktion nach dem ersten Attribut geschlossen wurde und der Code danach nicht mehr innerhalb einer Funktion steht. Das führt zu einem PHP Fehler im System.

    Es ist viel sauberer und sicherer, alle Attribute in einer einzigen Funktion über eine Liste (ein Array) abzufragen. So verhinderst du doppelten Code und die Website läuft stabiler.

    Hier ist der korrekte und bereinigte Code, den du komplett in deine functions.php kopieren kannst:

    add_action( ‚woocommerce_after_shop_loop_item_title‘, ‚display_attribute_on_shop_page‘, 5 );

    function display_attribute_on_shop_page() {
    global $product;

    add_action( ‚woocommerce_after_shop_loop_item_title‘, ‚display_attribute_on_shop_page‘, 5 );

    function display_attribute_on_shop_page() {
    global $product;

    if ( ! $product || ! $product->is_type( 'simple' ) ) {
        return;
    }
    
    $attributes_to_display = array(
        'versandkosten'             => 'Versandkosten',
        'abholung'                  => 'Abholung',
        'bett-matratzengroesse'     => 'Bett / Matratzen Grösse',
        'bh-groesse'                => 'BH Grösse',
        'kleidergroesse-damen'      => 'Kleidergrösse',
        'kleidergroesse-herren'     => 'Kleidergrösse',
        'kleidergroesse-kinder-baby'=> 'Kleidergrösse',
        'kleidergroesse-teenager'   => 'Kleidergrösse',
        'pc-monitor'                => 'Grösse',
        'schuhgroesse'              => 'Grösse',
        'tv-groesse'                => 'Grösse'
    );
    
    foreach ( $attributes_to_display as $slug => $label ) {
        $attribute_values = $product->get_attribute( $slug );
    
        if ( ! empty( $attribute_values ) ) {
            echo '<div class="shop-product-attribute">';
            echo '<strong>' . esc_html( $label ) . ': </strong>' . esc_html( $attribute_values );
            echo '</div>';
        }
    }

    }

    Was wurde verbessert:

    Es gibt nur noch eine Zuweisung und eine einzige Funktion, was den Absturz der Seite behebt.

    Durch die Schleife wird der Code übersichtlich und leicht erweiterbar, falls neue Attribute dazukommen.

    Durch die Sicherheitsfunktion esc_html werden die Ausgaben zusätzlich geschützt.

      Viele Grüße ardianithelp

      Moderator La Geek

      (@la-geek)

      Wieso 3 x echo und nicht so?

      echo '<div class="shop-product-attribute"><strong>' . esc_html( $label ) . ': </strong>' . esc_html( $attribute_values ) . '</div>';

      @grafikhouse
      Kann der Thread dann auf gelöst gesetzt werden? (Begründung).

      Da seit einiger Zeit keine Rückmeldung mehr vom TE (Thread-Ersteller) kam, wird der Thread aus administrativen Gründen auf gelöst gesetzt, damit die ungelösten Threads, in denen noch Hilfe benötigt wird, leichter auffindbar sind.

      Der Status „gelöst“ kann vom TE jederzeit geändert und der Thread kann mit Nachfragen oder einem Feedback ergänzt werden.

      Lösung gefunden? In einem User-helfen-User-Forum wie diesem hier ist das Posten der Lösung für andere User immer hilfreich, danke.

      Thread-Starter ONEM

      (@grafikhouse)

      ardianithelp

      Ich habe dein Code ausprobiert doch der funktioniert nicht bekomme im Backend einen Fehler

      Moderator threadi

      (@threadi)

      Welcher Fehler ist es genau? Den genauen Wortlaut findest du im Error-Log vom Hosting oder im debug.log, wenn du den Debug-Modus von WordPress aktiviert hast.

      Hat keiner Claude?

      1. Doppelter Code / verschachtelte Funktion

      Die ersten vier Zeilen sind doppelt vorhanden – add_action(...) und function display_attribute_on_shop_page() { global $product; erscheinen zweimal. Dadurch wird die Funktion innerhalb ihrer selbst erneut deklariert, was zu einem Fatal Error führt (Cannot redeclare function bzw. Syntaxfehler durch die nicht geschlossene äußere Funktion). Vermutlich ein Copy-Paste-Fehler. Es darf nur eine Deklaration geben.

      2. Falsche Anführungszeichen (der eigentlich kritische Punkt)

      Der Code verwendet typografische Anführungszeichen ‚…' statt gerader ASCII-Quotes '…'. PHP erkennt ‚display_attribute_on_shop_page' nicht als String – das erzeugt einen Parse Error. Das passiert oft, wenn Code durch einen Editor oder ein Textprogramm mit „Smart Quotes“ läuft. Alle betroffenen Stellen müssen auf gerade ' umgestellt werden.

      3. Einschränkung auf simple

      Kein Fehler, aber ein wahrscheinlicher Logikmangel: is_type( 'simple' ) blendet variable Produkte aus. Gerade Größen-Attribute (Kleidergröße, Schuhgröße) sind bei WooCommerce häufig an variable Produkte gebunden. Falls diese Attribute angezeigt werden sollen, greift der Filter zu eng.

      Korrigierte Version:

      php

      add_action( 'woocommerce_after_shop_loop_item_title', 'display_attribute_on_shop_page', 5 );
      function display_attribute_on_shop_page() {
          global $product;
      
          if ( ! $product ) {
              return;
          }
      
          $attributes_to_display = array(
              'versandkosten'              => 'Versandkosten',
              'abholung'                   => 'Abholung',
              'bett-matratzengroesse'      => 'Bett / Matratzen Grösse',
              'bh-groesse'                 => 'BH Grösse',
              'kleidergroesse-damen'       => 'Kleidergrösse',
              'kleidergroesse-herren'      => 'Kleidergrösse',
              'kleidergroesse-kinder-baby' => 'Kleidergrösse',
              'kleidergroesse-teenager'    => 'Kleidergrösse',
              'pc-monitor'                 => 'Grösse',
              'schuhgroesse'               => 'Grösse',
              'tv-groesse'                 => 'Grösse',
          );
      
          foreach ( $attributes_to_display as $slug => $label ) {
              $attribute_values = $product->get_attribute( $slug );
      
              if ( ! empty( $attribute_values ) ) {
                  echo '<div class="shop-product-attribute">';
                  echo '<strong>' . esc_html( $label ) . ': </strong>' . esc_html( $attribute_values );
                  echo '</div>';
              }
          }
      }

      Hinweise zur letzten Version: Ich habe den simple-Filter entfernt, damit auch variable Produkte erfasst werden. Willst du ihn behalten, ersetze die Prüfung durch if ( ! $product || ! $product->is_type( 'simple' ) ). get_attribute() gibt bei mehreren Werten eine kommagetrennte Zeichenkette zurück – für die Anzeige unkritisch, aber gut zu wissen. Für globale (taxonomiebasierte) Attribute erwartet WooCommerce ggf. den Slug mit pa_-Präfix; teste, ob deine Slugs so wie oben oder als pa_versandkosten etc. greifen.



    Ansicht von 15 Antworten – 1 bis 15 (von insgesamt 16)

    Du musst angemeldet sein, um auf dieses Thema zu antworten.