Могу привести часть кода как это реализовано у меня, но тут у меня тема Genesis и код соответственно специфический. Но возможно вы почерпнете какие-то идеи:
$tm_category = tm_get_category_by_url($_SERVER['REQUEST_URI']);
$include = $tm_category->cat_ID;
$exclude = genesis_get_option( 'blog_cat_exclude' ) ? explode( ',', str_replace( ' ', '', genesis_get_option( 'blog_cat_exclude' ) ) ) : '';
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
//* Easter Egg
$query_args = wp_parse_args(
genesis_get_custom_field( 'query_args' ),
array(
'cat' => $include,
'category__not_in' => $exclude,
'showposts' => genesis_get_option( 'blog_cat_num' ),
'paged' => $paged,
)
);
global $wp_query, $more;
$defaults = array(); //* For forward compatibility
$args = apply_filters( 'genesis_custom_loop_args', wp_parse_args( $query_args, $defaults ), $query_args, $defaults );
$wp_query = new WP_Query( $args );
//* Only set $more to 0 if we're on an archive
$more = is_singular() ? $more : 0;
if ( have_posts() ) :
do_action( 'genesis_before_while' );
while ( have_posts() ) : the_post();