Get all Custom Post Types

时间:2014-12-21 作者:richerimage

我正在创建一个带有内置自定义帖子类型的WP主题(我正在使用WPAlchemy添加两个自定义元数据库)。

$theme_custom_metabox = new WPAlchemy_MetaBox(
  array(
    \'id\' => \'my_metabox\',
    \'title\' => \'Custom Metabox\',
    \'context\' => \'normal\',
    \'autosave\' => TRUE,
    \'types\' => array(\'post\', \'page\', \'theme_custom_post_type\'), // Can I add all custom_post_types by default here?
    \'priority\' => \'high\',
    \'mode\' => WPALCHEMY_MODE_EXTRACT,
    \'template\' => MY_PATH . \'/includes/my_theme/metaboxes/my_metabox.php\',
));
原因:“开箱即用”,WPAlchemny要求您在“types”数组中列出post\\u类型-如果您知道所有post_types 正在使用,但这是一个要发布的主题,因此实际使用的CPT未知。

我希望主题以编程方式将其元盒添加到用户将添加的任何自定义\\u post\\u类型。

我想最合理的方法是将所有CPT存储在一个变量中。例如:

$all_cpt = all_custom_post_keys();

...
\'types\' => $all_cpt,
...

1 个回复
SO网友:kaiser

轻松的列表筛选global $wp_post_types 例如,用于get_post_type_object( $name );, register_post_type(), 等

如果要忽略随core提供的内容,则应过滤返回的列表,并跳过所有包含_builtin 键设置为true. 仅使用wp_list_filter() 为此

$cpts = wp_list_filter( $GLOBALS[\'wp_post_types\'], array( \'_builtin\' => false, ) );
运行时收集另一种方法:在post类型注册结束时(register_post_type()) 进程中,有一个操作正在运行:

do_action( \'registered_post_type\', $post_type, $args );
根据您的用例,此操作可能是获取所有帖子类型的好地方,因为core使用create_initial_post_types() 其中使用register_post_type() 它本身。它还允许您获取延迟注册的帖子类型。

add_action( \'registered_post_type\', function( $pt, $args )
{
    static $cpts = array();

    if (
        ! $args->_builtin 
        and ! in_array( $args->name, array_keys( $cpts ) ) 
    )
        $cpts[ $args->name ] = $args;

    // here, $cpts gets constant updates as soon as a new post type is registered
    // ignores already added post types by name
    // also ignores cores `_builtin` post types

}, 20, 2 );

结束