Yuguo.us

Custom Post Types

Introduction

user

余果

全栈工程师,《Web全栈工程师的自我修养》作者。


Featured

back-end

Custom Post Types

Posted by 余果 on .

wordpress 3.0开始引入了一个新的特性叫做Custom Post Types。

在此功能出现之前我们要实现一些区别于“普通文章”的自定义文章的时候,往往需要用到Custom Fields。用户发表任何类型的“文章”——任何类型——都需要新建一个post,然后在Custom Fields中填入不同的名值对来进行自定义。这对用户不是很友好的一种方式。 今天介绍的Custom Post Types会在后台边栏生成一个开发者自定义的类型,同时还有自定义挂件哦~

1.什么是Custom Post Types

WordPress内置的两种文章类型:Post(文章)和 Page(页面),Post一般作为经常更新的文章使用(如博客日志),Page一般作为静态页面使用(如网站的关于和联系页面)。那么使用WordPress自定义文章类型就可以实现除Post、Page等以外的更多自定义文章类型,而且你可以设置各不同文章类型的诸多属性。

2.如何在主题中增加Custom Post Types

比如我们做一个行业年会网站,需要一种Post Type叫“事件”,比如演讲或者展会就可以在事件中发布,能包含时间、地点等信息。

add_action( ‘init’, ‘create_events’ );//让wp初始的时候调用事件create_events

function create_events() {//这就是creat_events,首先定义显示labels和需要支持什么,然后在register_post_type,大功告成

$labels = array(//$labels注册Custom Post Types的一些设定

‘name’ => _x(‘Events’, ‘post type general name’),//复数名字

‘singular_name’ => _x(‘Event’, ‘post type singular name’),//单数名字

‘add_new’ => _x(‘Add New’, ‘Event’),//新建条目的标签名

‘add_new_item’ => __(‘Add New Event’),//新建条目标签页的页名

‘edit_item’ => __(‘Edit Event’),//编辑条目的标签名

‘new_item’ => __(‘New Event’),

‘view_item’ => __(‘View Event’),

‘search_items’ => __(‘Search Events’),

‘not_found’ => __(‘No Events found’),

‘not_found_in_trash’ => __(‘No Events found in Trash’),

‘parent_item_colon’ => ”

);

$supports = array(‘title’, ‘editor’, ‘custom-fields’, ‘revisions’, ‘excerpt’);

//$supports数组告诉wordpress这个文章类型可以支持什么(比如文章摘要excerpt)

register_post_type( ‘event’,

array(

‘labels’ => $labels,

‘public’ => true,

‘supports’ => $supports

)

);

}

register_post_type来自定义文章类型的时候还能创造更多的自由选项,比如可以修改menu_position来改变这个新文章类型菜单的位置,甚至可以高于Posts哦。

3.增加Custom fields box

Fields在这里不是选项,而是输入区域。我们已经知道的输入区域有标题、正文、Excerpt、分类、tag等。

对于我们刚刚创建的event来说,这些输入区域是不够的。比如我们现在想在边栏加一个Custom fields box,叫link,如下图: 代码如下(同样是加在function.php中):

add_action("admin_init", "portfolio_meta_box");

function portfolio_meta_box(){

add_meta_box("projInfo-meta", "Project Options", "event_meta_options", "event", "side", "low");

}

function event_meta_options(){

global $post;

if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;

$custom = get_post_custom($post->ID);

$link = $custom["projLink"][0];

?>

<label>Link:</label><input name="projLink" value="<?php echo $link; ?>" />

<?php

}

首先我们通过wp钩子admin_init来调用我们自己的函数portfolio_meta_box() ,这样admin创建的时候就会创建这个box。portfolio_meta_box创建这个box的一些信息,主要来源于第三个参数event_meta_options,这是一个回调函数。

event_meta_options所做的就是创建一个表单,用来保存link值。

我们首先获取全局的$post数组,这样我们就可以获得当前编辑的文章的custom fields。下一行我们检查确保wordpress没有保存post或者custom fields,如果已经保存了,那就直接return出去。而如果没有保存,那么首先取得当前post的custom_field,然后创建一个表单元素。

你会注意到这个新的表单元素没有提交按钮,因为它作为一个表单被插入到整个文章的form中去了,保存或者发布的时候,会自动提交。

4.显示自定义文章类型

显示一个event是非常重要的一个环节,因为我们创建这个event就是希望它能以与众不同的方式来显示,而不是用默认post的方式。要完成这个任务,我们会创建一个新的模板文件。

默认使用的模板的single.php/page.php等。如果希望自定义模板,就要新建一个single-event.php来作为event的模板。这样wordpress就会自动调用这个文件来显示单event条目。wordpress总是会先寻找single-event.php来显示event,如果没有,就找single.php。

类似的,如果新增一个page-event.php,那么wordpress就会调用这个文件来显示event列表。

参考资料: http://www.shejibox.com/wordpress-custom-post-types/http://wp.tutsplus.com/tutorials/widgets/using-custom-post-types-to-create-a-killer-portfolio/

user

余果

https://yuguo.us

全栈工程师,《Web全栈工程师的自我修养》作者。