注册自定义帖子类型

WordPress 带有五种默认的帖子类型:postpageattachmentrevisionmenu

在开发插件时,您可能需要创建自己的特定内容类型:例如,电子商务网站的产品、电子学习网站的作业或评论网站的电影。

使用自定义帖子类型,您可以注册自己的帖子类型。注册自定义帖子类型后,它会获得一个新的顶级管理屏幕,可用于管理和创建该类型的帖子。

要注册新的帖子类型,您可以使用register_post_type() 函数。

警报:
我们建议您将自定义帖子类型放在插件中而不是主题中。这可确保即使主题发生变化,用户内容仍可移植。

以下最小示例注册了一个新的帖子类型 Products,它在数据库中被标识为wporg_product.

function wporg_custom_post_type() {
	register_post_type('wporg_product',
		array(
			'labels'      => array(
				'name'          => __('Products', 'textdomain'),
				'singular_name' => __('Product', 'textdomain'),
			),
				'public'      => true,
				'has_archive' => true,
		)
	);
}
add_action('init', 'wporg_custom_post_type');

请访问register_post_type()的参考页面 以获取参数说明。

警告:
你必须在挂机register_post_type()admin_initafter_setup_theme挂机后调用。一个很好用的钩子是init动作钩子。

命名最佳实践

使用与您的插件、主题或网站相对应的短前缀为您的帖子类型函数和标识符添加前缀很重要。

警告:
**确保您的自定义帖子类型标识符不超过 20 个字符,**因为post_type数据库中的列当前是该长度的 VARCHAR 字段。

警告:
为了确保向前兼容,不要使用**wp_**作为你的标识符——它被 WordPress 核心使用。

警告:
如果您的标识符过于通用(例如:“ product”),它可能会与选择使用相同标识符的其他插件或主题发生冲突。

笔记:
如果不禁用其中一种冲突的帖子类型,则无法解决重复的帖子类型标识符。

网址

自定义帖子类型在网站 URL 结构中有自己的 slug。

默认情况下,帖子类型wporg_product将使用以下 URL 结构:http://example.com/wporg_product/%product_name%

wporg_product是您的自定义帖子类型的 slug 并且%product_name%是您的特定产品的 slug 。

最终的永久链接将是:http://example.com/wporg_product/wporg-is-awesome

您可以在编辑屏幕上看到自定义帖子类型的永久链接,就像默认帖子类型一样。

自定义帖子类型的自定义 Slug

要为自定义帖子类型的 slug 设置自定义 slug,您需要做的就是将键 => 值对添加到参数数组rewrite中的键register_post_type()

例子:

function wporg_custom_post_type() {
	register_post_type('wporg_product',
		array(
			'labels'      => array(
				'name'          => __( 'Products', 'textdomain' ),
				'singular_name' => __( 'Product', 'textdomain' ),
			),
			'public'      => true,
			'has_archive' => true,
			'rewrite'     => array( 'slug' => 'products' ), // my custom slug
		)
	);
}
add_action('init', 'wporg_custom_post_type');

以上将导致以下 URL 结构:http://example.com/products/%product_name%

警告:
使用像这样的通用 slugproducts可能会与其他插件或主题发生冲突,因此请尝试使用更适合您的内容的插件。

笔记:
与自定义帖子类型标识符不同,重复的 slug 问题可以通过更改其中一种冲突帖子类型的 slug 轻松解决。

如果插件作者包含apply_filters()对参数的调用,则可以通过覆盖通过函数提交的参数以编程方式完成register_post_type()