wordpress进阶教程(二):注册一个自定义的文章类型

为什么要给wordpress注册默认文章之外的自定义的文章类型?比如本站,“教程”是按一般的博客文章形式来显示的,但是还有个“主题类”的文章,得用另一种显示形式,这样用普通的方法恐怕很难实现,所以需要另外注册一种文章类型,wp对每种文章类型可以用单独的模板来显示,这样就可以很方便实现我们要的效果了。

不过自定义文章类型的实际用途不仅仅局限于此,比如我就看到过有专门注册一个自定义文章类型只是用来给主题首页一个图片切换banner添加图片等设置信息的。。

看了前一篇文章,我想创建一个自定义文章类型(custom post type)使用的函数已经很明了了。

  1. <?php   
  2. register_post_type( $post_type$args );   
  3. //$post_type-必需,文章类型的名称   
  4. //args-可选,一个配置数组   
  5. ?>  

对于args数组,比较重要,参数比较多,详细说明如下:

label - (字符串,可选,不重要)默认和$post_type一样
labels - (数组,可选) 用来配置文章类型显示在后台的一些描述性文字。默认为空。

  • 'name' - 文章类型的名称,这个可以用中文(一般为复数,对于中文而言就无复数之说了)。
  • 'singular_name'-单篇文章对象的名称,(对于英文而言就是name的单数),默认为name的值
  • 'add_new'-对应于默认文章类型中的“写文章”
  • 'add_new_item'-
  • 'edit_item'-编辑
  • 'new_item'
  • 'view_item'
  • 'search_items'
  • 'not_found'
  • 'not_found_in_trash'
  • 'parent_item_colon'
  • 'menu_name'

description-一些简短的介绍文字

public-(布尔值),用于定义publicly_queriable, show_ui, show_in_nav_menus and exclude_from_search的值

publicly_queryable- (布尔值)可以从前台获取的变量(从url中,比如url重写)

exclude_from_search - (布尔值),是否能够被搜索到

show_ui -  (布尔值)是否生成一个默认的管理页面,也就是是否在后台有管理页面。默认跟public的是一样

show_in_menu -  是否在后台菜单项中显示,如果为ture,那么show_ui的值也必须设置为true,将会有一个顶级菜单项。还可以为一个字符串,类似'tools.php' 或者'edit.php?post_type=page'

menu_position - 在后台菜单中的位置。

menu_icon - 菜单的icon图标(一个url)。

capability_type - 查看、编辑、删除的能力类型(capability),默认为post

capabilities - (数组,一般人用不到)

map_meta_cap - (布尔值),只有设置了capabilities才用的上

hierarchical - (布尔值),文章是否有层级关系,也就是是否允许有父级文章。

supports - (数组),对文章类型的一些功能支持

  • 'title'-标题
  • 'editor' (content) - 内容编辑器
  • 'author' - 作者
  • 'thumbnail' - 特色图像,主题还得支持特色图像才行
  • 'excerpt' - 摘要
  • 'trackbacks'
  • 'custom-fields'-自定义字段
  • 'comments' - 评论
  • 'revisions' - 修订版
  • 'page-attributes' - 页面属性,类似page,选择页面模板的那个

register_meta_box_cb - 当执行remove_meta_box() 和add_meta_box()时调用的函数

taxonomies - 添加已经注册了的分类法(比如默认的分类、标签)

permalink_epmask

has_archive - 文章是否有归档,就是一个所有文章归档页面。

rewrite - (布尔值或者数组),是否有url重写,设置为false的话将会防止url重写,关于重写以后教程详细讲解。

query_var - url重写会用到

can_export - 是否输出

show_in_nav_menus - 是否出现在设置菜单页面的选项中

_builtin - wordpress开发人员建议你不要使用这个参数哦。

_edit_link -  wordpress开发人员建议你不要使用这个参数哦

说实话,上面参数这样列出来,我自己看了都不能很清楚的说明每个参数具体效果是什么,那么下面通过一个简单的实例来使用说明一下上面部分参数的实际效果,我们还是使用wordpress的默认主题,twentyten来测试,在twentyten主题文件夹下新建一个post-type.php文件,然后在functions.php文件的最后面添加代码:

  1. include_once('post-type.php');  

