get_post_types() 获取文章类型

函数简介

描述

另请参阅

  • 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');

常见问题

这段代码中,有时会将系统内置文章类型和自定义文章类型都获取到,但是有时候却只能获取到系统内置文章类型没有自定义文章类型。

造成原因:

这通常是因为代码的执行时机不当,导致在自定义文章类型注册之前就执行了查询。

解决方案:

为确保代码在自定义文章类型注册后执行,关键在于选择在注册之后触发且优先级更高的钩子。只有这样才能同时将自定义文章类型一并获取。

下面这个表格整理了可行的钩子及其特点,帮助您根据情况选择:

钩子名称执行时机与特点适用场景
initWordPress初始化时执行,最常用于注册CPT。默认优先级10。标准选择。为确保在CPT注册后执行,可设置更高优先级(如11)。
wp_loadedinit之后执行,标志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。