钉子の次元

Dimpurr – an artist, designer and developer from China.

为 WordPress 主题添加文章形式支持和注册自定义类型

WordPress 3.1 之后,推出了一个模仿 Tumblr 的「文章形式」功能,可以让博客中除了默认的文章之外展现出更多的特殊样式。不同的文章形式,可以支持在输出时进行判断处理,以及列出存档等等……很多细心的主题里面都会加上对一些文章形式的支持,如果在面临特殊需求时,希望能够自定义专门的编辑器或者分类目录,那么还可以去注册一个自定义的文章类型。

一 内置形式

WordPress 已经内置对几种常用的文章形式的支持,如果可以满足需要,那么就不需要再重复造轮子了,只需要添加主题对已有形式的支持就好了。内置形式列表如下:

  • standard – 标准,也就是默认的文章形式
  • aisde – 日志,实质上就是个不显示标题的标准文章
  • link – 链接,类似 Tumblr 的链接分享
  • quote – 引语,展示为引用的一段文字
  • status – 状态,简而言之就像是一条 Tweet
  • image – 图像,发布单张图片
  • gallery – 相册,也就是扩充的图像功能
  • audio – 音频,……需要说吗
  • video – 视频,……同上
  • chat – 聊天,以专门格式显示聊天记录

如果想添加对以上形式的支持,只需要在 functions.php 里添加对应的项目即可,然后在输出文章的时候使用函数判断切换不同的样式:

// 添加对文章样式的支持,在数组中增加以上列表的类型别名即可
add_theme_support( 'post-formats', array( 'status', 'chat' ) );

// 在输出文章时,增加一个判断语句来使用不同的输出格式
// has_post_format() 函数返回判断是否是该形式的布尔值
if ( has_post_format( 'chat' )) { echo 'orzFly 22:27:28: 我勒个去我说好像在哪儿听说过三三。。'; }
// get_post_format() 函数返回文章形式的别名
if ( get_post_format() == 'status' ) { echo '不愉快です。'; }
// 还可以利用 post_class() 函数给每个形式输出专有类的功能,在HTML结构差异不大无需更改的情况下使用
<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

二 注册自定义类型

如果以上自带的函数无法满足贪得无厌的你的需求,除了自定义栏目以外,还可以来定制一个属于自己的文章类型。示例如下:

function custom_format() {
// 文章形式设置
	$args = array(
		'public'	=> true,
		'label'		=> '时间轴'
	);
// 注册文章形式函数,需要别名和设置数组两个参数
	register_post_type( 'timeline', $args );
}
// 添加注册动作
add_action( 'init', 'custom_format' );

