当前浏览:首页 / WordPress函数 / register_post_type()

register_post_type( string $post_type, array|string $args = array() )

注册文章类型

post_type 文章类型more...

registermore...


描述

注意:在‘init’动作之前,不应挂钩文章类型注册。此外,任何分类连接都应该通过$taxonomies参数注册,以确保在使用‘parse_query’‘pre_get_posts’等钩子时的一致性。

文章类型可以支持任意数量的内置核心功能,如元框、自定义字段、文章缩略图、文章状态、评论等。有关支持的功能的完整列表,请参阅$supports参数。

译注:用于注册自定义文章类型,通常与注册自定义分类法 register_taxonomy() 函数一起使用。


参数

$post_type

(string) (必填) 文章类型键名,不得超过20个字符,并且只能包含小写字母数字字符、破折号和下划线。见sanitize_key()

$args

(array|string) (可选) 用于注册文章类型的参数数组或字符串。

  • 'label'
    (string) 在菜单中显示的文章类型名称,默认是$labels['name']的值。
  • 'labels'
    (string[]) 文章类型的标签(label)数组。如果未设置,则会为非层次类型继承文章(post)标签,为层次类型继承页面(page)标签。参见get_post_type_labels()获取支持的标签的完整列表。
  • 'description'
    (string) 文章类型的简短描述性总结。
  • 'public'
    (bool) 文章类型是否打算通过管理界面或由前端用户公开使用。虽然$exclude_from_search、$publicly_queryable、$show_ui和$show_in_nav_menus的默认设置都是继承自$public,但每个设置都不依赖于此关系,而是控制一个非常具体的意图。默认为false。
  • 'hierarchical'
    (bool) 文章类型是否是分层的(如页面),默认为false。
  • 'exclude_from_search'
    (bool) 是否从前端搜索结果中排除该类型的文章,默认为$public的相反值。
  • 'publicly_queryable'
    (bool) 作为parse_request()的一部分,是否可以在前端对文章类型执行查询,端点将包括:
    • ?post_type={post_type_key}
    • ?{post_type_key}={single_post_slug}
    • ?{post_type_query_var}={single_post_slug} 如果未设置,则默认继承自$public。
  • 'show_ui'
    (bool) 是否允许在管理界面生成该文章类型的UI用以管理,默认值为$public。
  • 'show_in_menu'
    (bool|string) 在管理菜单中显示文章类型,若要起效,$show_ui必须为true。如果是true,文章类型将显示在其自己的顶层菜单中。如果为false,则不显示任何菜单。如果是一个现有的顶级菜单的字符串(例如'tools.php'或'edit.php?post_type=page'),此文章类型将作为该菜单的一个子菜单。默认是$show_ui的值。
  • 'show_in_nav_menus'
    (bool) 使这个文章类型可以在导航菜单中被选择使用,默认值为$public。
  • 'show_in_admin_bar'
    (bool) 使这个文章类型可以在管理栏中被使用,默认是$show_in_menu的值。
  • 'show_in_rest'
    (bool) 是否在REST API中包含文章类型,如果设置为true,则文章类型在区块编辑器中可用。
  • 'rest_base'
    (string) 改变REST API路由的基本URL,默认是$post_type。
  • 'rest_namespace'
    (string) 改变REST API路由的命名空间URL,默认是wp/v2。
  • 'rest_controller_class'
    (string) REST API控制器类名,默认是 'WP_REST_Posts_Controller'.
  • 'menu_position'
    (int) 文章类型出现在菜单中的位置,为了起效,$show_in_menu必须为true,默认为空(在底部)。
  • 'menu_icon'
    (string) 这个菜单要使用的图标的URL。使用数据URI传递一个base64编码的SVG,它将被染成与颜色方案相匹配的颜色--这应该以'data:image/svg+xml;base64,'开头。传递Dashicons辅助类的名称,以使用一个字体图标,例如'dashicons-chart-pie'。传递'none'以使div.wp-menu-image为空,这样可以通过CSS添加一个图标。默认情况下,使用文章的图标。
  • 'capability_type'
    (string|array) 用于构建读取、编辑和删除能力的字符串。可以作为数组传递,以允许在使用此参数作为基础来构造能力时使用其他复数,例如array('story', 'stories')。默认为'post'。
  • 'capabilities'
    (string[]) 这个文章类型的能力数组,默认情况下,$capability_type被用来作为构建能力的基础。参见 get_post_type_capabilities().
  • 'map_meta_cap'
    (bool) 是否使用内部默认的meta能力处理,默认为false。
  • 'supports'
    (array) 文章类型支持的核心功能,作为直接调用add_post_type_support()的一个别名。核心功能包括:"title(标题)"、"editor(编辑器)"、"comments(评论)"、"revisions(修订)"、"trackbacks"、"author(作者)"、"excerpt(摘录)"、"page-attributes(页面属性)"、"thumbnail(缩略图)"、"custom-fields(自定义字段)"和"post-formats(文章格式)"。此外,"修订"功能决定了文章类型是否会存储修订版,而"评论"功能决定了评论数是否会显示在编辑界面上。一个功能也可以被指定为一个参数数组,以提供支持该功能的额外信息。例如:array( 'my_feature', array( 'field' => 'value' ) )。默认是一个包含'title'和'editor'的数组。
  • 'register_meta_box_cb'
    (callable) 提供一个回调函数,为编辑表单设置meta box(元框)。在回调中执行remove_meta_box()add_meta_box()的调用,默认为null。
  • 'taxonomies'
    (string[]) 将为文章类型注册的分类法标识符数组。稍后可以使用register_taxonomy()register_taxonomy_for_object_type()注册分类法。(译注:将文章类型与分类法关联,在此类型的文章编辑界面将出现此参数关联的分类,也可以关联使用内置分类:category,当然一般是关联自定义分类)
  • 'has_archive'
    (bool|string) 此文章类型是否有存档,或者如果是字符串,则用作存档的slug。如果$rewrite被启用,将生成适当的重写规则。默认为false。
  • 'rewrite'
    (bool|array) 触发对这个文章类型的重写处理。要防止重写,请设置为false。默认为true,使用$post_type作为slug。为了指定重写规则,可以通过一个数组,其中包括以下任意键:
    • 'slug'
      (string) 自定义固定链接结构的slug,默认为$post_type。
    • 'with_front'
      (bool) 固定链接结构是否应以 WP_Rewrite::$front 为前缀,默认为true。
    • 'feeds'
      (bool) 是否应该为这个文章类型建立feed固定链接结构,默认是$has_archive的值。
    • 'pages'
      (bool) 固定链接结构是否应该提供分页功能,默认为true。
    • 'ep_mask'
      (int) 要指定的端点掩码,如果未指定且设置了permalink_epmask,则继承$permalink_epmask。如果未指定且未设置permalink_epmask,则默认为EP_PERMALINK。
  • 'query_var'
    (string|bool) 为这个文章类型设置query_var键,默认为$post_type。如果是false,文章类型无法使用?{query_var}={post_slug}加载。如果指定为字符串,则查询?{query_var_string}={post_slug}将是有效的。
  • 'can_export'
    (bool) 是否允许导出此文章类型,默认为true。
  • 'delete_with_user'
    (bool) 删除用户时是否要删除这种类型的文章。
  • 如果true,当用户被删除时,属于该用户的这种类型的文章将被移到垃圾桶。
  • 如果false,属于用户的这种类型的文章将不会被扔掉或删除。
  • 若未设置(默认),如果文章类型支持 "author(作者)"功能,文章会被销毁。否则,文章不会被扔掉或删除。默认为null。
  • 'template'
    (array) 用作编辑器会话默认初始状态的区块数组。每个项都应该是一个包含区块名称和可选属性的数组。
  • 'template_lock'
    (string|false) 如果$template被设置,区块模板是否应该被锁定。
  • 如果设置为"all",用户就不能插入新区块,移动和删除现有区块。
  • 如果设置为"insert",用户能够移动现有的块,但不能插入新的块和删除。默认为false。
  • '_builtin'
    (bool) 仅供内部使用! 如果这个文章类型是一个原生或"内置"的文章类型,则为true。默认为false。
  • '_edit_link'
    (string) 仅供内部使用! 该文章类型的编辑链接所使用的URL段。默认为'post.php?post=%d'。
  • 默认值: array()


    返回

    (WP_Post_Type|WP_Error) 成功时返回注册的文章类型对象,失败时返回WP_Error对象。


    说明

    你可以在主题和插件中使用这个函数。然而,如果你在一个主题中使用它,如果用户离开你的主题,你的文章类型将从管理界面那里消失。如果您想保留您的更改(即使在主题之间切换),则必须使用插件。

    分类法 (taxonomy)

    注册文章类型时,请始终使用taxonomies参数注册分类。如果不这样做,则在使用parse_querypre_get_posts等过滤器时,分类法和文章类型将不会被识别为已连接。这可能会导致意外的结果和失败。

    即使在创建文章类型时注册了分类法,也必须使用register_taxonomy()显式注册和定义分类法。

    保留的文章类型

    以下文章类型是保留的,已被WordPress使用。

    • post
    • page
    • attachment
    • revision
    • nav_menu_item
    • custom_css
    • customize_changeset
    • oembed_cache
    • user_request
    • wp_block

    此外,不应使用以下文章类型,因为它们会干扰其他WordPress函数。

    • action
    • author
    • order
    • theme

    一般来说,您应该始终为文章类型添加前缀,或指定一个自定义的“query_var”,以避免与现有的WordPress查询变量冲突。

    更多信息:文章类型

    参数详情信息

    description

    (string) (可选) 文章类型的简短描述性总结。

    默认: 空白

    读取该字段的唯一方法是使用以下代码:

    $obj = get_post_type_object( 'your_post_type_name' ); 
    echo esc_html( $obj->description );

    public

    (boolean) (可选) 控制类型对作者 (show_in_nav_menus, show_ui) 和读者 (exclude_from_search, publicly_queryable) 的可见性。

    默认: false
    • true’ – 意味着 exclude_from_search: false, publicly_queryable: true, show_in_nav_menus: true, 和 show_ui:true。内置的 attachment, page, 和 post 等类型与此类似。
    • false’ – 意味着 exclude_from_search: true, publicly_queryable: false, show_in_nav_menus: false, 和 show_ui: false. 内置的 nav_menu_itemrevision 类型与此类似。如果你要提供自己的编辑和查看界面(或根本没有),则最好使用。
    如果没有为 exclude_from_search, publicly_queryable, show_in_nav_menus, 或 show_ui 指定值,它们将从 public 继承其值。
    (boolean) (重要) 是否从前端搜索结果中排除这种类型的文章。

    默认:public 参数相反的值
    • ‘true’ – site/?s=search-term 结果将不包含此类型的文章
    • ‘false’ – site/?s=search-term 结果将包含此类型的文章
    注意:如果你想显示与分类法项目(term)相关的文章列表,你必须将exclude_from_search设置为false(即:调用site_domaine/?taxonomy_slug=term_slug或site_domaine/taxonomy_slug/term_slug)。如果你设置为true,在分类页面(例如:taxonomy.php),WordPress将找不到你的文章及其分页,会出现404错误......

    publicly_queryable

    (boolean) (可选) 是否可以作为parse_request()的一部分在前端进行查询。

    默认:public 参数的值
    注意: 受影响的查询包括以下内容(在处理重写时也会启动)

    •  ?post_type={post_type_key}
    •  ?{post_type_key}={single_post_slug}
    •  ?{post_type_query_var}={single_post_slug}
    注意: 如果query_var是empty、null,或false,WordPress仍然会试图解释它(4.2.2),您的自定义文章的预览/浏览会返回404。

    show_ui

    (boolean) (可选) 是否允许在管理界面生成该文章类型的UI用以管理

    默认:public 参数的值
    • ‘false’ – 不显示该文章类型的用户界面(UI)
    • ‘true’ – 为该文章类型显示一个用户界面(UI)
    注意:内置的文章类型,如文章(post)和页面(page),被故意设置为false

    show_in_nav_menus

    (boolean) (可选) post_type是否可在导航菜单中选择、使用

    默认:public 参数的值

    show_in_menu

    (boolean or string) (可选) 在管理菜单中显示文章类型,show_ui 必须 true

    默认:show_ui 参数的值
    • ‘false’ – 不在管理菜单中显示
    • ‘true’ – 显示为一个顶级菜单
    • ‘some string’ – 如果是一个现有的顶级页面,如'tools.php'或'edit.php?post_type=page',文章类型将作为该页面的一个子菜单。
    注意:当使用'some string'作为插件创建的菜单页的子菜单显示时,这个项目将成为第一个子菜单项目,并取代顶层链接的位置。如果不希望这样,创建菜单页的插件需要将admin_menu的add_action优先级设置为9或更低。
    由于这个属性的值继承自show_ui,而show_ui的值继承自public,所以它似乎是确定一个文章类型是否可以公开使用的最可靠属性。至少这适用于内置的文章类型,并且只赋予post和page。

    show_in_admin_bar

    (boolean) (可选) 是否让这个文章类型在WordPress管理栏中可用

    默认:show_in_menu 参数的值
    (integer) (可选) 文章类型出现在菜单中的位置,show_in_menu 必须为 true

    默认:null – 默认为以下情况
    • 5 – 文章下方
    • 10 – 媒体下方
    • 15 – 链接下方
    • 20 – 页面下方
    • 25 – 评论下方
    • 60 – 第一个分隔符下方
    • 65 – 插件下方
    • 70 – 用户下方
    • 75 – 工具下方
    • 80 – 设置下方
    • 100 – 第二个分隔符下方
    (string) (可选) 用于该菜单的图标url或图标字体中的图标名称

    默认:null – 默认为文章图标
    示例

    • ‘dashicons-video-alt’ (使用Dashicons的视频图标[2])
    • get_template_directory_uri() . “/images/cutom-posttype-icon.png”‘ (使用位于当前主题中的图片)
    • ‘data:image/svg+xml;base64,’ . base64_encode( “<svg version="”1.1″" xmlns="”http://www.w3.org/2000/svg” xmlns:xlink=”http://www.w3.org/1999/xlink” x=”0px” y=”0px” width=”20px” height=”20px” viewBox=”0 0 459 459″> </svg>” )’ (直接嵌入带有'fill="black"的svg将允许正确的颜色)

    capability_type

    (string or array) (可选) 用于构建读取、编辑和删除能力的字符串。可以作为数组传递,以允许在使用此参数作为基础来构造能力时使用其他复数,例如array('story', 'stories')。第一个数组元素将用于单数能力,第二个数组元素用于复数能力,如果没有给出数组,这将替换为自动生成的版本,即 "storys"。capability_type"参数被用作构建能力的基础,除非它们被 "capabilities"参数明确设置。似乎`map_meta_cap`需要被设置为false或null,以使其发挥作用(见下面的说明2)。

    默认:“post”
    例如 带 “book” 或 “array( ‘book’, ‘books’ )” 的值,它将产生7个能力,相当于给这个参数设置的能力:
    'capabilities' => array(
      'edit_post'          => 'edit_book', 
      'read_post'          => 'read_book', 
      'delete_post'        => 'delete_book', 
      'edit_posts'         => 'edit_books', 
      'edit_others_posts'  => 'edit_others_books', 
      'publish_posts'      => 'publish_books',       
      'read_private_posts' => 'read_private_books', 
      'create_posts'       => 'edit_books', 
    ),
    
    说明1: "create_posts" 的能力与 "edit_books" 相对应,所以它变得等于 "edit_posts"。
    说明2: 参见关于自定义文章类型的meta能力映射的能力说明2。
    你可以查看$GLOBALS['wp_post_types']['your_cpt_name']数组,可看到如下内容:
    [cap] => stdClass Object
    	(
    		// Meta capabilities
    		[edit_post] => edit_book
    		[read_post] => read_book
    		[delete_post] => delete_book
    
    		// Primitive capabilities used outside of map_meta_cap():
    		[edit_posts] => edit_books
    		[edit_others_posts] => edit_others_books
    		[publish_posts] => publish_books
    		[read_private_posts] => read_private_books
    
    		// Primitive capabilities used within map_meta_cap():
    		[create_posts] => edit_books
    	)
    
    可以使用的一些能力类型(可能不是详尽的清单):

    • post (默认)
    • page
    这些内置类型不能被使用:

    • attachment
    • mediapage
    说明3:如果您使用capabilities参数,则capability_type完善您的能力。

    capabilities

    (array) (可选) 此文章类型的能力数组

    默认:使用 capability_type 来构建
    默认情况下,七个键被接受为能力数组的一部分:

    • edit_post, read_post, 和 delete_post – 这三个是meta能力,通常根据上下文映射到相应的基本能力,例如正被编辑/读取/删除的文章和正被检查的用户或角色。因此,这些能力通常不会直接授予用户或角色。
    • edit_posts – 控制是否可以编辑此文章类型的对象。
    • edit_others_posts – 控制是否可以编辑其他用户拥有的此类对象。如果文章类型不支持作者,则其行为类似于 edit_posts。
    • publish_posts – 控制此文章类型的发布对象。
    • read_private_posts – 控制是否可以读取私密对象。
    注释: 最后四个基本能力在核心区的不同位置都有检查。
    还有其他八种基本能力没有在核心中直接引用,而是在map_meta_cap()中引用,map_meta_cap()将上述三种meta能力转换成一种或多种基本能力,然后必须根据上下文检查用户或角色。这些额外的能力只在map_meta_cap()中使用。因此,只有当文章类型在注册时将'map_meta_cap'参数设置为true(默认为false),它们才会被默认分配。

    • read – 控制是否可以读取此文章类型的对象。
    • delete_posts – 控制是否可以删除此文章类型的对象。
    • delete_private_posts – 控制是否可以删除私密对象。
    • delete_published_posts – 控制是否可以删除已发布的对象。
    • delete_others_posts – 控制是否可以删除其他用户拥有的对象。如果文章类型不支持作者,则其行为类似于delete_posts。
    • edit_private_posts – 控制是否可以编辑私密对象。
    • edit_published_posts – 控制是否可以编辑已发布的对象。
    • create_posts – 控制是否可以创建新对象。

    如果您分配了一个'capability_type',然后查看$GLOBALS['wp_post_types']['your_cpt_name']数组,您将看到以下内容:

    [cap] => stdClass Object
    (
    	// Meta capabilities
    
    	[edit_post]		 => "edit_{$capability_type}"
    	[read_post]		 => "read_{$capability_type}"
    	[delete_post]		 => "delete_{$capability_type}"
    
    	// Primitive capabilities used outside of map_meta_cap():
    
    	[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"
    
    	// Primitive capabilities used within map_meta_cap():
    
    	[read]                   => "read",
    	[delete_posts]           => "delete_{$capability_type}s"
    	[delete_private_posts]   => "delete_private_{$capability_type}s"
    	[delete_published_posts] => "delete_published_{$capability_type}s"
    	[delete_others_posts]    => "delete_others_{$capability_type}s"
    	[edit_private_posts]     => "edit_private_{$capability_type}s"
    	[edit_published_posts]   => "edit_published_{$capability_type}s"
    	[create_posts]           => "edit_{$capability_type}s"
    )
    

    注意复数能力末尾的“s”

    map_meta_cap

    (boolean) (可选) 是否使用内部默认meta功能处理。

    默认:null
    说明: 如果设置为false,那么标准管理员角色就不能编辑文章类型。那么就必须给所有的角色添加edit_post功能来添加或编辑文章类型。

    hierarchical

    (boolean) (可选) 文章类型是否是分层的(如页面)。允许指定父页,“supports”参数应包含“page-attributes”,以在编辑器页面上显示父级选择框。

    默认:false
    说明:这个参数是为页面准备的。当为自定义文章类型选择它时要小心--如果你计划有非常多的条目(比如--超过2-3千条),你会遇到加载时间问题。如果这个参数设置为 true,WordPress将在你的文章类型的每个管理页面的加载中获取该特定类型的所有ID。内存资源有限的服务器也可能因为这个参数被设置为 true 而受到挑战。

    supports

    (array/boolean) (可选) 直接调用add_post_type_support()的一个别名。从3.5版本开始,布尔值false可以作为值而不是数组传递,以防止默认(标题和编辑器)行为

    默认:title 和 editor
    • ‘title’
    • ‘editor’ (内容编辑器)
    • ‘author’
    • ‘thumbnail’ (特色图片,当前主题还必须支持 post-thumbnails)
    • ‘excerpt’
    • ‘trackbacks’
    • ‘custom-fields’
    • ‘comments’ (也会在编辑界面上看到评论数量)
    • ‘revisions’ (将会存储修订版)
    • ‘page-attributes’ (菜单顺序,hierarchical必须为true,以显示父级选项)
    • ‘post-formats’ 添加文章格式,见 文章格式
    说明: 当你用自定义文章类型使用缩略图时,记得检查主题是否也支持缩略图或使用add_theme_support()函数。

    register_meta_box_cb

    (callback ) (可选) 提供一个回调函数,在设置编辑表单的meta box(元框)时将调用该函数。回调函数接受一个参数$post,它包含了当前编辑的文章的WP_Post对象。在回调中执行remove_meta_box()add_meta_box()的调用。

    默认:None

    taxonomies

    (array) (可选) 注册分类法的数组,如categorypost_tag,将与该文章类型一起使用。这可以代替直接调用 register_taxonomy_for_object_type() 。自定义分类法仍然需要用register_taxonomy()来注册。

    默认:没有分类法

    has_archive

    (boolean or string) (可选) 启用文章类型存档,默认情况下,将使用$post_type作为存档slug。

    默认:false
    注意:如果重写(rewrite)功能被启用,将生成适当的重写规则。也可以用重写来改变使用的slug。如果是字符串,它应该是可翻译的。

    rewrite

    (boolean or array) (可选) 触发对这个文章类型的重写处理,要防止重写,请设置为false。

    默认:true 并且使用 $post_type 作为 slug
    $args 数组

    • 'slug' => string 自定义固定链接结构的slug,默认为$post_type的值,应是可翻译的。
    • 'with_front' => bool 固定链接结构是否应该预留前缀 (例如:如果你的前缀是/blog/,那么你的链接将是:false->/news/,true->/blog/news/),默认为true。
    • 'feeds' => bool 是否应该为这个文章类型建立feed固定链接结构,默认为has_archive值。
    • 'pages' => bool 固定链接结构是否应该提供分页功能,默认为 true
    • 'ep_mask' => const 从3.4开始,为这个文章类型指定一个端点掩码。更多信息见Rewrite API/add_rewrite_endpointMake WordPress Plugins summary of endpoints.
      • 如果没有指定,则继承自permalink_epmask(如果设置了permalink_epmask),否则默认为 EP_PERMALINK.
    注意: 如果在插件中注册一个文章类型,请在你的激活和停用钩子中调用flush_rewrite_rules()(见下文激活时刷新重写)。如果不使用flush_rewrite_rules(),那么你将不得不手动进入设置 > 固定链接,刷新你的固定结构,使你的自定义文章类型显示正确的结构。
    (string) (可选) 默认的重写端点位掩码。更多信息见 Trac Ticket 12605 和 Make WordPress Plugins summary of endpoints.

    默认:EP_PERMALINK
    注意:注意:在3.4中,这个参数被rewrite下的'ep_mask'参数有效取代。

    query_var

    (boolean or string) (可选) 设置这个文章类型的 query_var

    默认:true – 设置为 $post_type
    • ‘false’ – 禁用 query_var 键的使用,不能使用 /?{query_var}={single_post_slug} 加载此文章类型
    • ‘string’ – /?{query_var_string}={single_post_slug} 将按预期工作。
    注意: query_var参数在'public_queryable'参数设置为false的情况下没有作用。query_var将自定义文章类型的查询变量添加到内置的query_vars数组中,以便WordPress能够识别它。WordPress会删除不包括在该数组中的任何查询变量。
    如果设置为 true 它允许你使用以下方法来请求一个自定义的文章类型 (book) :example.com/?book=life-of-pi
    如果设置为字符串而不是 true (如 ‘publication’),你可以这样:example.com/?publication=life-of-pi

    can_export

    (boolean) (可选) 这个post_type能否被导出。

    默认:true

    delete_with_user

    (boolean) (可选) 在删除用户时,是否要删除这种类型的文章。如果true,当用户被删除时,属于该用户的这种类型的文章将被移到垃圾箱。如果false,属于该用户的这种类型的文章将不会被扔掉或删除。如果没有设置(默认),如果post_type_supports('author'),文章会被扔掉。否则,文章不会被销毁或删除。

    默认:null

    show_in_rest

    (boolean) (可选) 是否在REST API中公开这个文章类型,必须为true才能启用Gutenberg编辑器。

    默认:false

    rest_base

    (string) (可选) 这个文章类型在使用REST API访问时将使用的基本slug。

    默认:$post_type

    rest_controller_class

    (string) (可选) 一个可选的自定义控制器,用来代替WP_REST_Posts_Controller。必须是WP_REST_Controller的一个子类。

    默认:WP_REST_Posts_Controller

    _builtin

    (boolean) (不适用于常规用途) 这个文章类型是否是原生或"内置"的文章类型。 注意:这个条目是用来记录的--核心开发人员建议你在注册自己的文章类型时不要使用这个。

    默认:false
    • ‘false’ – 默认这是一个自定义文章类型
    • ‘true’ – 这是内部原生的文章类型 (post, page, attachment, revision, nav_menu_item)
    (boolean) (不适用于常规用途) 这个文章类型的条目编辑链接。 注意:这个条目是用来记录的--核心开发人员建议你在注册自己的文章类型时不要使用这个。

    默认:‘post.php?post=%d’

    激活时刷新重写

    要使固定链接在激活插件时起效,请使用以下示例,注意在register_activation_hook回调中如何调用my_cpt_init()

    add_action( 'init', 'my_cpt_init' );
    function my_cpt_init() {
        register_post_type( ... );
    }
    
    register_activation_hook( __FILE__, 'my_rewrite_flush' );
    function my_rewrite_flush() {
        // First, we "add" the custom post type via the above written function.
        // Note: "add" is written with quotes, as CPTs don't get added to the DB,
        // They are only referenced in the post_type column with a post entry, 
        // when you add a post of this CPT.
        my_cpt_init();
    
        // ATTENTION: This is *only* done during plugin activation hook in this example!
        // You should *NEVER EVER* do this on every page load!!
        flush_rewrite_rules();
    }
    

    对于主题,您需要使用after_switch_theme挂钩。像这样:

    add_action( 'init', 'my_cpt_init' );
    function my_cpt_init() {
        register_post_type( ... );
    }
    
    add_action( 'after_switch_theme', 'my_rewrite_flush' );
    function my_rewrite_flush() {
        my_cpt_init();
        flush_rewrite_rules();
    }
    

    注意,尽管$public属性是可选的,但传递给函数的输入正好是get_post_types()函数查询的内容。因此,如果您详细地为“publicly_queriable”、“show_ui”、“show_in_nav_menu”和“exclude_from_search”设置等效选项,则处理方式与设置“public”属性不同。见bug 18950



    源码

    查看源码 官方文档


    更新日志

    版本描述
    5.9.0添加了rest_namespace参数
    5.3.0supports参数现在将接受功能的参数数组
    5.0.0添加了templatetemplate_lock参数
    4.7.0引入了show_in_restrest_baserest_controller_class参数,以在REST API中注册文章类型
    4.6.0返回的Post-type对象现在是WP_Post_Type的实例
    4.4.0show_ui参数现在在文章类型列表屏幕和文章编辑屏幕上强制执行
    3.0.0show_ui参数现在在新的文章屏幕上强制执行
    2.9.0开始引入

    使用示例

    • 示例1

      使用4.3和4.4中引入的新标签注册“book”文章类型

      /**
       * Register a custom post type called "book".
       *
       * @see get_post_type_labels() for label keys.
       */
      function wpdocs_codex_book_init() {
      	$labels = array(
      		'name'                  => _x( 'Books', 'Post type general name', 'textdomain' ),
      		'singular_name'         => _x( 'Book', 'Post type singular name', 'textdomain' ),
      		'menu_name'             => _x( 'Books', 'Admin Menu text', 'textdomain' ),
      		'name_admin_bar'        => _x( 'Book', 'Add New on Toolbar', 'textdomain' ),
      		'add_new'               => __( 'Add New', 'textdomain' ),
      		'add_new_item'          => __( 'Add New Book', 'textdomain' ),
      		'new_item'              => __( 'New Book', 'textdomain' ),
      		'edit_item'             => __( 'Edit Book', 'textdomain' ),
      		'view_item'             => __( 'View Book', 'textdomain' ),
      		'all_items'             => __( 'All Books', 'textdomain' ),
      		'search_items'          => __( 'Search Books', 'textdomain' ),
      		'parent_item_colon'     => __( 'Parent Books:', 'textdomain' ),
      		'not_found'             => __( 'No books found.', 'textdomain' ),
      		'not_found_in_trash'    => __( 'No books found in Trash.', 'textdomain' ),
      		'featured_image'        => _x( 'Book Cover Image', 'Overrides the “Featured Image” phrase for this post type. Added in 4.3', 'textdomain' ),
      		'set_featured_image'    => _x( 'Set cover image', 'Overrides the “Set featured image” phrase for this post type. Added in 4.3', 'textdomain' ),
      		'remove_featured_image' => _x( 'Remove cover image', 'Overrides the “Remove featured image” phrase for this post type. Added in 4.3', 'textdomain' ),
      		'use_featured_image'    => _x( 'Use as cover image', 'Overrides the “Use as featured image” phrase for this post type. Added in 4.3', 'textdomain' ),
      		'archives'              => _x( 'Book archives', 'The post type archive label used in nav menus. Default “Post Archives”. Added in 4.4', 'textdomain' ),
      		'insert_into_item'      => _x( 'Insert into book', 'Overrides the “Insert into post”/”Insert into page” phrase (used when inserting media into a post). Added in 4.4', 'textdomain' ),
      		'uploaded_to_this_item' => _x( 'Uploaded to this book', 'Overrides the “Uploaded to this post”/”Uploaded to this page” phrase (used when viewing media attached to a post). Added in 4.4', 'textdomain' ),
      		'filter_items_list'     => _x( 'Filter books list', 'Screen reader text for the filter links heading on the post type listing screen. Default “Filter posts list”/”Filter pages list”. Added in 4.4', 'textdomain' ),
      		'items_list_navigation' => _x( 'Books list navigation', 'Screen reader text for the pagination heading on the post type listing screen. Default “Posts list navigation”/”Pages list navigation”. Added in 4.4', 'textdomain' ),
      		'items_list'            => _x( 'Books list', 'Screen reader text for the items list heading on the post type listing screen. Default “Posts list”/”Pages list”. Added in 4.4', 'textdomain' ),
      	);
      
      	$args = array(
      		'labels'             => $labels,
      		'public'             => true,
      		'publicly_queryable' => true,
      		'show_ui'            => true,
      		'show_in_menu'       => true,
      		'query_var'          => true,
      		'rewrite'            => array( 'slug' => 'book' ),
      		'capability_type'    => 'post',
      		'has_archive'        => true,
      		'hierarchical'       => false,
      		'menu_position'      => null,
      		'supports'           => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
      	);
      
      	register_post_type( 'book', $args );
      }
      
      add_action( 'init', 'wpdocs_codex_book_init' );
      
    • 示例2

      要在自定义文章类型中添加古腾堡兼容,需要两件事。supports中必须包含editorshow_in_rest设置为true

      function wpdocs_kantbtrue_init() {
          $labels = array(
              'name'                  => _x( 'Recipes', 'Post type general name', 'recipe' ),
              'singular_name'         => _x( 'Recipe', 'Post type singular name', 'recipe' ),
              'menu_name'             => _x( 'Recipes', 'Admin Menu text', 'recipe' ),
              'name_admin_bar'        => _x( 'Recipe', 'Add New on Toolbar', 'recipe' ),
              'add_new'               => __( 'Add New', 'recipe' ),
              'add_new_item'          => __( 'Add New recipe', 'recipe' ),
              'new_item'              => __( 'New recipe', 'recipe' ),
              'edit_item'             => __( 'Edit recipe', 'recipe' ),
              'view_item'             => __( 'View recipe', 'recipe' ),
              'all_items'             => __( 'All recipes', 'recipe' ),
              'search_items'          => __( 'Search recipes', 'recipe' ),
              'parent_item_colon'     => __( 'Parent recipes:', 'recipe' ),
              'not_found'             => __( 'No recipes found.', 'recipe' ),
              'not_found_in_trash'    => __( 'No recipes found in Trash.', 'recipe' ),
              'featured_image'        => _x( 'Recipe Cover Image', 'Overrides the “Featured Image” phrase for this post type. Added in 4.3', 'recipe' ),
              'set_featured_image'    => _x( 'Set cover image', 'Overrides the “Set featured image” phrase for this post type. Added in 4.3', 'recipe' ),
              'remove_featured_image' => _x( 'Remove cover image', 'Overrides the “Remove featured image” phrase for this post type. Added in 4.3', 'recipe' ),
              'use_featured_image'    => _x( 'Use as cover image', 'Overrides the “Use as featured image” phrase for this post type. Added in 4.3', 'recipe' ),
              'archives'              => _x( 'Recipe archives', 'The post type archive label used in nav menus. Default “Post Archives”. Added in 4.4', 'recipe' ),
              'insert_into_item'      => _x( 'Insert into recipe', 'Overrides the “Insert into post”/”Insert into page” phrase (used when inserting media into a post). Added in 4.4', 'recipe' ),
              'uploaded_to_this_item' => _x( 'Uploaded to this recipe', 'Overrides the “Uploaded to this post”/”Uploaded to this page” phrase (used when viewing media attached to a post). Added in 4.4', 'recipe' ),
              'filter_items_list'     => _x( 'Filter recipes list', 'Screen reader text for the filter links heading on the post type listing screen. Default “Filter posts list”/”Filter pages list”. Added in 4.4', 'recipe' ),
              'items_list_navigation' => _x( 'Recipes list navigation', 'Screen reader text for the pagination heading on the post type listing screen. Default “Posts list navigation”/”Pages list navigation”. Added in 4.4', 'recipe' ),
              'items_list'            => _x( 'Recipes list', 'Screen reader text for the items list heading on the post type listing screen. Default “Posts list”/”Pages list”. Added in 4.4', 'recipe' ),
          );     
          $args = array(
              'labels'             => $labels,
              'description'        => 'Recipe custom post type.',
              'public'             => true,
              'publicly_queryable' => true,
              'show_ui'            => true,
              'show_in_menu'       => true,
              'query_var'          => true,
              'rewrite'            => array( 'slug' => 'recipe' ),
              'capability_type'    => 'post',
              'has_archive'        => true,
              'hierarchical'       => false,
              'menu_position'      => 20,
              'supports'           => array( 'title', 'editor', 'author', 'thumbnail' ),
              'taxonomies'         => array( 'category', 'post_tag' ),
              'show_in_rest'       => true
          );
           
          register_post_type( 'Recipe', $args );
      }
      add_action( 'init', 'wpdocs_kantbtrue_init' );
    • 示例3

      使用'show_in_rest' => true,
      在自定义文章类型中启用区块。

    • 示例4

      自定义文章类型“book”的自定义文章更新消息:

      /**
       * Book-specific update messages.
       *
       * @see /wp-admin/edit-form-advanced.php
       *
       * @param array $messages Existing post update messages.
       * @return array Amended post update messages with new CPT update messages.
       */
      function wpdocs_codex_book_updated_messages( $messages ) {
      	$post             = get_post();
      	$post_type        = get_post_type( $post );
      	$post_type_object = get_post_type_object( $post_type );
      
      	$messages['book'] = array(
      		0  => '', // Unused. Messages start at index 1.
      		1  => __( 'Book updated.', 'textdomain' ),
      		2  => __( 'Custom field updated.', 'textdomain' ),
      		3  => __( 'Custom field deleted.', 'textdomain' ),
      		4  => __( 'Book updated.', 'textdomain' ),
      		/* translators: %s: date and time of the revision */
      		5  => isset( $_GET['revision'] ) ? sprintf( __( 'Book restored to revision from %s', 'textdomain' ), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
      		6  => __( 'Book published.', 'textdomain' ),
      		7  => __( 'Book saved.', 'textdomain' ),
      		8  => __( 'Book submitted.', 'textdomain' ),
      		9  => sprintf(
      			__( 'Book scheduled for: <strong>%1$s</strong>.', 'textdomain' ),
      			// translators: Publish box date format, see http://php.net/date
      			date_i18n( __( 'M j, Y @ G:i', 'textdomain' ), strtotime( $post->post_date ) )
      		),
      		10 => __( 'Book draft updated.', 'textdomain' ),
      	);
      
      	if ( $post_type_object->publicly_queryable ) {
      		$permalink = get_permalink( $post->ID );
      
      		$view_link = sprintf( ' <a href="%s">%s</a>', esc_url( $permalink ), __( 'View book', 'textdomain' ) );
      		$messages['book'][1] .= $view_link;
      		$messages['book'][6] .= $view_link;
      		$messages['book'][9] .= $view_link;
      
      		$preview_permalink = add_query_arg( 'preview', 'true', $permalink );
      		$preview_link      = sprintf( '<a target="_blank" href="%s">%s</a>', esc_url( $preview_permalink ), __( 'Preview book', 'textdomain' ) );
      		$messages[ $post_type ][8] .= $preview_link;
      		$messages[ $post_type ][10] .= $preview_link;
      	}
      
      	return $messages;
      }
      
      add_filter( 'post_updated_messages', 'wpdocs_codex_book_updated_messages' );
      
    • 示例5

      该文档目前缺少我在一些项目中看到的“template”和“template_lock”参数。其目的是自动将某个区块或区块模板加载到古腾堡编辑器中,或锁定区块的使用。

      这些参数的文档可以在Block Editor Handbook > Templates的关于古腾堡区块的文档部分中找到

    • 示例6

      从WordPress 4.3和4.4开始,添加了许多新标签。

      在4.3中介绍:
      featured_image–默认为“特色图像”
      set_featured_image–默认为“设置特色图像”
      remove_featured_image–默认为“删除特色图像”
      use_featured_image–默认为“用作特色图像”

      在4.4中介绍:
      archives–默认为“文章存档”或“页面存档”
      insert_into_item–默认为“插入文章”或“插入页面”
      uploaded_to_this_item–默认为“上载到此文章”或“上载到此页面”
      filter_items_list–默认为“过滤文章列表”或“过滤页面列表”
      items_list_navigation–默认为“文章列表导航”或“页面列表导航”
      items_list–默认为“文章列表”或“页面列表”

      详见https://make.wordpress.org/core/2015/12/11/additional-labels-for-custom-post-types-and-custom-taxonomies/

    • 示例7

      使用Dashicons作为自定义菜单图标

      要在菜单中为自定义文章类型使用一个现有的DashIcon(而不是图钉默认值),请转到Developer Resources: Dashicons并单击您最喜欢的图标。类名将显示在顶部-只需复制并使用。例如,对于自定义的文章类型“Book”,可以使用dashicons-book

      function book_setup_post_type() {
          $args = array(
              'public'    => true,
              'label'     => __( 'Books', 'textdomain' ),
              'menu_icon' => 'dashicons-book',
          );
          register_post_type( 'book', $args );
      }
      add_action( 'init', 'book_setup_post_type' );
      
    • 示例8

      要使用颜色始终正确的svg,请将其内嵌,如:

      register_post_type('labs', [
              // ect
              'menu_icon' => 'data:image/svg+xml;base64,' . base64_encode('<svg width="20" height="20" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path fill="black" d="M1591 1448q56 89 21.5 152.5t-140.5 63.5h-1152q-106 0-140.5-63.5t21.5-152.5l503-793v-399h-64q-26 0-45-19t-19-45 19-45 45-19h512q26 0 45 19t19 45-19 45-45 19h-64v399zm-779-725l-272 429h712l-272-429-20-31v-436h-128v436z"/></svg>')
           ]);

      fill="black"很重要,来源:https://stackoverflow.com/a/42265057/933065

    • 示例9

      切勿创建自定义文章类型“author”

      存档页面和文章页面将与wordpress的内置/author/{username}路由冲突,即使你'rewrite' => ['slug' => 'writer'],也会有一些混乱,你的自定义author帖子将无法访问。

    • 示例10

      这是一个向“book”文章类型添加上下文帮助的示例。

      add_action( 'contextual_help', 'wpdocs_codex_add_help_text', 10, 3 );
      /**
       * Display contextual help for the Book post type
       */
      function wpdocs_codex_add_help_text( $contextual_help, $screen_id, $screen ) {
      
      	// $contextual_help .= var_dump( $screen ); // use this to help determine $screen->id
      	if ( 'book' == $screen->id ) {
      		$contextual_help =
      			'<p>' . __('Things to remember when adding or editing a book:', 'your_text_domain') . '</p>' .
      			'<ul>' .
      				'<li>' . __('Specify the correct genre such as Mystery, or Historic.', 'your_text_domain') . '</li>' .
      				'<li>' . __('Specify the correct writer of the book.  Remember that the Author module refers to you, the author of this book review.', 'your_text_domain') . '</li>' .
      			'</ul>' .
      			'<p>' . __('If you want to schedule the book review to be published in the future:', 'your_text_domain') . '</p>' .
      			'<ul>' .
      				'<li>' . __('Under the Publish module, click on the Edit link next to Publish.', 'your_text_domain') . '</li>' .
      				'<li>' . __('Change the date to the date to actual publish this article, then click on Ok.', 'your_text_domain') . '</li>' .
      			'</ul>' .
      			'<p><strong>' . __('For more information:', 'your_text_domain') . '</strong></p>' .
      			'<p>' . __('<a href="https://codex.wordpress.org/Posts_Edit_SubPanel" target="_blank">Edit Posts Documentation</a>', 'your_text_domain') . '</p>' .
      			'<p>' . __('<a href="https://wordpress.org/support/" target="_blank">Support Forums</a>', 'your_text_domain') . '</p>' ;
      	} elseif ( 'edit-book' == $screen->id ) {
      		$contextual_help = '<p>' . __('This is the help screen displaying the table of books blah blah blah.', 'your_text_domain') . '</p>';
      	}
      	
      	return $contextual_help;
      }
      
    • 示例11

      本例将WordPress 3.3+帮助选项卡添加到“book”文章类型。

      add_action( 'admin_head', 'wpdocs_codex_custom_help_tab' );
      /**
       * Add Help Tab to Book post type.
       */
      function wpdocs_codex_custom_help_tab() {
      
      	$screen = get_current_screen();
      
      	// Return early if we're not on the book post type.
      	if ( 'book' != $screen->post_type ) {
      		return;
      	}
      
      	// Setup help tab args.
      	$args = array(
      		'id'      => 'your_custom_id', // Unique id for the tab.
      		'title'   => __( 'Custom Help', 'textdomain' ), // Unique visible title for the tab.
      		'content' => '<h3>Help Title</h3><p>Help content</p>', // Actual help text.
      	);
      
      	// Add the help tab.
      	$screen->add_help_tab( $args );
      
      }
      
    • 示例12

      将base64编码的SVG用于menu_icon参数时,SVG必须具有fill属性。没有fill属性,WordPress将无法匹配管理界面配色方案。

    • 示例13

      以下是内置的文章类型:

      'post',
      'page',
      'attachment',
      'revision',
      'nav_menu_item',
      'custom_css',
      'customize_changeset',
      'oembed_cache',
      'user_request',
      

      如果您想查看所有内置和/或自定义文章类型的信息,可以从$wp_post_types全局变量获取,示例:

      add_action( 'admin_notices', function () {
      	global $wp_post_types;
      	var_dump( $wp_post_types );
      });
      
    • 示例14

      这个基本示例注册了一个“book”文章类型。

      /**
       * Register a book post type.
       */
      function wpdocs_codex_custom_init() {
      	$args = array(
      		'public' => true,
      		'label'  => __( 'Books', 'textdomain' ),
      	);
      	register_post_type( 'book', $args );
      }
      add_action( 'init', 'wpdocs_codex_custom_init' );
      
    • 示例15

      关于分层文章类型性能问题,请注意:“将此参数设置为true后,WordPress将在您的文章类型的每个管理页面加载上获取该特定文章类型的所有ID。”

      措辞有点混乱。WP将获取此文章类型的特定文章的所有子ID,而不是“文章类型”的“所有ID”,这是一个描述文章类型而不是特定文章的术语。

    • 示例16

      这份文件中有一个错误,supports参数还接受布尔值false,当supports设置为false时,文章类型不使用任何内置功能,如编辑器

      只有submit metabox会自动注册。

      因此,如果有人能更新这些信息,让其他开发者也能从我的研究中受益,我将不胜感激。

    • 示例17

      文章类型作为子菜单是可能的。
      你可以把一个自定义的文章类型放在另一个CPT的菜单里!
      文档并不是那么明显!
      但是,让一个文章类型成为另一个文章类型的子菜单是完全可能的!
      选项 "show_in_menu" 是实现这一目的的关键。(除了建议的menu_position参数外)

      你只需要给 "show_in_menu" 这个参数:"edit.php?post_type=page"
      其中"page"可以是一个内置的文章类型或任何你创建的文章类型

      下面是一个示例代码段

         	$books_args = array(
              'label'     		=> __( 'Books', 'textdomain' ),
              'show_in_menu'    	=> 'edit.php?post_type=page',
          );
          register_post_type( 'book', $books_args );
      
    • 示例18

      如果出于某种原因,自定义文章类型的页面前端出现404,则可能需要刷新重写规则。您可以手动执行此操作,方法是转到设置 -> 固定链接并点击“保存更改”或调用 flush_rewrite_rules()。注意,你不应该调用flush_rewrite_rules(),因为它很昂贵。仅在插件激活时运行。

    • 示例19

      要在menu_icon中使用自定义SVG,请查找或创建要使用的SVG,然后可以使用https://www.base64-image.de/之类的站点将其转换为base64代码。

      为了使SVG图标与管理界面配色方案匹配,它必须在SVG文件的任何path元素中设置fill属性。

      使用编辑器编辑SVG文件,并在转换为base64之前向任何“path”元素添加fill属性。

      <path d="...

      应该是

      <path fill="#9da3a8" d="...

      你可以使用任何你想要的颜色,包括使用none而不是颜色,因为WordPress会自动更新它以匹配配色方案。

      https://css-tricks.com/almanac/properties/f/fill/

    • 示例20

      当你注册一个新的自定义文章类型时,我强烈建议设置with_front => true,因为它在核心中默认为false。如果用户/客户将其固定链接更改为/blog/%category%/%postname%/,那么对您的CPT注册的更改将很有帮助,因为您所有注册的CPT都将具有/blog/your-cpt