WooCommerce: Filtern Sie Admin-Bestellungen nach Begriff des Produktattributs

Lesezeit: 5 Minuten

Benutzer-Avatar
John Smith

Ich habe ein Geschäft mit vielen variablen Produkten. Alle Bestellungen werden speziell für den Kunden maßgefertigt. Das heißt, wenn wir das Produkt im Lager erhalten, müssen wir die Bestellung des spezifischen Produkts finden. Im Moment müssen wir die meisten Bestellungen einfach manuell überprüfen.

Was wir tun möchten, um uns wertvolle Zeit zu sparen, sind Suchaufträge nach benutzerdefinierten Attributbegriffen. Zum Beispiel: Wir verwenden das Attribut “Größe” für Sonderanfertigungen. Wir haben 24 „Größen“-Begriffe (z. B. „12 cm“, „16 cm“ usw.). Wir möchten die Bestellung basierend auf dem Größenbegriff finden. Zum Beispiel: Alle Bestellungen finden, deren Größe „48 cm“ ist.

Beyogen auf Erweiterte Suche in der Backend-Bestellliste für Produktartikel nach ID oder SKUhier mein Codeversuch:

add_filter( 'woocommerce_shop_order_search_fields', function ($search_fields ) {
    $orders = get_posts( array( 'post_type' => 'shop_order' ) );

    foreach ($orders as $order_post) {
        $order_id = $order_post->ID;
        $order = new WC_Order($order_id);
        $items = $order->get_items();
    
        foreach( $order->get_items() as $item_id => $item_values ) {
            if ( version_compare( WC_VERSION, '3.0', '<' ) ) {
                $product_id = $item_values['product_id'];
            } else {
                $product_id = $item_values->get_product_id();
            }
             $attribute = $item_values->get_data();
             
            // attribute value
            $value = $attribute['value'];
            
            // attribute slug
            $slug = $attribute['size'];
            
            add_post_meta($order_id, $slug, $value, true); //
        }
    }
    return array_merge($search_fields, array($slug));
}); 

Aber es hat nicht funktioniert. Jede Hilfe ist willkommen.

  • Du sagst custom made Sie geben jedoch die Größe an … Gibt es bei jedem Produkt etwas Einzigartiges?

    – Fresz

    17. Februar 2021 um 23:11 Uhr

  • Ich frage mich – ich habe gerade versucht, in meinem Geschäft nach Attributwerten zu suchen, es scheint korrekte Bestellungen zurückzugeben, sagen wir, wenn ich “schwarz” eingebe (benutzerdefiniertes Attribut für Farbe). Ich frage mich, ob “12cm” irgendwelche Ergebnisse für Sie liefert? nur als Stichwort in der Auftragssuche…

    – Andrej Filonow

    17. Februar 2021 um 23:48 Uhr

  • Sie da! ein Feedback zu der Antwort unten wird sehr geschätzt.

    – LoicTheAztec

    19. Februar 2021 um 18:02 Uhr

  • @LoicTheAztec – kannst du bitte auf meinen Kommentar zu deiner Antwort antworten? Vielen Dank!

    – John Smith

    22. Februar 2021 um 22:24 Uhr

Was Sie versuchen zu tun, kann in Ihrem Fall nicht wirklich funktionieren und es ist ein sehr schwerer Prozess, der den Administrator zum Absturz bringen oder Ihre gesamte Website verlangsamen kann.

Anstelle dessen, was Sie tun können, ist es, ein Dropdown-Menü mit all Ihren vorhandenen Größenwerten anzuzeigen, das Ihre Bestellungen filtert:

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass jede Produktattributtaxonomie mit beginnt pa_ + der Slug des Produktattributs. Ich habe im Code die Produktattribut-Taxonomie für “Size” gesetzt pa_size.

Zur Information verwendet der folgende Code eine sehr leichte benutzerdefinierte SQL-Abfrage.

// Custom function where metakeys / labels pairs are defined
function get_product_attribute_size_terms(){
    $taxonomy = 'pa_size';
    $options  = array();

    foreach ( get_terms( array('taxonomy' => 'pa_size' ) ) as $term ) {
        $options[$term->slug] = $term->name;
    }
    return $options;
}