至于设置的内容,这个就多了。常用的设置属性如下,是否开头的项值都是 true 或者 false:

  • label – 标签,也就是文章形式的显示名称
  • labels – 实际上是重命名编辑器对于该文章形式显示的界面提示文字内容,例如菜单名称或者文章保存之后的提示信息。需要传送一个数组,贴心的你一定会挨个自定义一遍,是吧……包括的数组值 id 如下:
    • name
    • singular_name
    • menu_name
    • all_items
    • add_new
    • add_new_item
    • edit_item
    • new_item
    • view_item
    • search_items
    • not_found
    • not_found_in_trash
    • parent_item_colon
  • description – 对文章类型的描述
  • public – 是否默认公开,或者只在后台显示
  • exclude_from_search – 是否从搜索中排除
  • publicly_queryable – 是否可以使用 parse_request() 在前端公开查询
  • show_ui – 是否在后台显示默认的管理界面
  • show_in_nav_menus – 是否显示在菜单管理的添加提示里
  • show_in_menu – 是否在开启 show_ui 的情况下在管理菜单中显示
  • show_in_admin_bar – 是否在 Admin Bar 的新文章菜单中显示,默认同上值
  • menu_position – 在管理菜单中显示的位置,使用数字指定。放上几个常用的值参考:
    • 5 > n – 整个菜单的顶部
    • 10 > n > 5 – 在文章和媒体菜单之间
    • n > 25 – 在评论菜单之后
    • n > 60 – 在第一个分隔符后
    • 100 > n > 80 – 在设置菜单之后
    • n > 100 – 在第二个分隔符后
  • menu_icon – 菜单的图标,不指定使用一个齿轮的默认图标
  • capability_type – 编辑模式,可以指定如下值:
    • post – 文章,默认的文章编辑器
    • page – 页面
    • attachment – 附件
    • mediapage – 媒体页面
  • capabilities – 最强大也是最复杂编辑器设置。传入的值是一个数组,一般来说就用到其中的七个数组,也可以用到扩展的更多项,对其设置可以完全自定义其编辑页面:
    • edit_post, read_post, delete_post – 编辑,读取,删除操作
    • edit_posts – 文章编辑器
    • edit_others_posts – 编辑非用户所有的文章时的编辑器
    • publish_posts – 文章公共项目的管理
    • read_private_posts – 可以被读取的私有项目
    • 非核心的扩展项目不再叙述。
    • 一个示例如下,注意一些值上面需要在末尾添加「s」,具体的定义已经是非常高级的应用,这里也不叙述了:
      [cap] => stdClass Object (
      	[edit_post]		 => "edit_{$capability_type}"
      	[read_post]		 => "read_{$capability_type}"
      	[delete_post]		 => "delete_{$capability_type}"
      	[edit_posts]		 => "edit_{$capability_type}s"
      	[edit_others_posts]	 => "edit_others_{$capability_type}s"
      	[publish_posts]		 => "publish_{$capability_type}s"
      	[read_private_posts]	 => "read_private_{$capability_type}s"
              [delete_posts]           => "delete_{$capability_type}s"
              [delete_published_posts] => "delete_published_{$capability_type}s"
              [edit_private_posts]     => "edit_private_{$capability_type}s"
      )
  • map_meta_cap – 是否使用内置的 meta 映射
  • hierarchical – 是否支持排序,类似于页面的排序值功能。因为需要将所有条目取出进行计算顺序,假如应用了排序文章太多可能导致性能问题
  • supports – 最常用的支持设置,可以定义支持编辑器的哪些项目。值如下:
    • title – 标题
    • editor – 富文本编辑器
    • author – 选择作者
    • thumbnail – 特色图像,也就是缩略图
    • excerpt – 摘要
    • trackbacks – Trackback 引用支持
    • custom-fields – 自定义栏目
    • comments – 评论
    • revisions – 修订记录
    • page-attributes – 页面层级 类似页面编辑中的父页面
    • post-formats – 文章形式选择
  • register_meta_box_cb – 是否建立 meta box 的回调函数
  • taxonomies – 文章形式的分类法,需要和 register_taxonomy() 函数配合使用
  • has_archive – 是否拥有该分类目录的存档页面
  • permalink_epmask – 是否重新端点的位掩码,抱歉我没看懂这个……
  • rewrite – 地址重写设置,需要传入数组。值如下:
    • slug – 重写中的目录别名,效果大概是 /post-slug/1 这样
    • with_front – 是否在链接前遵循其他的前缀,还是直接在根域名重写
    • feeds – 是否在文章 feed 流中显示
    • pages – 是否提供分页
  • query_var – 自定义查询值,比如文章查询值是 /?p=[POST_ID] ,可以给文章类型自定义一个查询别名或者 false 沿用默认
  • can_export – 是否支持导出功能
  1. xloger说道:

    Orz终于明白那些形式是干啥的了…..【虽然还是有点懵…

  2. Thiece说道:

    感觉太高深,看的云里雾里

  3. ddcat说道:

    请问,想在编辑页面显示 tags 的话,怎么设定呢?

  4. 小二苘说道:

    很高大上,正在捣鼓这个

  5. 虎客说道:

    非常不错,有用

  6. Aaron说道:

    13年的文章到现在还是很有用,谢了。