WordPress 用户内容类型的创建和应用

custom-post-type

在 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' );

创建用户内容类型建议使用插件的方式来实现。

发表评论

邮箱地址不会被公开。 必填项已用*标注