WordPress 用户内容类型的创建和应用
在 WordPress 中,内容类型其实就是所创建内容的类型,比如 WordPress 提供了五个缺省的内容类型,即 post(文章)、page(页面)、revision (修订)、menu (菜单)、attachment(附件)。我们在创建内容的时候,基础的内容类型基本上可以满足大部分内容管理的需求。那么什么时候需要创建自己的内容类型呢,我的理解就是当需要细分、细化内容管理的时候就可以使用客户化的内容类型,比如产品、课程、食谱、影评等类型。
创建用户内容类型首先就是要进行注册,使用函数 register_post_type() 来注册。下面以课程为例介绍内容类型的创建方法:
function custom_content_type()
{
register_post_type('my_course', //名字要唯一
array(
'labels' => array(
'name' => __('Courses'),
'singular_name' => __('Course'),
),
'exclude_from_search' => true, //是否包含在搜索结果中
'menu_position' => null, //后台管理界面菜单的位置
'menu_icon' => 'dashicons-media-video', //菜单图标
'public' => true,
'has_archive' => true,
'rewrite' => array( 'slug' => 'courses' ), // 课程 slug
'capability_type' => 'post', //基本的权限,如读、修改、删除内容
'supports' => array( 'title', 'editor'), //只有标题和内容
'taxonomies' => array( 'post_tag' ), //使用系统的“标签”分类
'show_in_rest' => true, //使用所见即所得编辑器
)
);
}
add_action('init', 'custom_content_type');
上面的代码中,rewrite 定义了课程内容所使用的 URL 地址结构,如下所示:
https://www.example.com/courses
注册成功后,在后台管理员界面可以看到 “Courses” 子菜单,使用该菜单的功能就可以创建、修改和删除课程这个类型的内容了。查询课程可以使用下面的代码:
$args = [
'post_type' => 'my_course',
'posts_per_page' => 10,
];
$courses = new WP_Query($args);
while ($courses->have_posts()) {
$courses->the_post();
?>
<div class="courses-content">
<?php the_title(); ?>
<?php the_content(); ?>
</div>
<?php
}
显示课程有两种方式,一种是使用 WordPress 提供的标准显示模板 archive.php(课程列表)、single.php(课程内容)。另外就是创建自己的课程显示模板,需要注意的是模板文件名要按照规则来起名字:
single-{post_type}.php:用于单一内容显示,如 single-my_course.php
archive-{post_type}.php:用于列表内容显示,如 archive-my_course .php
另外,如果要把课程内容和其它文章内容一起显示出来,可以使用下面的钩链完成:
function add_course_post_types($query)
{
if (is_home() && $query->is_main_query()) {
$query->set('post_type', ['post', 'page', 'my_course']);
}
return $query;
}
add_action('pre_get_posts', 'add_course_post_types');
最后,用户内容类型创建完成后,要显示出来,还需要刷新 Rewrite 规则,方法是到管理员界面的 “设置->固定链接” 菜单里点击 “保存更改” 按钮。
如果是在插件里面注册的用户内容类型,也可以通过在插件激活时调用的 “钩链” 函数 “register_activation_hook” 中调用函数 “flush_rewrite_rules()” 来实现同样的效果:
function course_rewrite_flush() {
custom_content_type();
flush_rewrite_rules();
}
register_activation_hook( __FILE__, 'course_rewrite_flush' );
如果是在主题的 functions.php 函数中注册的用户内容类型,则可以用下面的代码完成 Rewrite 规则的刷新:
function course_rewrite_flush() {
custom_content_type();
flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'course_rewrite_flush' );
创建用户内容类型建议使用插件的方式来实现。