Obține lista tipurilor de postări personalizate înregistrate
Cum pot obține o listă cu toate tipurile de postări personalizate înregistrate și să le afișez pe orice pagină template.
Am un cod care arată astfel.
<?php
/**
* Template Name: Lista Tipuri de Postări Personalizate
*/
get_header();
$args=array(
'public' => true,
'exclude_from_search' => false,
'_builtin' => false
);
$output = 'names'; // names sau objects, names este implicit
$operator = 'and'; // 'and' sau '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();
?>

Codul tău arată bine. Totuși, poți încerca următoarele coduri pentru a obține toate postările personalizate:
$args = array(
'public' => true,
'_builtin' => false,
);
$output = 'names'; // nume sau obiecte, implicit este 'names'
$operator = 'and'; // 'and' sau 'or'
$post_types = get_post_types( $args, $output, $operator );
foreach ( $post_types as $post_type ) {
echo '<p>' . $post_type . '</p>';
}
?>
De asemenea, poți folosi o serie de argumente pentru a filtra rezultatele mai detaliat. Pentru o listă detaliată a argumentelor, poți consulta pagina oficială WordPress Codex: https://codex.wordpress.org/Function_Reference/get_post_types

Dacă dorești să obții toate tipurile de postări ca o listă, trebuie să folosești funcția get_post_types și să parcurgi rezultatele cu un foreach
.
<?php
// Obține Toate Tipurile de Postări ca Listă
foreach ( get_post_types( '', 'names' ) as $post_type ) {
echo '<p>'.$post_type.'</p>';
}
?>
Aceste 2 linii de cod pot lista toate tipurile de postări înregistrate. Dacă dorești să afli mai multe despre această funcție get_post_types, vizitează pagina oficială din wp codex: https://codex.wordpress.org/Function_Reference/get_post_types

global $wp_post_types;
$posttypes = array_keys( $wp_post_types );
// Elimină _builtins sau alte tipuri nedorite
$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( 'Nu există clienți în taxonomia de terapie!', 'text-domain' );
endif;
?>
Când este apelat noul WP_Query, sunt preluați clienții relevanți și putem parcurge lista lor. În buclă afișăm simplu titlul și conținutul clientului într-o listă simplă.

Codul tău este corect. Problema ta este în momentul executării ambelor acțiuni:
- Înregistrarea CPT (Custom Post Type)
- Apelarea funcției de tip post pe care ai scris-o.
Ai una din cele 2 soluții:
Soluția 1:
Asigură-te că CPT-ul tău este înregistrat cu o prioritate mai mare înainte de a apela funcția get_post_types
.
Soluția 2:
Redu prioritatea funcției get_post_types
astfel încât să pornească după ce CPT-ul este înregistrat.
add_action('init', 'your_function_name', 10);
Sper că acest lucru te ajută.
Mulțumesc
