WooCommerce-Widget “Produkte nach Attribut filtern” zeigt nicht verfügbare Produkte an

Lesezeit: 6 Minuten

Benutzeravatar von Louis
Ludwig

Ich verwende eine der In WooCommerce enthaltene Widgets genannt Produkte nach Attributen filtern. Ich habe einen Widget-Bereich auf der Kategorieseite in meinem Storefront-Child-Theme erstellt functions.php (siehe Code unten).

Aber wenn ich nach Attributen filtere size M zum Beispiel listet es Produkte auf, bei denen Größe M nicht vorrätig ist…

Irgendeine Idee, wie man das beheben kann?

BEISPIEL: Beim Filtern nach Größe M wird dieses Produkt angezeigt, das nicht verfügbar ist:

Geben Sie hier die Bildbeschreibung ein

/* FILTER BY SIZE WIDGET */
// Adding the widget area.
if (function_exists('register_sidebar')) {
    register_sidebar(array(
    'name' => 'Below category title',
    'id' => 'extra-widget-area',
    'description' => 'Below category title',
    'before_widget' => '<div class="widget below-cat-title-widget">',
    'after_widget' => '</div>',
    'before_title' => '<h6 class="below-cat-title-widget-title">',
    'after_title' => '</h6>'
    ));
}
// placing the widget
add_action( 'woocommerce_archive_description', 'add_my_widget_area', 31 );
function add_my_widget_area() {
  if (function_exists('dynamic_sidebar')) {
    dynamic_sidebar('Below category title');
  }
}

add_action( 'woocommerce_archive_description', 'filter_button_function', 21 );
function filter_button_function() {
    // if ( is_product_category() ) {
        // global $wp_query;
        // $cat_id = $wp_query->get_queried_object_id();
        // $cat_desc = term_description( $cat_id, 'product_cat' );
        if (get_locale() == 'fr_FR') {
            $filter_html="<div class="filter_by_size" class="subtitle">".'FILTRE PAR TAILLE'.'&nbsp;&nbsp;<span class="filter-icon"></span>'.'</div>';
        } else {
            $filter_html="<div class="filter_by_size" class="subtitle">".'FILTER BY SIZE'.'&nbsp;&nbsp;<span class="filter-icon"></span>'.'</div>';
        }

        echo $filter_html;
    // }
}

Benutzeravatar von Alexandre Elshobokshy
Alexandre Elshobokshy

Ich werde direkt sein: standardmäßig du kannst nicht. Es bezieht sich nicht auf ein bestimmtes Thema oder Plugin, sondern auf Woocommerce selbst. Dies ist ein Problem, das im WooCommerce existiert für eine sehr lange Zeit. In WooCommerce ist es standardmäßig nicht möglich, die Bestandssichtbarkeit variabler Produkte (Lagerstatus) basierend auf der Sichtbarkeit der Variationen zu handhaben, da dies von WooCommerce notwendig und benötigt wird1.

Eine Möglichkeit, dies zu tun, besteht darin, diese Aktionsfunktion hinzuzufügen:

add_action('woocommerce_before_shop_loop_item', 'out_of_stock_variations_loop');
function out_of_stock_variations_loop()
{
    global $product;
    $filter="size";
    if ($product->product_type === 'variable') {
        $available = $product->get_available_variations();
        if ($available) {
            foreach ($available as $instockvar) {
                if (isset($instockvar[ 'attributes' ][ 'attribute_pa_' . $filter ])) {
                    if ($_GET[ 'filter_' . $filter ]) {
                        if ( !in_array( $instockvar[ 'attributes' ][ 'attribute_pa_' . $filter ], explode(',', $_GET[ 'filter_' . $filter ]) , true ) || ($instockvar[ 'max_qty' ] <= 0) ) {
                            echo "<style>.post-" . $product->get_id() . " {display: none}</style>";
                        } else {
                            echo "<style>.post-" . $product->get_id() . " {display: list-item !important}</style>";
                        }
                    }
                }
            }
        }
    }
}
?>

Dadurch wird nur die Liste der auf Lager befindlichen Produkte angezeigt. Das Problem dabei ist, dass dort Leerzeichen bleiben, wo die nicht vorrätigen Produkte durch diese Abfrage gelöscht werden, und es kann schwierig sein, dieses Problem nur mit CSS zu umgehen, da in jeder Zeile das erste und das letzte Produkt vorhanden sind first und last Klassen, die ihr Layout in CSS bestimmen. Um dies zu umgehen, fügen Sie diese jQuery zu Ihrem untergeordneten js-Skript hinzu:

