函数简介
描述
另请参阅
- register_post_type(): 用于接受的参数。
参数
$args 数组|字符串 自选
一个 key => 值参数数组,用于与 post 类型对象匹配。
默认:array()
$output 字符串 自选
要返回的输出类型。'names' 、'objects' 或 'names'
默认:'names'
$operator 字符串 自选
要执行的逻辑作。 表示数组中只有一个元素需要匹配; 表示所有元素都必须匹配; 表示不能匹配任何元素。'or'、'not' 或 'and'
默认:'and'
返回
字符串[] | WP_Post_Type[] 帖子类型名称或对象的数组。
判断值
预设:
$args = array(
'public' => true,
'_builtin' => false
);
$output = 'names'; // 'names' or 'objects' (default: 'names')
$operator = 'and'; // 'and' or 'or' (default: 'and')
$post_types = get_post_types( $args, $output, $operator );判断:
if ( ! empty($post_types) ) {}if ($post_types) {}【实现代码】所有公开的自定义文章类型
将排除 WordPress 内置的公共文章类型(post、page、attachment、revision、nav_menu_item)
$args = array(
'public' => true,
'_builtin' => false
);
$output = 'names'; // 'names' or 'objects' (default: 'names')
$operator = 'and'; // 'and' or 'or' (default: 'and')
$post_types = get_post_types( $args, $output, $operator );
if ( $post_types ) { // If there are any custom public post types.
echo '<ul>';
foreach ( $post_types as $post_type ) {
echo '<li>' . $post_type . '</li>';
}
echo '</ul>';
}【实现代码】所有公开的系统默认文章类型
$args = array(
'public' => true,
'_builtin' => true
);
$output = 'names'; // 'names' or 'objects' (default: 'names')
$operator = 'and'; // 'and' or 'or' (default: 'and')
$post_types = get_post_types( $args, $output, $operator );
if ( $post_types ) { // If there are any custom public post types.
echo '<ul>';
foreach ( $post_types as $post_type ) {
echo '<li>' . $post_type . '</li>';
}
echo '</ul>';
}确保在自定义文章类型注册后获取所有公开文章类型
核心代码
$post_types = get_post_types(array(
'public' => true,
), 'objects');常见问题
这段代码中,有时会将系统内置文章类型和自定义文章类型都获取到,但是有时候却只能获取到系统内置文章类型没有自定义文章类型。
造成原因:
这通常是因为代码的执行时机不当,导致在自定义文章类型注册之前就执行了查询。
解决方案:
为确保代码在自定义文章类型注册后执行,关键在于选择在注册之后触发且优先级更高的钩子。只有这样才能同时将自定义文章类型一并获取。
下面这个表格整理了可行的钩子及其特点,帮助您根据情况选择:
| 钩子名称 | 执行时机与特点 | 适用场景 |
|---|---|---|
init | WordPress初始化时执行,最常用于注册CPT。默认优先级10。 | 标准选择。为确保在CPT注册后执行,可设置更高优先级(如11)。 |
wp_loaded | 在init之后执行,标志WordPress核心完全加载完成。 | 若不确定其他代码的注册时机,或需在WordPress环境完全准备好后运行代码时可尝试。 |
admin_init | 仅在后端管理界面触发,在init之后执行。 | 仅需在后端获取文章类型时使用。前端不触发,故前端逻辑不适用。 |
plugins_loaded | 在插件加载后、init之前触发。 | 不适用于获取CPT,因其执行时CPT通常尚未注册。 |
核心:利用优先级控制执行顺序
在WordPress中,钩子的优先级数字越小,越先执行。因此,确保您的代码在自定义文章类型注册之后执行,核心在于设置一个更高的优先级数字。
例如,如果自定义文章类型在 init 钩子上以默认优先级10注册,那么您的查询代码可以使用优先级11:
// 注册自定义文章类型 (优先级10)
add_action('init', 'register_my_cpt', 10);
function register_my_cpt() {
// 使用 register_post_type() 注册代码...
}
// 您的查询代码 (优先级11, 在CPT注册后执行)
add_action('init', 'my_get_post_types_function', 11);
function my_get_post_types_function() {
$post_types = get_post_types(array(
'public' => true,
), 'objects');
// ... 您的后续逻辑
}如果您不清楚自定义文章类型注册的具体优先级,或者想确保您的代码几乎最后执行,可以使用一个非常大的优先级数字,例如99。

