WordPress ACF:将指定模板页面用作CPT归档页面
解决Case Studies CPT归档页加载home.php的问题
嘿,我来帮你搞定这个棘手的模板层级冲突!你想用同名页面作为Case Studies的归档页,但因为设置了has_archive => false,导致请求归档路径时加载了home.php(你的新闻页面模板)。这里有几个靠谱的解决方案,你可以根据自己的需求选:
方法一:给Case Studies页面创建自定义模板(最推荐)
这个方法最直接,完全不需要修改CPT的注册设置,还能让你100%控制页面的ACF布局和CPT内容展示:
- 在你的主题文件夹里新建一个模板文件,命名为
page-case-studies.php - 在文件开头添加模板标识,让WordPress识别这是自定义页面模板:
<?php /* Template Name: Case Studies Archive */ ?>
- 接下来,在模板里先渲染你用ACF创建的主页面区域和侧边栏灵活布局,再添加CPT的查询代码。示例代码大概是这样的:
<?php /* Template Name: Case Studies Archive */ get_header(); // 渲染主页面区域的ACF灵活布局(替换成你实际的字段名) if( have_rows('main_content') ): while( have_rows('main_content') ): the_row(); // 根据你定义的布局类型渲染内容,比如Hero模块、文本模块等 if( get_row_layout() === 'hero_section' ): // 在这里输出Hero模块的HTML和字段内容 echo '<h1>' . get_sub_field('hero_title') . '</h1>'; endif; // 其他布局模块同理处理 endwhile; endif; // 查询所有Case Studies CPT内容 $case_studies_args = array( 'post_type' => 'case-studies', 'posts_per_page' => 10, // 按需调整每页显示数量 'orderby' => 'date', 'order' => 'DESC' ); $case_studies_query = new WP_Query( $case_studies_args ); // 输出CPT列表 if( $case_studies_query->have_posts() ): echo '<div class="case-studies-list">'; while( $case_studies_query->have_posts() ): $case_studies_query->the_post(); // 用模板片段渲染单个案例研究(或者直接输出内容) get_template_part( 'template-parts/content', 'case-study' ); endwhile; // 分页导航 the_posts_navigation( array( 'total' => $case_studies_query->max_num_pages ) ); echo '</div>'; // 重置查询,避免影响后续内容 wp_reset_postdata(); endif; // 渲染侧边栏区域的ACF灵活布局 if( have_rows('sidebar_content') ): while( have_rows('sidebar_content') ): the_row(); // 渲染侧边栏对应的模块 if( get_row_layout() === 'sidebar_widget' ): echo '<div class="sidebar-widget">' . get_sub_field('widget_content') . '</div>'; endif; endwhile; endif; get_footer();
- 回到WordPress后台,编辑你的Case Studies页面,在右侧“页面属性”里选择刚才创建的
Case Studies Archive模板,更新页面。
现在访问你的Case Studies页面(或归档路径yoursite.com/case-studies/),就会加载这个自定义模板,既显示你的ACF布局,又列出所有Case Studies内容,而且不会再调用home.php了。
方法二:用过滤器强制归档请求加载页面模板
如果你不想单独写模板,也可以通过template_include过滤器,让Case Studies的归档请求直接加载你的page-case-studies.php:
在主题的functions.php里添加这段代码:
function override_case_studies_archive_template( $template ) { // 检查当前请求是否是Case Studies的归档页 if ( is_post_type_archive( 'case-studies' ) ) { // 尝试找到page-case-studies.php模板 $custom_template = locate_template( array( 'page-case-studies.php' ) ); if ( $custom_template ) { return $custom_template; } } return $template; } add_filter( 'template_include', 'override_case_studies_archive_template' );
这样当用户访问归档路径时,WordPress会优先加载你的页面模板,而不是home.php。你只需要确保page-case-studies.php里有查询CPT内容的代码就行。
方法三:开启归档并自定义归档模板
如果你愿意修改CPT的注册设置,可以把'has_archive' => false改成'has_archive' => true,然后创建专门的归档模板:
- 修改CPT注册代码,启用归档:
register_post_type( 'case-studies', array( // 其他设置... 'has_archive' => true, // 其他设置... ) );
- 在主题文件夹里新建
archive-case-studies.php模板文件,在里面调用Case Studies页面的ACF字段并渲染归档内容:
<?php get_header(); // 获取Case Studies页面的ID(根据slug获取) $case_studies_page_id = get_page_by_path( 'case-studies' )->ID; // 渲染页面的ACF主区域布局 if( have_rows('main_content', $case_studies_page_id) ): while( have_rows('main_content', $case_studies_page_id) ): the_row(); // 渲染对应模块 endwhile; endif; // 默认的归档查询(自动针对case-studies CPT) if( have_posts() ): echo '<div class="case-studies-archive">'; while( have_posts() ): the_post(); get_template_part( 'template-parts/content', 'case-study' ); endwhile; the_posts_navigation(); echo '</div>'; endif; // 渲染页面的ACF侧边栏布局 if( have_rows('sidebar_content', $case_studies_page_id) ): while( have_rows('sidebar_content', $case_studies_page_id) ): the_row(); // 渲染对应模块 endwhile; endif; get_footer();
这个方法的好处是利用WordPress原生的归档机制,不需要手动写WP_Query,但需要修改CPT的设置。
内容的提问来源于stack exchange,提问作者M. Ferguson
相关产品推荐
相关产品推荐

