你还可以想到我列举之外的更多内容模型。而且我也想在以后学习更多关于论坛和票务系统的想法。这两个系统我已经实现并希望的得到一些反馈。 创建一个 post type
创建一个新的 post type 需要使用 register_post_type 函数来注册一下。需要在你主题的 functions.php 文件下调用该函数:
register_post_type( $post_type, $args );
$post_type 参数就是你自定义 post type 的名称,post type 可以自定义的功能非常多,所以这个函数里面的 $args 参数会很多。所以通常会用下面这种格式来注册:
这时候我们可以新建 movie 发表一篇电影类型的文章了。但是这样与文章类型基本相同,我们需要更多的自定义来完善我们的 movie 类型。 为 post type 添加分类功能
就电影来说,可以分为科幻、动作、战争等类别,那么我们就为自定义的 movie 添加分类功能,这样就可以编辑新分类以及归类我们的电影了。这个分类跟文章里面的分类性质是一样的。
添加分类功能需要使用函数 register_taxonomy,使用方法也很简单,跟注册 post type 函数类似,只不过多了一个参数用来指定对应的 post type :
这里我们添加两个分类作为演示。 为 post type 添加自定义 meta box
我们想要添加的电影类型不能仅仅只有正文内容,我们还需要额外添加一些 导演 之类的有关内容。那么就需要添加自定义 meta box,meta box 可以在文章发表页面中添加自定义的表单,编写文章的时候可以填写额外的信息然后在前端调用出来。
自定义 meta box 需要用到 add_meta_box 函数:
虽然最关键的函数就在最后一句,但是一定要注意安全的校验。把这些代码添加进 functions.php 文件之后,你的 meta box 就可以正常工作了。如果你需要更多表单,按照这个模式自定义表单结构,然后添加保存函数即可。
下面,我们迫不及待的添加两部电影《鱼与锅之战:宿命对决》 和 《鱼与锅之战:我爱水煮鱼》 内容如下:
添加完之后,我们可以看下所有电影:
列表空荡荡的,好难看,我可不可以加上导演字段?当然可以,使用 [manage $post type posts custom column](http://codex.wordpress.org/plugin_api/action_reference/manage_$post_type_posts_custom_column) 即可实现,我们添加:
add_action("manage_posts_custom_column", "movie_custom_columns");
add_filter("manage_edit-movie_columns", "movie_edit_columns");
function movie_custom_columns($column){
global $post;
switch ($column) {
case "movie_director":
echo get_post_meta( $post->id, '_movie_director', true );
break;
}
}
function movie_edit_columns($columns){
$columns['movie_director'] = '导演';
return $columns;
}
即添加了列导演字段,并从每篇文章中读取出来。这样我们的列表就变成了:
ok,我们的后端部分就这样愉快的完成了。打开生成好的链接看下,咦,not found?是这样的,如果你的网站设置了固定连接,当你新建了 post type 之后,你必须要在后台更新一下固定连接设置才行。找到后台固定连接,再点击一下下面的“保存设置”,之后就可以正常访问了。 展示 post type 的内容
单纯创建 post type 只是可以让你输入内容,没有什么意义,我们还需要在前台输出自定义 post type 的内容。
自定义 post type 的模板和样式
根据 wordpress 的模板调用规则 我们可以得知,我们只需要创建 archive-[post_type].php 和 single-[post_type].php 就可以实现该 post type 的列表自定义和文章自定义。当访问 post type,wordpress 会优先调用这些模板来渲染。
需要注意的是,你需要在注册 post type 的时候设置 'has_archive' => true 才会有列表。
现在我们就把主题里自带的 archive.php 和 single.php 文件复制一份命名为 archive-movie.php 和 single-movie.php,为了演示,这里我不做很多自定义,只是输出导演信息表示一下。
我们分别在 l.56 和 l.23 附近的合适位置输出 meta box 信息:
查询出来之后就跟常规的主循环一样了,自定输出结构即可。 在首页列表中显示自定义 post type 的内容
虽然我们自定义好了 post type 同时也编写了一些内容,但是在首页的列表里面并没有显示出来。自定义的 post type 的内容不会自动混入主循环里面。那如何让自定义 post type 的内容显示出来?
你需要使用 pre_get_posts 这个 action 来做一些处理:
在上面的 $query 变量里面设置的 post_type 数组就是要在主循环里面展示的内容,将你的自定义 post type 填写进去就可以在首页中显示出来了。 设置自定义 post type 的固定连接
创建一个新的 post type 有时候也是为了更方便做 seo,所以设置它的固定连接也非常重要。这里主要用到注册 post type 的参数数组里面的 rewrite 参数,常用以下几两项:
slug =》自定义固定连接结构别名,默认是使用 post type 名(例如本例的 movie),可以被翻译。一般来说 post type 名可能与实际需要的 url 不一样( post type 为 movie,但 url 可能需要 movies),就可使用该项自定义。
with_front =》 固定连接是否以根目录为基础路径。如果你在固定连接设置页面设置你的结构为 /archives/,那么你的 post type 生成的连接默认为 /archives/movie 如果设置该项为 false 即可去掉前面的 /archives/ 直接基于根路径生成固定连接。
大功告成,但这只是 post type 最基础的用法,post type 还有其他更高级的用法,更详细的参数配置还需要你去进一步挖掘来适应你网站的功能需求。