// Add a dropdown to filter orders by variations size
add_action( 'restrict_manage_posts', 'display_admin_shop_order_by_meta_filter' );
function display_admin_shop_order_by_meta_filter(){
    global $pagenow, $typenow;

    if( 'shop_order' === $typenow && 'edit.php' === $pagenow ) {
        $domain    = 'woocommerce';
        $filter_id = 'by_size';
        $current   = isset($_GET[$filter_id])? $_GET[$filter_id] : '';

        echo '<select name="'.$filter_id.'">
        <option value="">' . __('Filter by Size…', $domain) . '</option>';

        $options = get_product_attribute_size_terms();

        foreach ( $options as $key => $label ) {
            printf( '<option value="%s"%s>%s</option>', $key,
                $key === $current ? '" selected="selected"' : '', $label );
        }
        echo '</select>';
    }
}

add_action( 'pre_get_posts', 'process_admin_shop_order_product_type_filter' );
function process_admin_shop_order_product_type_filter( $query ) {
    global $pagenow, $post_type, $wpdb;

    $filter_id = 'by_size';
    $taxonomy  = 'pa_size';

    if ( $query->is_admin && 'edit.php' === $pagenow && 'shop_order' === $post_type
         && isset( $_GET[$filter_id] ) && $_GET[$filter_id] != '' ) {

        $attribute_taxonomy = 'attribute_'.$taxonomy;

        $order_ids = $wpdb->get_col( $wpdb->prepare("
            SELECT DISTINCT opl.order_id
            FROM {$wpdb->prefix}wc_order_product_lookup opl
            INNER JOIN {$wpdb->prefix}postmeta pm
                ON opl.variation_id = pm.post_id
            WHERE pm.meta_key = %s
                AND pm.meta_value="%s"
        ", $attribute_taxonomy, esc_attr($_GET[$filter_id]) ) );

        $query->set( 'post__in', count($order_ids) > 1 ? $order_ids : array(0) ); // Set queried order ids

        $query->set( 'posts_per_page', 25 ); // Set "posts per page"

        $query->set( 'paged', ( get_query_var('paged') ? get_query_var('paged') : 1 ) ); // Set "paged"
    }
}

Der Code wird in die Datei functions.php des aktiven untergeordneten Designs (oder aktiven Designs) eingefügt. Getestet und funktioniert.

Verwandt: Filtern Sie Bestellungen nach Produkt-Post-Typ auf der Bestelllistenseite des WooCommerce-Adminbereichs

  • Nun, aus irgendeinem Grund scheint das nicht zu funktionieren. Jedes Mal werden alle Bestellungen mit keiner Übereinstimmung gefiltert. Ich habe es mit verschiedenen Attributen versucht, zB pa_size / pa_color. Kannst du es bitte nochmal überprüfen? Ich habe verschiedene Möglichkeiten ausprobiert, um dies zum Laufen zu bringen, aber es wird einfach alle Bestellungen filtern und keine anzeigen! Es ist wichtig zu beachten: Ich habe dies mit Bestellungen versucht, die zwei variable Produkte enthalten.

    – John Smith

    21. Februar 2021 um 21:42 Uhr


  • @JohnSmith Nicht 2 variable Produkte, sondern 2 Produktvariationen, da in Artikeln niemals ein variables Produkt enthalten ist, sondern stattdessen eine Produktvariation (von einem variablen Produkt).

    – LoicTheAztec

    21. Februar 2021 um 21:47 Uhr


  • Entschuldigung, mein Fehler. Ich meinte zwei Produktvarianten. Wenn also eine Bestellung Produkt B mit zwei verschiedenen Produktvariationen in der Bestellung enthält, werden keine Übereinstimmungen gefunden. Können Sie das bitte überprüfen? Vielen Dank!

    – John Smith

    21. Februar 2021 um 21:49 Uhr


  • Ich habe mich entschieden, dies jetzt mit einer Neuinstallation von WooCommerce zu versuchen, wobei ich mehrere Produktvariationen in meiner Bestellung verwende, und es wird nicht funktionieren. Wird immer keine zurückgeben.

    – John Smith

    21. Februar 2021 um 21:54 Uhr

  • In der drittletzten Zeile sollte nach Bestellungen gesucht werden, die größer als 0 und nicht 1 sind. Andernfalls werden keine Ergebnisse angezeigt, wenn nur eine Bestellung in der Liste den Kriterien entspricht.

    – Ramez

    9. Oktober 2021 um 0:01 Uhr

1010110cookie-checkWooCommerce: Filtern Sie Admin-Bestellungen nach Begriff des Produktattributs

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

Privacy policy