WP DEVELOP

EP028. “注册 Event 自定义文章类型(Must-Use Plugin)”

首页 WordPress 开发课程 CUSTOM POST TYPE 入门 · EP028
约 7 分钟· #EP028#CUSTOM POST TYPE 入门
🔒 登录后可标记已读

首页「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注册一个新的自定义文章类型
initWP hookWordPress 初始化时触发,注册文章类型必须挂在这个 hook 上(不能用 after_setup_themewp_enqueue_scripts
MU-plugins(wp-content/mu-plugins/WordPress 机制(非函数)该文件夹内的 PHP 文件永远自动加载,无法停用,适合放 CPT 注册这类「内容依赖」的代码

常见坑

  • 把 CPT 注册代码写在主题的 functions.php 里:一旦切换到别的主题(或者以后改放普通插件、又被停用),后台侧边栏的 Events 菜单直接消失,/wp-admin/edit.php?post_type=eventInvalid post type,虽然已建的 event 文章数据还在数据库里,但站长完全没法再编辑或查看它们。这是这一讲特地做实验演示的坑。
  • 忘记建 wp-content/mu-plugins/ 文件夹本身(不是只建文件),WordPress 才会去扫描加载里面的 PHP 文件。

延伸 / 后续讲座会用到

下一讲 EP029 会在这同一个文件里加一行 show_in_rest => true,让 event 文章类型支持新版 Block Editor。EP030 会继续给这个数组加 has_archiverewrite 参数,让 event 有归档页和自定义 URL slug。

Sources

Udemy:

  • Become a WordPress Developer: Unlocking Power With Code — Section 7, EP028