Erhalten Sie alle benutzerdefinierten Beitragstypen

Ich erstelle ein WP-Theme mit einem integrierten benutzerdefinierten Post-Typ (und verwende WPAlchemy, um ein paar benutzerdefinierte Metaboxen hinzuzufügen).

$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', )); 

Grund: ‘Out of the box’, WPAlchemny verlangt, dass Sie die post_types im ‘types’-Array auflisten – das funktioniert gut, wenn Sie alle verwendeten post_types kennen, aber dies ist ein zu versendendes Thema, das die tatsächlichen CPTs verwenden würde unbekannt sein.

Ich möchte, dass das Thema seine Metaboxen programmatisch zu beliebigen custom_post_types hinzufügt, die der Benutzer hinzufügen würde.

Ich denke, der logischste Weg wäre, alle CPTs in einer Variablen zu speichern. z.B:

 $all_cpt = all_custom_post_keys(); ... 'types' => $all_cpt, ... 

Solutions Collecting From Web of "Erhalten Sie alle benutzerdefinierten Beitragstypen"

Einfache Listenfilterung

Es gibt die global $wp_post_types die zB in get_post_type_object( $name ); , register_post_type() usw.

Wenn Sie die mit core gelieferten _builtin weglassen möchten, sollten Sie die zurückgegebene Liste filtern und alles überspringen, für das der Schlüssel _builtin auf true . Verwenden Sie dazu wp_list_filter()

 $cpts = wp_list_filter( $GLOBALS['wp_post_types'], array( '_builtin' => false, ) ); 

Laufzeit-Sammlung

Ein anderer Weg, um dies zu erreichen: Am Ende des processes zur Registrierung des Post-Typs ( register_post_type() ) läuft eine Aktion:

 do_action( 'registered_post_type', $post_type, $args ); 

Diese Aktion ist – abhängig von Ihrem Anwendungsfall – ein guter Ort, um alle Post-Typen abzurufen, da core seine eigenen Post-Typen mit create_initial_post_types() register_post_type() die register_post_type() selbst verwenden. Es ermöglicht Ihnen auch, Post-Typen abzurufen, die spät registriert werden.

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