Получить список зарегистрированных произвольных типов записей
Как получить список всех зарегистрированных произвольных типов записей и показать их на любой странице шаблона.
У меня есть такой код.
<?php
/**
* Template Name: Список произвольных типов записей
*/
get_header();
$args=array(
'public' => true,
'exclude_from_search' => false,
'_builtin' => false
);
$output = 'names'; // names или objects, по умолчанию names
$operator = 'and'; // 'and' или '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();
?>

Ваш код выглядит хорошо. Однако, вы можете попробовать следующий код для получения всех пользовательских типов записей:
$args = array(
'public' => true,
'_builtin' => false,
);
$output = 'names'; // names или objects, по умолчанию используется names
$operator = 'and'; // 'and' или 'or'
$post_types = get_post_types( $args, $output, $operator );
foreach ( $post_types as $post_type ) {
echo '<p>' . $post_type . '</p>';
}
?>
Вы также можете использовать множество аргументов для более точной фильтрации результатов. Для получения полного списка аргументов вы можете посетить официальную страницу WordPress Codex: https://codex.wordpress.org/Function_Reference/get_post_types

Если вам нужно получить все типы записей в виде списка, используйте функцию get_post_types и пройдитесь по результатам с помощью цикла foreach
.
<?php
// Получаем все типы записей в виде списка
foreach ( get_post_types( '', 'names' ) as $post_type ) {
echo '<p>'.$post_type.'</p>';
}
?>
Эти две строки кода могут вывести список всех зарегистрированных типов записей. Если вы хотите узнать больше о функции get_post_types, посетите официальную страницу Codex WordPress: https://codex.wordpress.org/Function_Reference/get_post_types

global $wp_post_types;
$posttypes = array_keys( $wp_post_types );
// Удаляем встроенные типы записей и другие ненужные
$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( 'Нет клиентов в таксономии терапии!', 'text-domain' );
endif;
?>
Когда вызывается new WP_Query, извлекаются соответствующие клиенты, и мы можем пройтись по ним в цикле. В цикле мы просто выводим заголовок и содержимое клиента в виде простого списка.

Ваш код правильный. Проблема заключается в порядке выполнения двух действий:
- Регистрация CPT (Custom Post Type)
- Вызов функции вашего типа записи.
У вас есть два варианта решения:
Решение 1:
Убедитесь, что ваш CPT регистрируется с более высоким приоритетом, чем вызов функции get_post_types
.
Решение 2:
Понизьте приоритет get_post_types
, чтобы он выполнялся после регистрации CPT.
add_action('init', 'your_function_name', 10);
Надеюсь, это поможет.
Спасибо
