Home > Enterprise >  Extending search in WooCommerce admin orders list
Extending search in WooCommerce admin orders list

Time:03-09

I'm looking for a way to extend the search field in WooCommerce admin orders list for a custom meta key. Currently i'm using the woocommerce_shop_order_search_fields filter hook.

Resulting in this code, which allows me to search by the user id, order total and order number.

add_filter( 'woocommerce_shop_order_search_fields', 'woocommerce_shop_order_search_order_total' );
function woocommerce_shop_order_search_order_total( $search_fields ) {
    $search_fields[] = '_order_total';

    $search_fields[] = '_user_id';

    $search_fields[] = '_order_number';

    return $search_fields;
} 

However, these are all existing meta keys, what if I want to search for meta data that doesn't yet exist? Any adivce?

CodePudding user response:

Expanding the search in WooCommerce admin orders list can be done very easily by using the woocommerce_shop_order_search_fields filter hook, you just need to add some post_meta fields for order (item(s)). As long as this data exists of course!

By default, the following metakeys are present:

  • _billing_address_index
  • _shipping_address_index
  • _billing_last_name
  • _billing_email

So, for example, if you want to extend the search by the billing first name, you can do this by simply adding the metakey _billing_first_name, and then you get:

function filter_woocommerce_shop_order_search_fields( $search_fields ) {
    // Metakey
    $search_fields[] = '_billing_first_name';

    return $search_fields;
}
add_filter( 'woocommerce_shop_order_search_fields', 'filter_woocommerce_shop_order_search_fields', 10, 1 );

Now, what if this metadata is not present for the orders? You could add that specific metadata for future orders, when the order is created. But wait! what about the existing orders? for these orders this data would not exist!

Wouldn't it be useful if we could add this data to existing orders, or even newer orders. Well this is possible, namely by using wc_get_orders(), to get (and update) the existing orders before running the search.

So you get: (where we in this example add the user's nickname as meta data to orders)

function filter_woocommerce_shop_order_search_fields( $search_fields ) {
    // The desired meta key
    $meta_key = '_user_nickname';

    // Get ALL orders where a certain meta key not exists
    $orders = wc_get_orders( array(
        'limit'        => -1, // Query all orders
        'meta_key'     => $meta_key, // Post meta_key
        'meta_compare' => 'NOT EXISTS', // Comparison argument
    ));

    // NOT empty    
    if ( ! empty ( $orders ) ) {
        // Loop through the orders
        foreach ( $orders as $order ) {
            // Get the desired information via the order object
            // Get user
            $user = $order->get_user();

            // User is NOT empty
            if ( ! empty ( $user ) ) {
                // Get nickname from user
                $meta_value = $user->nickname;

                // Meta value is NOT empty
                if ( ! empty ( $meta_value )  ) {
                    // Add the meta data
                    $order->update_meta_data( $meta_key, $meta_value );
                    $order->save();
                }
            }
        }
    }

    // Metakey
    $search_fields[] = $meta_key;

    return $search_fields;
}
add_filter( 'woocommerce_shop_order_search_fields', 'filter_woocommerce_shop_order_search_fields', 10, 1 );
  • Related