Wie implementiert man einen Filter nach Versandart im WooCommerce-Backend?

Lesezeit: 3 Minuten

Benutzer-Avatar
Lorenzo

Ich muss einen Filter im Woocommerce-Backend implementieren, mit dem ich die Bestellungen nach der ausgewählten Versandart filtern kann.

Ich kann einen Filter für benutzerdefinierte Felder erstellen und die Abfrage ändern, aber das Problem ist, dass Woocommerce die Versandart in einer benutzerdefinierten Tabelle der DB speichert.

Irgendwelche Hinweise, wie man diesen Filter erreicht?

Benutzer-Avatar
Lorenzo

Ich habe das Hinzufügen eines Dropdown-Menüs mit diesem Hook gelöst:

add_action( 'restrict_manage_posts', 'display_shipping_dropdown' );

Und benutzte dann diesen anderen Hook, um die where-Klausel zu erweitern:

add_filter( 'posts_where', 'admin_shipping_filter', 10, 2 );
function admin_shipping_filter( $where, &$wp_query )
{
    global $pagenow;
    $method = $_GET['shipping_filter'];

    if ( is_admin() && $pagenow=='edit.php' && $wp_query->query_vars['post_type'] == 'shop_order' && !empty($method) ) {
        $where .= $GLOBALS['wpdb']->prepare( 'AND ID
                            IN (
                                SELECT order_id
                                FROM wp_woocommerce_order_items
                                WHERE order_item_type = "shipping"
                                AND order_item_name = "' . $method . '"
                            )' );
    }

    return $where;
}

  • Du hast benutzt add_action( 'restrict_manage_posts', 'display_shipping_dropdown' ); zweimal, was ist der richtige Haken im zweiten Fall?

    – vitro

    21. Dezember 2014 um 23:49 Uhr


  • Entschuldigung, da war ein Tippfehler. Der zweite Haken ist der Filter „posts_where“. Ich habe die Antwort korrigiert.

    – Lorenzo

    22. Dezember 2014 um 9:06 Uhr

  • Hi! Können Sie bitte auch die Funktion display_shipping_dropdown hinzufügen? Danke Peter :).

    – Strahlkiller

    19. Oktober 2016 um 23:23 Uhr

Um Lorenzos Antwort zu vervollständigen, hier ist eine Funktion, mit der Sie die Filter-HTML generieren können:

function display_shipping_dropdown(){

    if (is_admin() && !empty($_GET['post_type']) && $_GET['post_type'] == 'shop_order'){

        $exp_types = array();

        $zones = WC_Shipping_Zones::get_zones();
        foreach($zones as $z) {
            foreach($z['shipping_methods'] as $method) {
                $exp_types[] = $method->title;
            }
        }

        ?>
        <select name="shipping_method">
            <option value=""><?php _e('Filter par expédition', 'woocommerce'); ?></option>
            <?php
            $current_v = isset($_GET['shipping_method']) ? $_GET['shipping_method'] : '';
            foreach ($exp_types as $label) {
                printf
                (
                    '<option value="%s"%s>%s</option>',
                    $label,
                    $label == $current_v? ' selected="selected"':'',
                    $label
                );
            }
            ?>
        </select>
        <?php
    }
}
add_action( 'restrict_manage_posts', 'display_shipping_dropdown' );

Benutzer-Avatar
Herr Schwed

In Lorenzos Lösung schlägt der Algorithmus fehl, wenn der Titel der Versandart geändert wird. (in meinem Fall dynamisch durch ein Plugin).

Verwenden instance_id Anstatt von title werde dies vermeiden.

add_action( 'restrict_manage_posts', function () {
    if ( is_admin() && ! empty( $_GET['post_type'] ) && $_GET['post_type'] == 'shop_order' ) {
        $exp_types = array();
        $zones     = WC_Shipping_Zones::get_zones();
        foreach ( $zones as $z ) {
            foreach ( $z['shipping_methods'] as $method ) {
                $exp_types[ $method->instance_id ] = $method->title;
            }
        }
        ?>
        <select name="shipping_method">
            <option value=""><?php _e( 'Shipping filter' ); ?></option>
            <?php
            $current_v = isset( $_GET['shipping_method'] ) ? $_GET['shipping_method'] : '';
            foreach ( $exp_types as $key => $label ) {
                printf( '<option value="%s"%s>%s</option>', $key, $key == $current_v ? ' selected="selected"' : '', $label );
            }
            ?>
        </select>
        <?php
    }
} );

add_filter( 'posts_where', function ( $where, &$wp_query ) {
    global $pagenow, $wpdb;
    $method = isset( $_GET['shipping_method'] ) ? $_GET['shipping_method'] : false;

    if ( is_admin() && $pagenow == 'edit.php' && $wp_query->query_vars['post_type'] == 'shop_order' && ! empty( $method ) ) {
        $where .= $wpdb->prepare( "AND ID
IN (
 SELECT order_id
 FROM {$wpdb->prefix}woocommerce_order_itemmeta m
 LEFT JOIN {$wpdb->prefix}woocommerce_order_items i 
  ON i.order_item_id = m.order_item_id
 WHERE meta_key = 'instance_id' and meta_value="{$method}" )" );
    }

    return $where;
}, 10, 2 );


  • Dies ist die einzige Lösung, die ein Dropdown-Menü für mich anzeigt. Die anderen Lösungen funktionieren nicht. Aber der Filter funktioniert mit diesem Code nicht gut

    – Benfu

    13. Dezember 2021 um 14:22 Uhr


1312460cookie-checkWie implementiert man einen Filter nach Versandart im WooCommerce-Backend?

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

Privacy policy