04 自定义文章类型与分类法

整理 CPT、taxonomy、rewrite、归档页和后台菜单场景。

04 自定义文章类型与分类法

本页关键词

register_post_type register_taxonomy rewrite archive CPT

学习目标

代码使用提醒

本页代码适合用于学习和研究。复制到正式网站前,请先备份,并优先在测试环境验证。

涉及用户输入、后台保存、接口请求、删除操作和邮件发送时,要同时考虑权限、nonce、sanitize、validate 和 escape。

1. 注册 Projects 自定义文章类型

基础
<?php function mysite_register_project_cpt() { register_post_type( 'project', array( 'labels' => array( 'name' => 'Projects', 'singular_name' => 'Project', ), 'public' => true, 'has_archive' => true, 'menu_icon' => 'dashicons-portfolio', 'show_in_rest' => true, 'rewrite' => array( 'slug' => 'projects' ), 'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt' ), ) ); } add_action( 'init', 'mysite_register_project_cpt' );
CPT 适合管理案例、项目、产品资料、团队成员等独立内容。

2. 给 CPT 注册分类法

基础
<?php function mysite_register_project_taxonomy() { register_taxonomy( 'project_type', array( 'project' ), array( 'labels' => array( 'name' => 'Project Types', ), 'public' => true, 'hierarchical' => true, 'show_in_rest' => true, 'rewrite' => array( 'slug' => 'project-type' ), ) ); } add_action( 'init', 'mysite_register_project_taxonomy' );
hierarchical=true 更像分类;false 更像标签。

3. 查询 CPT 列表

实用
<?php $projects = new WP_Query( array( 'post_type' => 'project', 'posts_per_page' => 6, ) ); if ( $projects->have_posts() ) { while ( $projects->have_posts() ) { $projects->the_post(); the_title( '<h3>', '</h3>' ); } wp_reset_postdata(); }
CPT 查询和普通文章查询类似,关键是 post_type。

4. 按自定义分类法查询 CPT

实用
<?php $decking_projects = new WP_Query( array( 'post_type' => 'project', 'tax_query' => array( array( 'taxonomy' => 'project_type', 'field' => 'slug', 'terms' => 'decking', ), ), ) );
tax_query 是项目筛选、案例分类、产品属性筛选的基础。

5. 启用/停用插件时刷新 rewrite

维护
<?php function mysite_project_plugin_activate() { mysite_register_project_cpt(); mysite_register_project_taxonomy(); flush_rewrite_rules(); } register_activation_hook( __FILE__, 'mysite_project_plugin_activate' ); function mysite_project_plugin_deactivate() { flush_rewrite_rules(); } register_deactivation_hook( __FILE__, 'mysite_project_plugin_deactivate' );
不要每次 init 都 flush_rewrite_rules,会影响性能。

6. 给 CPT 后台列表增加缩略图列

后台
<?php function mysite_project_columns( $columns ) { $columns['thumbnail'] = '缩略图'; return $columns; } add_filter( 'manage_project_posts_columns', 'mysite_project_columns' ); function mysite_project_column_content( $column, $post_id ) { if ( 'thumbnail' === $column ) { echo get_the_post_thumbnail( $post_id, array( 80, 80 ) ); } } add_action( 'manage_project_posts_custom_column', 'mysite_project_column_content', 10, 2 );
后台列表列可以提升内容维护效率。

本页总结

CPT + taxonomy 是 WordPress 内容建模的核心能力。案例、项目、团队、资料库等都可以用这套思路管理。