如何选择WordPress页面作为custom post type归档页
自定义文章类型绑定静态页面作为归档页实现方案
实现逻辑概述
核心是通过3个部分实现类似WooCommerce的页面绑定功能:后台新增设置项选择对应页面、替换CPT默认归档链接指向选中页面、自定义页面访问时的模板和查询逻辑。
步骤1:新增后台设置字段
在WordPress默认的「设置-阅读」页面新增CPT归档页选择下拉框,代码如下:
add_action('admin_init', 'register_cpt_archive_page_setting'); function register_cpt_archive_page_setting() { // 替换为自己的自定义文章类型slug $target_cpt = 'book'; // 新增设置分区 add_settings_section( 'cpt_archive_setting_section', '自定义文章类型归档页配置', '__return_empty_string', 'reading' ); // 新增设置字段 add_settings_field( "{$target_cpt}_archive_page_id", '文章类型归档页', function($args) { $cpt = $args['cpt']; $selected = get_option("{$cpt}_archive_page_id", 0); wp_dropdown_pages([ 'name' => "{$cpt}_archive_page_id", 'selected' => $selected, 'show_option_none' => '不绑定', 'option_none_value' => 0 ]); }, 'reading', 'cpt_archive_setting_section', ['cpt' => $target_cpt] ); // 注册设置项 register_setting('reading', "{$target_cpt}_archive_page_id"); }
添加完成后你可以在「设置-阅读」页面看到对应下拉框,选择你提前用自定义模板创建的页面即可。
步骤2:替换CPT默认归档链接
将代码中CPT默认的归档链接替换为你绑定的静态页面链接:
add_filter('post_type_archive_link', 'modify_cpt_archive_link', 10, 2); function modify_cpt_archive_link($original_link, $post_type) { $target_cpt = 'book'; // 替换为自己的CPT slug if ($post_type !== $target_cpt) return $original_link; $bind_page_id = get_option("{$target_cpt}_archive_page_id"); if ($bind_page_id) { return get_permalink($bind_page_id); } return $original_link; }
修改完成后,导航菜单里的CPT归档项、调用get_post_type_archive_link()函数返回的链接都会自动指向你绑定的页面。
步骤3:自定义页面的模板与查询逻辑
访问绑定的静态页面时,自动加载你需要的归档模板,也可以选择修改主查询直接输出对应CPT的文章:
add_action('template_redirect', 'handle_cpt_archive_page_logic'); function handle_cpt_archive_page_logic() { $target_cpt = 'book'; // 替换为自己的CPT slug $bind_page_id = get_option("{$target_cpt}_archive_page_id"); // 仅对绑定的页面生效 if (!$bind_page_id || !is_page($bind_page_id) || !is_main_query()) { return; } // 自定义模板加载,替换为你自己的模板文件名 add_filter('template_include', function($default_template) { $custom_tpl = locate_template('cpt-archive-custom.php'); return $custom_tpl ? $custom_tpl : $default_template; }); // 可选:修改主查询,直接返回对应CPT的文章,不需要在模板里手动写查询 global $wp_query; $wp_query->set('post_type', $target_cpt); $wp_query->set('posts_per_page', get_option('posts_per_page')); // 可以在此处添加更多查询参数,比如自定义排序规则等 }
注意事项
- 所有代码可直接放入主题
functions.php文件,或单独封装为自定义插件 - 代码中的
book需替换为你自己的自定义文章类型slug,cpt-archive-custom.php替换为你实际的模板文件名 - 若不需要修改主查询,直接删除第三步中修改
$wp_query的代码即可,可在自定义模板中自己实现查询逻辑 - 如需支持多个自定义文章类型,可将代码中单个slug的判断改为数组遍历,批量注册设置项即可
内容的提问来源于stack exchange,提问作者Mohamed Hamad
相关产品推荐
相关产品推荐

