Support » Plugin: WooCommerce » View order by product category

  • Resolved Lea


    I’m a programmer ,and I have 2 questions:

    In the admin order page(wp-admin/edit.php?post_type=shop_order), I would like to add a view by product category (&category=waiter).

    1. In order to create the view, I’m using the views_edit-shop_order hook. The easiest would be to use the $the_order variable to get the item, and its product_id to get the product_cat term.
      However, when this hook is invoked, $the_order is still NULL.
      How can I overcome this obstacle?
    2. How would I filter the orders in that view? Can I run a query the returns only orders with items in a certain category?

    Thank you!

Viewing 11 replies - 1 through 11 (of 11 total)
  • Plugin Author Mike Jolley


    This is a difficult query to make because of how the data is contained.

    shop_order post type contains…
    order_items which contain…
    order_item_meta which stores…
    the product ID

    I think you’d want to use the post__in query var and pass in order IDs matching the result of a custom query joining the above. Complex one.

    Hi Mike

    Thanks for your swift reply, and sorry for my delayed one.

    It does seem rather difficult. I thought it would be easier, because in the list table itself it was quite easy to show the category of at least one item in the order:

    I added a column title named ‘Category’, using the manage_shop_order_posts_columns filter:

    function my_manage_shop_order_posts_columns( $instance )
        $instance ['category'] = __( 'Category', 'yuval' );
        return $instance;
    add_filter( 'manage_shop_order_posts_columns', 'my_manage_shop_order_posts_columns', 100, 1 ); // give a later priority, so can apply to columns added by woocommerce

    And I added the content of that column using the manage_shop_order_posts_custom_column:

    function my_render_shop_order_columns($column){
        global $post, $the_order;
        switch ( $column ) {
            case 'category':
                foreach ( $the_order->get_items() as $item ) {
                    echo wp_get_post_terms($item['product_id'], 'product_cat')[0]->name;
    add_action( 'manage_shop_order_posts_custom_column',  'my_render_shop_order_columns' ,100, 2 );

    However, maybe it will be easier if I just add another status to the order, and get a link to a view in a much easier way…

    Plugin Author Mike Jolley


    What is the report for out of interest?

    Thank you for your interest!

    The client I’m working for has 2 departments in their shop. Each product on the site belongs to one of these departments. I would like each department to be able to have a screen where they can see a list of orders with only the products belonging to their department.

    At first I thought that using categories would be a good solution, where each category would represent a department.
    But when I saw how difficult it is to create a view based on a category, I thought I would just add a status to represent one of the departments, resulting in that department having their own view, and the other department using the “all” view (with maybe some filter to exclude the status of the first department).
    It’s less intuitive this way, but easier from a programming point of view.

    Am I missing something? Is there another way to tackle this situation?

    Thanks again.

    Plugin Author Mike Jolley


    The order solution won’t work; orders could have items from either department, right?

    That’s true, and that’s another challenge I’ll have to confront.

    Is the situation I’m describing so rare? Is there no trivial way to separate orders to different departments?

    Plugin Author Mike Jolley


    I don’t know how rare it is, but I’ve never dealt with it personally.

    Here is how I’d tackle it.

    1. Have a new taxonomy called department
    2. Add a new filter to order admin to filter by department
    3. ON ORDER, loop over items and set the department for the order as Dep 1, Dep 2, or both.

    Sounds good, thank you!. Would you mind elaborating on points 2 and 3?
    For example, what hooks would I use?

    Plugin Author Mike Jolley


    3. woocommerce_order_status_completed perhaps.

    For 2, there are some generic tutorials on adding filters to post type admin screens. Have a search 🙂

    I was able to follow this idea to add a custom taxonomy for products called “product_teams” which is quite similar to your departments scenario.

    For saving the custom taxonomy data to the order, I used the ‘woocommerce_thankyou’ hook to loop through the products and set the team.

    Here is what I did to loop through the products and save the tax data onto the order. Note, I registered the ‘product_team’ taxonomy on both the product and shop_order post types.

    function save_team_on_new_order( $order_id ) {
    	$order = new WC_Order( $order_id );
    	$items = $order->get_items();
    	foreach ( $items as $item ) {
    	       $product_id = $item['product_id'];
    		$teams = wp_get_post_terms( $product_id, 'product_team' );
    		foreach ( $teams as $team ) {
    			wp_set_post_terms( $order_id, $team->term_id, 'product_team', true );
    add_action( 'woocommerce_thankyou',  'save_team_on_new_order'  );

    Here is the full working code –

    Hope this helps.

    Hi Alex

    Thanks for your code. I’m no longer working on that project, so can’t check out your solution. Hope it helps someone else 🙂

Viewing 11 replies - 1 through 11 (of 11 total)
  • The topic ‘View order by product category’ is closed to new replies.