Try this code:
add_filter( 'query_vars', 'my_query_vars' );
function my_query_vars( $vars ) {
$vars[] = 'catname';
return $vars;
}
add_action( 'generate_rewrite_rules', 'my_rewrite_rules' );
function my_rewrite_rules( $wp_rewrite )
{
$products_page_id = 1; //your product's page ID
$wp_rewrite->rules = array(
'products/?([0-9]{1,})/?$' => $wp_rewrite->index . '?page_id='.$products_page_id.'&paged=' . $wp_rewrite->preg_index( 1 ),
'products/(.+?)/?([0-9]{1,})/?$' => $wp_rewrite->index . '?page_id='.$products_page_id.'&catname=".$wp_rewrite->preg_index( 1 )."&paged=' . $wp_rewrite->preg_index( 2 ),
'products/(.+?)/?$' => $wp_rewrite->index . '?page_id='.$products_page_id.'&catname=".$wp_rewrite->preg_index( 1 ),
) + $wp_rewrite->rules;
}
You”ll get cat_name than as get_query_var('catname');
and paged as get_query_var('paged');
To little explain the code above: this adds rewrite rules to WordPress, when each request to www.yourdomain.com/products/ get rewrote to (means brings content from) www.yourdomain.com/index.php?page_id={$products_page_id}&paged=2 (for example).
$producst_page_id is a ID of your products page in administration with your shorcode – thus page which content should appear. paged is a parameter for you to be able to get another page of your products. catname is another param for you to, filter returned products by category.