function openLayeredNavFilterIfSelected() {

  if (jQuery('.wc-layered-nav-term').hasClass('woocommerce-widget-layered-nav-list__item--chosen')) {

    /*keep layered nav filter open, if at least an attribute is selected*/
    jQuery('.woocommerce-widget-layered-nav-list__item--chosen').parent().parent().show();
    if (!jQuery('.filter-icon').hasClass('arrow_up')) {
      jQuery('.filter-icon').addClass('arrow_up');
    }

    /*redistribute products rows to avoid missing spaces*/
    jQuery('.site-main ul.products.columns-3 li.product').removeClass('first').removeClass('last');
    jQuery('.site-main ul.products.columns-3 li.product:visible').each(function(i) {
      if (i % 3 == 0) jQuery(this).addClass('first'); //add class first to firsts products of rows
      if (i % 3 == 2) jQuery(this).addClass('last'); //add class last to lasts products of rows
    });
  }
}

openLayeredNavFilterIfSelected();
jQuery(window).resize(openLayeredNavFilterIfSelected);

Und Sie sollten gut zu gehen sein.

1 WOOF Products Filter Plugin und Problem mit nicht vorrätigen Variationen in Woocommerce

Verwandt :

– Produkte nach Attributen filtern und vergriffene Artikel variabler Produkte ausblenden

– Wie kann verhindert werden, dass „nicht vorrätige“ Artikel als Filteroption in der Seitenleiste (überlagertes Navigations-Widget) in WooCommerce angezeigt werden?

https://wordpress.org/support/topic/hide-out-of-stock-variations-when-filtering/#post-7718128

https://xtemos.com/forums/topic/filter-attributes-dont-show-out-of-stock-variations/

https://wordpress.org/support/topic/exclude-out-of-stock-products-from-filter/

Keine wirklich gute Antwort hier.

Wie @Islam Elshobokshy sagte, ist es etwas komplex, die Produktschleifenabfrage zu bearbeiten, um nicht vorrätige Variationen zu entfernen.

Dennoch können Sie mit CSS austricksen, um nicht vorrätige Variationen aus der Liste zu „verstecken“. Aber es kann Ihre Produktliste/Ihr Raster „brechen“: Wenn es genug Produkte für 2 Seiten gibt (10 Artikel/Seite), aber ein Produkt durch diesen Filter auf Seite 1 ausgeblendet wird, enthält Seite 1 nur 9 Produkte. Wir sind hinter der Produktabfrage her.

Ich habe schnell getestet und etwas inspiriertes geschrieben Dies:

  • das funktioniert für a size Attribut (es könnte angepasst werden, um alle Attribute von Woocommerce oder URL-Parameter “filter_*” zu verarbeiten, oder für jedes verwendete Attribut fest codiert)

Code:

add_action('woocommerce_before_shop_loop_item', 'out_of_stock_variations_loop');
function out_of_stock_variations_loop()
{
    global $product;

    $filter="size"; //to edit

    if ($product->product_type === 'variable') {
        $available = $product->get_available_variations();
        if ($available) {
            foreach ($available as $instockvar) {
                if (isset($instockvar[ 'attributes' ][ 'attribute_pa_' . $filter ])) {
                    if (($instockvar[ 'attributes' ][ 'attribute_pa_' . $filter ] === $_GET[ 'filter_' . $filter ]) && ($instockvar[ 'max_qty' ] <= 0)) {
                        //sadly echo some inline CSS :(
                        echo "<style>.post-" . $product->get_id() . " {display: none}</style>";

                        //some tests using is_visible() filters, but we are too late here
                        //add_filter( 'woocommerce_product_is_visible', function($visible, $id) use ($the_id) {return $id === $the_id ? false : $visible;}, 50, 2);
                    }
                }
            }
        }
    }
}

Um dasselbe ohne Inline-CSS zu erreichen, können Sie:

  • überschreiben /woocommerce/template/content-product.php zu your-theme/woocommerce/content-product.php
  • Bewegen Sie den Code unten in a method($product)bearbeiten Sie es ein wenig, um nur für erforderliche Produkte wahr/falsch zurückzugeben
  • Nennen Sie es im Block “Sichtbarkeit sicherstellen” wie if ( empty( $product ) || ! $product->is_visible() || !$method($product) )
  • dies verhindert die Ausgabe des Produkts, löst aber nicht das Gitter-/Listenproblem.

Am Ende kann die Aktualisierung der Schleifenabfrage an Ihre Anforderungen komplex sein und sich negativ auf die Leistung auswirken. Aber um mehr zu erkunden, würde ich so etwas anfangen:

  • fügen Sie eine query_var hinzu, indem Sie den GET-Filterparameter erkennen (oder direkt den wp_query-Parameter erkennen, der mit dem Filter/Attribut übereinstimmt, von dem Sie wissen, dass es filtern wird).
  • Finden Sie das WooCommerce-Produkt wp_query und hängen Sie es ein
  • Haken Sie eine Methode ein, die Ihre benutzerdefinierte query_var erkennt
  • Bearbeiten Sie die Abfrage, aber wenn es um rohes SQL geht, kann es schmerzhaft sein.

1387120cookie-checkWooCommerce-Widget “Produkte nach Attribut filtern” zeigt nicht verfügbare Produkte an

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy