EP028. “注册 Event 自定义文章类型(Must-Use Plugin)”
🔒 登录后可标记已读首页「Upcoming Events」区块目前只是写死的假 HTML,要让它变成真数据,第一步得先有一个能装「活动」的文章类型。这一讲注册了一个全新的自定义文章类型 event,让后台侧边栏出现「Events」菜单,可以像发文章一样新建活动。关键决定是:这段注册代码不写在主题的 functions.php 里,而是新建一个 must-use plugin(MU-plugin)文件来放,因为 CPT 注册代码一旦跟着主题走,换主题或停用插件时,之前建立的 event 内容会直接变成 invalid post type,虽然数据库里数据还在,但完全没法编辑访问。
涉及文件
wp-content/mu-plugins/university-post-types.php(新建)
代码实现
// wp-content/mu-plugins/university-post-types.php
<?php
function university_post_types() {
register_post_type('event', array(
'public' => true,
'labels' => array(
'name' => 'Events',
'add_new_item' => 'Add New Event',
'edit_item' => 'Edit Event',
'all_items' => 'All Events',
'singular_name' => 'Event'
),
'menu_icon' => 'dashicons-calendar'
));
}
add_action('init', 'university_post_types');
要点:
wp-content/mu-plugins/这个文件夹默认不存在,要自己手动新建。放进这个文件夹的任何 PHP 文件都会被 WordPress 自动加载,且不能被停用,正好用来放「不希望因为切换主题/停用插件而失去访问权限」的关键代码(比如 CPT 注册)。register_post_type()第一个参数是文章类型的 key(这里是event),第二个参数是描述这个文章类型的关联数组。public => true让这个文章类型对编辑者和访客可见。labels数组控制后台各处显示的文字:name(侧边栏菜单名)、add_new_item(新建按钮文字)、edit_item(编辑页标题)、all_items(列表页标题)、singular_name(单数形式,用在其他 WP 内部文案里)。menu_icon用的是 WordPress 内置 Dashicons 的类名(developer.wordpress.org上能查到所有图标代码),这里用了日历图标dashicons-calendar。
[截图:wp-admin 后台侧边栏新出现的"Events"菜单项(日历图标),点开是空的活动列表页]
Hook / Function 速查
| 名称 | 类型 | 用途 |
|---|---|---|
register_post_type($post_type, $args) | WP 内建 function | 注册一个新的自定义文章类型 |
init | WP hook | WordPress 初始化时触发,注册文章类型必须挂在这个 hook 上(不能用 after_setup_theme 或 wp_enqueue_scripts) |
MU-plugins(wp-content/mu-plugins/) | WordPress 机制(非函数) | 该文件夹内的 PHP 文件永远自动加载,无法停用,适合放 CPT 注册这类「内容依赖」的代码 |
常见坑
- 把 CPT 注册代码写在主题的
functions.php里:一旦切换到别的主题(或者以后改放普通插件、又被停用),后台侧边栏的 Events 菜单直接消失,/wp-admin/edit.php?post_type=event报Invalid post type,虽然已建的 event 文章数据还在数据库里,但站长完全没法再编辑或查看它们。这是这一讲特地做实验演示的坑。 - 忘记建
wp-content/mu-plugins/文件夹本身(不是只建文件),WordPress 才会去扫描加载里面的 PHP 文件。
延伸 / 后续讲座会用到
下一讲 EP029 会在这同一个文件里加一行 show_in_rest => true,让 event 文章类型支持新版 Block Editor。EP030 会继续给这个数组加 has_archive 和 rewrite 参数,让 event 有归档页和自定义 URL slug。
Sources
Udemy:
- Become a WordPress Developer: Unlocking Power With Code — Section 7, EP028