Ottenere la lista dei tipi di post personalizzati registrati
Come posso ottenere un elenco di tutti i tipi di post personalizzati registrati e mostrarli in qualsiasi pagina template.
Ho un codice come questo.
<?php
/**
* Nome Template: Lista Tipi di Post Personalizzati
*/
get_header();
$args=array(
'public' => true,
'exclude_from_search' => false,
'_builtin' => false
);
$output = 'names'; // names o objects, nota che names è il valore predefinito
$operator = 'and'; // 'and' oppure 'or'
$post_types = get_post_types($args,$output,$operator);
$posttypes_array = array();
foreach ($post_types as $post_type ) {
$posttypes_array[] = $post_type;
}
echo "<pre>";
print_r($posttypes_array);
echo "</pre>";
get_footer();
?>

Il tuo codice sembra corretto. Tuttavia, puoi provare i seguenti codici per ottenere tutti i post personalizzati:
$args = array(
'public' => true,
'_builtin' => false,
);
$output = 'names'; // names o objects, nota che names è il valore predefinito
$operator = 'and'; // 'and' o 'or'
$post_types = get_post_types( $args, $output, $operator );
foreach ( $post_types as $post_type ) {
echo '<p>' . $post_type . '</p>';
}
?>
Puoi anche utilizzare diversi argomenti per filtrare maggiormente il tuo risultato. Per la lista completa degli argomenti puoi consultare la pagina ufficiale del Codex di WordPress: https://codex.wordpress.org/Function_Reference/get_post_types

Se vuoi ottenere tutti i tipi di post come un elenco, devi usare la funzione get_post_types e iterare sui risultati con un foreach
.
<?php
// Ottieni tutti i tipi di post come elenco
foreach ( get_post_types( '', 'names' ) as $post_type ) {
echo '<p>'.$post_type.'</p>';
}
?>
Queste 2 righe di codice possono elencare tutti i tuoi tipi di post registrati. Se vuoi saperne di più su questa funzione get_post_types visita la pagina ufficiale del codex di wp: https://codex.wordpress.org/Function_Reference/get_post_types

global $wp_post_types;
$posttypes = array_keys( $wp_post_types );
// Rimuovi i tipi di post predefiniti o altri
$pt_remove = array("attachment","nav_menu_item","customize_changeset","revision");
foreach ( $posttypes as $posttype ):
if ( in_array($posttype, $pt_remove) ) continue;
$posttype_names[ $posttype ] = $posttype;
endforeach;
echo "<pre>";
print_r($posttype_names);
echo "</pre>";

<?php
$args = array(
'post_type' => 'clients',
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'clients_service',
'field' => 'slug',
'terms' => 'therapy'
)
)
);
$testimonials = new WP_Query( $args );
if( $testimonials->have_posts() ) :
?>
<ul>
<?php
while( $testimonials->have_posts() ) :
$testimonials->the_post();
?>
<li><?php printf( '%1$s - %2$s', get_the_title(), get_the_content() ); ?></li>
<?php
endwhile;
wp_reset_postdata();
?>
</ul>
<?php
else :
esc_html_e( 'Nessun cliente nella tassonomia terapia!', 'text-domain' );
endif;
?>
Quando viene chiamato il nuovo WP_Query, vengono recuperati i clienti rilevanti e possiamo iterare attraverso di essi. Nel ciclo semplicemente mostriamo il titolo e il contenuto del cliente in una semplice lista.

Il tuo codice è corretto. Il problema sta nel momento in cui vengono eseguiti entrambi:
- La registrazione del CPT (Custom Post Type)
- La chiamata alla funzione del tipo di post che hai scritto.
Hai due possibili soluzioni:
Soluzione 1:
Assicurati che il tuo CPT sia registrato con una priorità più alta prima di chiamare la funzione get_post_types
.
Soluzione 2:
Riduci la priorità di get_post_types
in modo che parta dopo che il CPT è stato registrato.
add_action('init', 'nome_tua_funzione', 10);
Spero che questo ti aiuti.
Grazie