在post-type.php中我们就可以添加注册文章类型的代码了,post-type.php中添加如下代码:

  1. <?php   
  2. add_action('init', 'my_custom_init');   
  3. function my_custom_init()    
  4. {   
  5.   $labels = array(   
  6.     'name' => '书本name',   
  7.     'singular_name' => '书本singularname',   
  8.     'add_new' => 'Add_new',   
  9.     'add_new_item' => 'add_new_item',   
  10.     'edit_item' => 'edit_item',   
  11.     'new_item' => 'new_item',   
  12.     'view_item' => 'view_item',   
  13.     'search_items' => 'search_items',   
  14.     'not_found' =>  'not_found',   
  15.     'not_found_in_trash' => 'not_found_in_trash',    
  16.     'parent_item_colon' => '',   
  17.     'menu_name' => 'menu_name'   
  18.   
  19.   );   
  20.   $args = array(   
  21.     'labels' => $labels,   
  22.     'public' => true,   
  23.     'publicly_queryable' => true,   
  24.     'show_ui' => true,    
  25.     'show_in_menu' => true,    
  26.     'query_var' => true,   
  27.     'rewrite' => true,   
  28.     'capability_type' => 'post',   
  29.     'has_archive' => true,    
  30.     'hierarchical' => false,   
  31.     'menu_position' => null,   
  32.     'supports' => array('title','editor','author','thumbnail','excerpt','comments')   
  33.   );    
  34.   register_post_type('book',$args);   
  35. }   
  36. ?>  

添加上面的代码后,进入后台,部分效果如图:

添加自定义文章类型

 限于篇幅,这篇文章就到这里了。。敬请关注接下来的教程。。

本篇教程之前的几篇教程是

本篇教程之后的几篇教程是

没有找到你要找的内容?你可以通过搜索你要找的内容,或者给我们留言。

