title: Search products not working with my custom display of products per category
body: <p>I'm trying to do something similar to <a href="https://stackoverflow.com/questions/25989135/woocomerce-shop-page-to-show-category-name-display-products-within-that-catego">this guy</a>, meaning displaying my products per category and it works nicely for the main page and each category page displays alright, but the product search widget doesn't, and only ever displays all or none of the products.
  You can see the live version here: <a href="https://aypac.de/woocommerce/shop/" rel="nofollow noreferrer">https://aypac.de/woocommerce/shop/</a></p>
  <p>Here's my customized archive-product page:</p>
  <pre><code>&lt;?php
  /**
   * The Template for displaying product archives, including the main shop page which is a post type archive
   *
   * This template can be overridden by copying it to yourtheme/woocommerce/archive-product.php.
   *
   * HOWEVER, on occasion WooCommerce will need to update template files and you
   * (the theme developer) will need to copy the new files to your theme to
   * maintain compatibility. We try to do this as little as possible, but it does
   * happen. When this occurs the version of the template file will be bumped and
   * the readme will list any important changes.
   *
   * @see https://docs.woocommerce.com/document/template-structure/
   * @package WooCommerce/Templates
   * @version 3.4.0
   */
  
  defined( 'ABSPATH' ) || exit;
  
  get_header( 'shop' );
  
  /**
   * Hook: woocommerce_before_main_content.
   *
   * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content)
   * @hooked woocommerce_breadcrumb - 20
   * @hooked WC_Structured_Data::generate_website_data() - 30
   */
  do_action( 'woocommerce_before_main_content' );
  
  ?&gt;
  &lt;header class=&quot;woocommerce-products-header&quot;&gt;
      &lt;?php if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?&gt;
          &lt;h1 class=&quot;woocommerce-products-header__title page-title&quot;&gt;&lt;?php woocommerce_page_title(); ?&gt;&lt;/h1&gt;
      &lt;?php endif; ?&gt;
  
      &lt;?php
      /**
       * Hook: woocommerce_archive_description.
       *
       * @hooked woocommerce_taxonomy_archive_description - 10
       * @hooked woocommerce_product_archive_description - 10
       */
      do_action( 'woocommerce_archive_description' );
      ?&gt;
  &lt;/header&gt;
  &lt;?php
  if ( woocommerce_product_loop() ) {
  
      /**
       * Hook: woocommerce_before_shop_loop.
       *
       * @hooked wc_print_notices - 10
       * @hooked woocommerce_result_count - 20
       * @hooked woocommerce_catalog_ordering - 30
       */
       do_action( 'woocommerce_before_shop_loop' );
  
  
      if ( is_shop() ) {      
      // Gets products per category
      // first we need to get the product categories ....
  
      $categories_args = array(
          'taxonomy' =&gt; 'product_cat' // the taxonomy we want to get terms of
      );
  
      $product_categories = get_terms( $categories_args ); // get all terms of the product category taxonomy
  
  
      if ( is_admin() ) return false;
  
          echo '&lt;ul class=&quot;woocommerce&quot;&gt;';
  
          // now we are looping over each term
          foreach ($product_categories as $product_category) {
  
              $term_id    = $product_category-&gt;term_id; // Term ID
              $term_name  = $product_category-&gt;name; // Term name
              $term_desc  = $product_category-&gt;description; // Term description
              $term_link  = get_term_link($product_category-&gt;slug, $product_category-&gt;taxonomy); // Term link
  
  
              echo '&lt;li class=&quot;cat-title&quot; id=&quot;cat-'.$term_id.'&quot;&gt;'; // for each term we will create one list element
              echo '&lt;h3&gt;'.$term_name.'&lt;/h3&gt;'; // display term name
  
  
              // ... now we will get the products which have that term assigned...
  
  
              $products_args = array(
                  'post_type'     =&gt; 'product', // we want to get products
                  'tax_query'     =&gt; array( 
                      array(
                          'taxonomy' =&gt; 'product_cat',
                          'field'    =&gt; 'term_id',
                          'terms'    =&gt; $term_id, // here we enter the ID of the current term *this is where the magic happens*
                      ),
                  ),
              );
  
              $products = new WP_Query( $products_args );
  
              if ( $products-&gt;have_posts() ) { // only start if we have some products
  
                  // START some normal woocommerce loop, as you already posted in your question
  
                  woocommerce_product_loop_start();
  
                  while ( $products-&gt;have_posts() ) : $products-&gt;the_post();
  
                      wc_get_template_part( 'content', 'product' );
  
                  endwhile; // end of the loop.
  
                  woocommerce_product_loop_end();
  
                  // END the normal woocommerce loop
  
                  // Restore original post data, maybe not needed here (in a plugin it might be necessary)
                  wp_reset_postdata();
  
              } else { // if we have no products, show the default woocommerce no-product loop
  
                  // no posts found
                  do_action('woocommerce_no_products_found');
  
              }//END if $products
  
              echo '&lt;/li&gt;';//END here is the end of our product-cat-term_id list item
  
          }//END foreach $product_categories
  
          echo '&lt;/ul&gt;';//END of catalog list
  
  
      } else {
          
          woocommerce_product_loop_start();
  
          if ( wc_get_loop_prop( 'total' ) ) {
              while ( have_posts() ) {
                  the_post();
  
                  /**
                   * Hook: woocommerce_shop_loop.
                   */
                  do_action( 'woocommerce_shop_loop' );
  
                  wc_get_template_part( 'content', 'product' );
              }
          }
  
          woocommerce_product_loop_end();
  
      }
  
  
  
      /**
       * Hook: woocommerce_after_shop_loop.
       *
       * @hooked woocommerce_pagination - 10
       */
      do_action( 'woocommerce_after_shop_loop' );
  
  
  }
  
  else {
      /**
       * Hook: woocommerce_no_products_found.
       *
       * @hooked wc_no_products_found - 10
       */
      do_action( 'woocommerce_no_products_found' );
  }
  
  /**
   * Hook: woocommerce_after_main_content.
   *
   * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content)
   */
  do_action( 'woocommerce_after_main_content' );
  
  /**
   * Hook: woocommerce_sidebar.
   *
   * @hooked woocommerce_get_sidebar - 10
   */
  do_action( 'woocommerce_sidebar' );
  
  get_footer( 'shop' );
  </code></pre>
  <p>What should I do to make it work? Thank you.</p>