如何用单模板动态获取Portfolio自定义文章类型的指定分类文章?
解决方法:动态获取分类别名,用单一模板展示自定义文章类型的分类文章
很简单,我们可以利用WordPress内置的函数获取当前分类的别名(slug),然后动态传入查询参数里,这样就不用为每个分类单独创建模板了。下面分两种常见场景给出解决方案:
场景1:你的Portfolio使用WordPress默认分类(Category)
如果你的自定义文章类型portfolio关联的是WordPress默认的分类系统,那可以按以下步骤操作:
方法1:在模板中构建动态查询
比如你可以用category.php作为通用模板,在里面添加以下代码:
// 获取当前分类的对象 $current_category = get_queried_object(); // 提取分类别名 $current_cat_slug = $current_category->slug; // 构建动态查询参数 $args = array( 'post_type' => 'portfolio', 'posts_per_page' => -1, 'category_name' => $current_cat_slug // 动态传入当前分类别名 ); // 执行查询 $portfolio_query = new WP_Query( $args ); // 循环输出文章 if ( $portfolio_query->have_posts() ) : while ( $portfolio_query->have_posts() ) : $portfolio_query->the_post(); // 你的文章内容模板,比如标题、缩略图等 the_title( '<h2>', '</h2>' ); the_excerpt(); endwhile; wp_reset_postdata(); // 重置查询,避免后续逻辑出错 endif;
方法2:修改主查询(更推荐)
这种方法不用写自定义查询,直接让WordPress的主查询自动加载portfolio类型的文章,更符合WordPress的规范。在你的主题functions.php中添加以下代码:
function custom_portfolio_category_archive( $query ) { // 只在前台、主查询、分类归档页生效 if ( ! is_admin() && $query->is_main_query() && is_category() ) { $query->set( 'post_type', 'portfolio' ); // 替换为你的自定义文章类型 $query->set( 'posts_per_page', -1 ); // 显示所有文章 } } add_action( 'pre_get_posts', 'custom_portfolio_category_archive' );
之后你只需要用category.php模板,正常写主循环即可,它会自动显示当前分类下的所有Portfolio文章。
场景2:你的Portfolio使用自定义分类法(比如portfolio_category)
如果当初你给portfolio注册了专属的自定义分类法(比如叫portfolio_category),那需要用tax_query来替代category_name,具体操作如下:
方法1:模板中的动态查询
// 获取当前自定义分类的对象 $current_term = get_queried_object(); // 构建查询参数 $args = array( 'post_type' => 'portfolio', 'posts_per_page' => -1, 'tax_query' => array( array( 'taxonomy' => 'portfolio_category', // 替换为你的自定义分类法名称 'field' => 'slug', 'terms' => $current_term->slug // 动态传入当前分类别名 ) ) ); $portfolio_query = new WP_Query( $args ); // 循环输出(和上面逻辑一致) if ( $portfolio_query->have_posts() ) : while ( $portfolio_query->have_posts() ) : $portfolio_query->the_post(); the_title( '<h2>', '</h2>' ); the_excerpt(); endwhile; wp_reset_postdata(); endif;
方法2:修改主查询(推荐)
在functions.php中添加:
function custom_portfolio_taxonomy_archive( $query ) { // 只在前台、主查询、自定义分类归档页生效 if ( ! is_admin() && $query->is_main_query() && is_tax( 'portfolio_category' ) ) { $query->set( 'posts_per_page', -1 ); // 显示所有文章 // 因为当前已经是自定义分类归档,主查询默认会加载portfolio类型,所以不用额外设置post_type } } add_action( 'pre_get_posts', 'custom_portfolio_taxonomy_archive' );
然后用tax-portfolio_category.php作为通用模板即可,它会自动展示当前自定义分类下的所有Portfolio文章。
注意事项
- 如果你不确定自己用的是默认分类还是自定义分类法,可以去后台查看Portfolio文章的分类界面,或者查看主题/插件中注册自定义文章类型的代码,找到
taxonomies参数对应的名称。 - 记得在自定义查询循环结束后调用
wp_reset_postdata(),避免后续的查询逻辑出现冲突。
内容的提问来源于stack exchange,提问作者Golam Kibria
相关产品推荐
相关产品推荐