已有31条评论

  1. 海绵宝宝
    海绵宝宝 : 回复

    阿树大哥呀,最近是不是都没有更新呢,我要在后台添加一个新的分类,但是那些样式那些东西没法移动过来,需要在哪个文件里的东西移动固有过来呢

    • 阿树工作室
      阿树工作室 回复海绵宝宝: 回复

      新建的分类要新建模板才能用

  2. alex
    alex : 回复

    请教阿树啊~
    我自定义了一个文章类型 book,里面有 wordpress 自带的默认分类目录和标签,我就在写文章时用了自带的分类和标签,但是在 域名/category 页面显示的列表中只有 wordpress 默认的 Post 文章有显示出来,我自定义的 book 文章在 category 列表中不能显示出来;tag也是这种情况。请问这种情况问题出在哪儿?有办法解决吗?我查看了n篇教程也没找到方法,本人水平低,望赐教!!

  3. 唐山seo
    唐山seo : 回复

    你好,请问怎么给自定义文章类型添加到分类目录?我试了试在首页不显示,url地址是中文的等等吧……….

  4. xxgg
    xxgg : 回复

    请问 hierarchical 参数真是层级关系用的吗?好像文章类型不存在父级关系 , 把它设为true没什么作用啊,求解

    • xxgg
      xxgg 回复xxgg: 回复

      浪费了一天时间自己解决了,原来我是新建的第一篇文章,才不显示父级 ,我的青春啊

  5. 李惟
    李惟 : 回复

    阿树你好,我想问下如果我需要修改目前已存在的文章类型怎么做。比如我需要给默认的“文章”增加一个名字叫“书签”的分类,怎么做呢?

  6. xiaokan
    xiaokan : 回复
    query_posts函数的 post_type 似乎只能查询post page 自定义 其他类型不支持么 比如附件 ?
  7. 琳小幽
    琳小幽 : 回复

    如果其他主题  应该怎么找对应的php文件呢?例如:functions.php 这个文件 不是在每个主题文件里都有的  这该怎么办呢?求解

  8. xiaoka
    xiaoka : 回复

    有2个问题

    1.创了一个product的文章类型,这么在首页或者其他地方显示?

    2.在product创建一篇文章后,文章的url是xxxx.com/?product=中文标题 ,这个怎么让他和普通的post文章一样?谢谢

    • 阿树工作室
      阿树工作室 回复xiaoka: 回复

      调用自定义文章类型,使用query_posts等函数,有一个post_type参数。

      固定连接,请下载插件

  9. 啊喵
    啊喵 : 回复

    请问一下,如何在首页调用自定义文章类型里的分类文章呢?

    比如上面例子中,书本这个自定义文章类型,里面有一个古典书籍的分类,然后首页如何调用古典书籍的最新5篇文章呢?

    我用了如下的代码,古典书籍的分类是12,但是首页就是不显示。希望阿树大哥帮忙看一下,谢谢

    <ul><?php query_posts('cat=12orderby=date&order=DESC&showposts=10'); ?>
    <?php while (have_posts()) : the_post(); ?>
    <li><a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
    <?php wp_reset_query();?></ul>
    

    • 阿树工作室
      阿树工作室 回复啊喵: 回复

      参考本站问答栏目:wordpress怎么实现调用自定义栏目?

      <?php
      $args = array(
      	'post_type'=>'book', //调用文章类型为book
      	'showposts'=>10,
      );
      query_posts($args);
      if( have_posts() ) : while( have_posts() ) : the_post();
      /*****************/
      endwhile;endif;
      ?>

      • 记忆碎片
        记忆碎片 回复阿树工作室: 回复

        我看这个调用只是调用出10篇文章,如果文章比较多  想有上下翻页的功能要如何实现呢                                                                       

      • 阿喵
        阿喵 回复阿树工作室: 回复

        牛x,成功了!!!谢谢!!!哈哈!!!

  10. imagic
    imagic : 回复

    阿树,

    1、自定义文章类型里面好像没有置顶功能。

    2、我自定义页面模板,用query_posts,获取自定义文章类型的文章,无法使用分页功能。

    求解。谢谢。

  11. 李小幺
    李小幺 : 回复
  12. daoge
    daoge : 回复

    去看你给别人的回复,我也去更新了一下 固定链接 问题解决了,

    更新固定链接就好,能否说说什么原因呢,谢谢!!

  13. daoge
    daoge : 回复

    后台的这个 搭配 新分类 很正常,就只是前台的模版没有显示

  14. daoge
    daoge : 回复

    在你模版的基础上添加一个新的分类

    /**********搭配*****************/
    $labels4 = array(
    ‘name’ => ‘搭配’,
    ‘singular_name’ => ‘搭配’,
    ‘add_new’ => ‘添加’,
    ‘add_new_item’ => ‘添加新搭配’,
    ‘edit_item’ => ‘编辑’,
    ‘new_item’ => ‘新搭配’,
    ‘view_item’ => ‘查看’,
    ‘search_items’ => ‘搜索’,
    ‘menu_name’ => ‘搭配’
    );
    $args4 = array(
    ‘labels’ => $labels4,
    ‘public’ => true,
    ‘publicly_queryable’ => true,
    ‘show_ui’ => true, 
    ‘show_in_menu’ => true, 
    ‘query_var’ => true,
    ‘rewrite’ => array(‘slug’=>’collocations’,’with_front’ => false),
    ‘capability_type’ => ‘post’,
    ‘has_archive’ => true,  
    ‘hierarchical’ => false,
    ‘menu_position’ => null,
    ‘supports’ => array(‘title’,’editor’,’author’,’thumbnail’,’excerpt’,’comments’,’custom-fields’),
    ‘map_meta_cap’ => true,
    );
    register_post_type(‘collocation’,$args4);

    另外新建了一个页面 archive-collocation.php  

    但是我通过 http://localhost/collocations

    或者 http://localhost/collocation&nbsp; 都访问不到我注册的这个collcation 

    请问,是不是在还要在哪里设置什么东西,我是在你的什么值得买的模版基础上做修改的

    • 阿树工作室
      阿树工作室 回复daoge: 回复

      在后台新建一个文章,然后查看文章,就可以得到文章的url,前面一截就是归档也的地址了。。

      或者使用函数

      <?php
      //输出collcation的归档页地址
      echo get_post_type_archive_link( 'collcation' );
      ?>

      • 记忆碎片
        记忆碎片 回复阿树工作室: 回复

        通过这个输出没结果啊 是空的           

  15. yalon
    yalon : 回复

    亲,这个自定义文章在前台调用的是哪个模板啊?

    • 阿树工作室
      阿树工作室 回复yalon: 回复

      如果你注册一个名为book的文章类型,那么文章单页使用 single-book.php即可,归档用 archive-book.php即可

      • yalon
        yalon 回复阿树工作室: 回复

        如何让book文章类型的文章与默认文章一同在首页循环?

    • yalon
      yalon 回复yalon: 回复

      再问个问题,如何使新定义类型的文章在也在首页循环中显示?!谢谢!

  16. iear
    iear : 回复

    想在自定义文章类型里增加一个自定义面板,怎么弄呢?

    • 阿树工作室
      阿树工作室 回复iear: 回复

      添加自定义面板请参考后面自定义面板的教程。。http://www.ashuwp.com/courses/highgrade/271.html。。。注意add_meta_box的第四个参数。。

      • iear
        iear 回复阿树工作室: 回复

        好了,给加上去了·

      • iear
        iear 回复阿树工作室: 回复

        评论回复的邮件链接是调到404的··

        • 阿树工作室
          阿树工作室 回复iear: 回复

          嗯。。谢谢提醒。。。

发表评论