add_action( 'pre_get_posts', 'custom_pre_get_posts_query' );

function custom_pre_get_posts_query( $q ) {

  if ( ! $q->is_main_query() ) return;
  if ( ! $q->is_post_type_archive() ) return;
  
  if ( ! is_admin() && is_shop() ) {

    $q->set( 'tax_query', array(array(
      'taxonomy' => 'product_cat',
      'field' => 'slug',
      'terms' => array( 'knives' ), // Don't display products in the knives category on the shop page
      'operator' => 'NOT IN'
    )));
  
  }

  remove_action( 'pre_get_posts', 'custom_pre_get_posts_query' );

}


As ‘knives’ is an example in the snippet below, be sure to use a product category slug that exists in your WooCommerce store.

Note that this will only work when you have your “Shop Page Display” option set to ‘Show Products’ under WooCommerce > Settings > Products > Display.

You will need to put this code in your theme’s functions.php file.