WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

get_post_types() WP 2.9.0

Возвращает существующие (зарегистрированные) типы записей. Можно фильтровать вывод по множеству критериев.

✈ 1 раз = 0.000001с = скорость света | 50000 раз = 0.14с = очень быстро | PHP 7.1.11, WP 4.9.8

Хуков нет.

Возвращает

Массив. Список названий типов записей или массив объектов (вывод настраивается в параметре $output).

Использование

get_post_types( $args, $output, $operator );
$args(массив)

Массив критериев, по которым будут выбраны типы записей. Значение каждого параметра смотрите в описании функции register_post_type().

name                 => page
label                => Страницы
labels               => stdClass Object()
description          =>
public               => 1
hierarchical         => 1
exclude_from_search  =>
publicly_queryable   =>
show_ui              => 1
show_in_menu         => 1
show_in_nav_menus    => 1
show_in_admin_bar    => 1
menu_position        => 20
menu_icon            =>
capability_type      => page
map_meta_cap         => 1
register_meta_box_cb =>
taxonomies           => Array()
has_archive          =>
query_var            =>
can_export           => 1
delete_with_user     => 1
_builtin             => 1
_edit_link           => post.php?post=%d
cap                  => stdClass Object(
	edit_post              => edit_page
	read_post              => read_page
	delete_post            => delete_page
	edit_posts             => edit_pages
	edit_others_posts      => edit_others_pages
	publish_posts          => publish_pages
	read_private_posts     => read_private_pages
	read                   => read
	delete_posts           => delete_pages
	delete_private_posts   => delete_private_pages
	delete_published_posts => delete_published_pages
	delete_others_posts    => delete_others_pages
	edit_private_posts     => edit_private_pages
	edit_published_posts   => edit_published_pages
	create_posts           => edit_pages
)

rewrite                =>
show_in_rest           => 1
rest_base              => pages
rest_controller_class  => WP_REST_Posts_Controller
  • name
  • label
  • singular_label
  • description
  • public - Логический, если true, то выбраны будут только публичные типы записей (см. описание register_post_type()).
  • publicly_queryable
  • exclude_from_search
  • show_ui
  • capability_type
  • edit_cap
  • edit_type_cap
  • edit_others_cap
  • publish_others_cap
  • read_cap
  • delete_cap
  • hierarchical
  • supports
  • register_meta_box_cb
  • taxonomies
  • menu_position
  • menu_icon
  • permalink_epmask
  • rewrite
  • query_var
  • _builtin
    Логический. Если true, то будут возвращены встроенные типы записей WP: page, posts... false — вернет только новые типы записей.

    Типы записей относящиеся к критерию _builtin:

    • post
    • page
    • mediapage
    • attachment
    • revision
    • nav_menu_item — с версии 3.0
    • custom post type — с версии 3.0
  • _edit_link

По умолчанию: предустановки

$output(строка)

Как выводить результат. Возможны 2 варианта:

  • names— будет возвращен массив имен;
  • objects — будет возвращен массив объектов с данными типа записи.
    По умолчанию: 'names'
$operator(строка)
Оператор сравнения для указанных критериев. Может быть: 'and' и 'or'.
По умолчанию: 'and'

Примеры

#1 Выведем на экран список названий всех зарегистрированных типов записей

Выведет зарегистрированные типы записей:

$post_types = get_post_types();

/* $post_types =
Array (
	[post] => post
	[page] => page
	[attachment] => attachment
	[revision] => revision
	[nav_menu_item] => nav_menu_item
	[article] => article
	[question] => question
)
*/

foreach( $post_types as $post_type ) {
	echo $post_type ."\n";
}

/* Выведет:
post
page
attachment
revision
nav_menu_item
article
func
*/

#2 Выведем на экран список типов записей имеющих страницу во форонте

$post_types = get_post_types( [ 'publicly_queryable'=>1 ] );
$post_types['page'] = 'page';       // встроенный тип не имеет publicly_queryable
unset( $post_types['attachment'] ); // удалим attachment
/*
Array
	[post]         => post
	[custom_type1] => custom_type1
	[custom_type2] => custom_type2
	[custom_type3] => custom_type3
	[page]         => page
*/

#3 Выведем на экран список всех публичных, произвольных (созданных) типов записей

$args = array(
	'public'   => true,
	'_builtin' => false
);
$output   = 'names'; // names or objects, note names is the default
$operator = 'and';   // 'and' or 'or'
$post_types = get_post_types( $args, $output, $operator );
foreach ( $post_types as $post_type ) {
	echo '<p>'. $post_type. '</p>';
}

#4. Пример, получение типа записи по названию

Здесь используется вывод в виде объекта данных (object). Выводим тип записи с названием property:

$post_types = get_post_types( [ 'name'=>'property' ], 'objects' );

foreach ( $post_types as $post_type ) {
	echo '<p>' . $post_type->name . '</p>';
}

Заметки

  • Global. Массив. $wp_post_types List of post types.
  • Смотрите: register_post_type() for accepted arguments.

Список изменений

С версии 2.9.0 Введена.

Код get post types: wp-includes/post.php WP 5.4.2

<?php
function get_post_types( $args = array(), $output = 'names', $operator = 'and' ) {
	global $wp_post_types;

	$field = ( 'names' == $output ) ? 'name' : false;

	return wp_filter_object_list( $wp_post_types, $args, $operator, $field );
}

Cвязанные функции

Из метки: post_type (произвольный тип записи)

Еще из раздела: Типы записей

5 комментов
  • Игорь

    у тебя в описании функции register_post_type есть пример #1 Регистрация нового типа записи
    вставляю этот пример в functions.php, далее сразу после него вставляю код

    $post_types = get_post_types( array( '_builtin' => false ), 'names' );
    print_r($post_types);
    

    да да, print_r в functions.php, не суть. смысл в том, что массив почему-то пустой.

    что-то не так с приоритетами и вордпресс еще не видит созданного post_type?

    если этот print_r вставить, например, в файл 404.php, а затем открыть на сайте любую несуществующую страницу, то там массив будет уже со всеми созданными post_type

    2
    Ответить22.Мар.2017 20:22 #
    • campusboy3542 www.youtube.com/c/wpplus

      Значит функция get_post_types вызвалась до того, как были зарегистрированы типы записей.

      1
      Ответить22.Мар.2017 23:29 #
    • Kama7752

      Там в примере, функция вешается на хук init который срабатывает после подключения functions.php... Я уже не раз об этом писал и в начале описания register_post_type() об этом упоминается. Не понятны мне такие вопросы unknw

      1
      Ответить22.Мар.2017 23:41 #
  • Сергей -

    Добрый вечер, делаю темы по вашим урокам, спасиби вам огромное за ваш портал.
    Сейчас столкнулся с проблемой.
    В произвольном типе поста не могу указать родительскую страницу.
    У меня есть тип записи Вакансии
    Так-же есть страница Вакансии там где я вывожу этот тип записи.
    Но при переходе в этот тип записи у меня не правильно собирается путь к этому посту.

    У меня есть страница с вакансиями по адресу
    http://localhost/wordpress/вакансии/

    Также есть произвольный тип записи

    // Регистрируем тип произвольных записей
    add_action( 'init', 'register_post_types' );
    register_post_type('post-type-3', array(
    			'label'  => null,
    			'labels' => array(
    				'name'               => 'Вакансии', // основное название для типа записи
    				'singular_name'      => 'Career', // название для одной записи этого типа
    				'add_new'            => 'Добавить вакансию', // для добавления новой записи
    				'add_new_item'       => 'Добавление вакансии', // заголовка у вновь создаваемой записи в админ-панели.
    				'edit_item'          => 'Редактирование вакансии', // для редактирования типа записи
    				'new_item'           => 'Новое ____', // текст новой записи
    				'view_item'          => 'Смотреть вакансию', // для просмотра записи этого типа.
    				'search_items'       => 'Искать позицию', // для поиска по этим типам записи
    				'not_found'          => 'Вакансия не найдена', // если в результате поиска ничего не было найдено
    				'not_found_in_trash' => 'Вакансия не найдена в корзине', // если не было найдено в корзине
    				'parent_item_colon'  => '', // для родителей (у древовидных типов)
    				'menu_name'          => 'Вакансии', // название меню
    			),
    			'description'         => '',
    			'public'              => true,
    			// 'publicly_queryable'  => null, // зависит от public
    			// 'exclude_from_search' => null, // зависит от public
    			// 'show_ui'             => null, // зависит от public
    			// 'show_in_nav_menus'   => null, // зависит от public
    			'show_in_menu'        => null, // показывать ли в меню адмнки
    			// 'show_in_admin_bar'   => null, // зависит от show_in_menu
    			'show_in_rest'        => null, // добавить в REST API. C WP 4.7
    			'rest_base'           => null, // $post_type. C WP 4.7
    			'menu_position'       => null,
    			'menu_icon'           => null,
    			//'capability_type'   => 'post',
    			//'capabilities'      => 'post', // массив дополнительных прав для этого типа записи
    			//'map_meta_cap'      => null, // Ставим true чтобы включить дефолтный обработчик специальных прав
    			// 'hierarchical' => true,
    			'supports' => ['title','editor','thumbnail','excerpt','custom-fields','page-attributes','post-formats'], // 'title','editor','author','thumbnail','excerpt','trackbacks','custom-fields','comments','revisions','page-attributes','post-formats'
    			// 'taxonomies' => array('category', 'post_tag'),
    			'has_archive'         => false,
    			'rewrite'             => true,
    			'query_var'           => true,
    			'menu_icon'             => 'dashicons-category', // иконка в меню
    		) );

    Сейчас если я перехожу на эту запись у меня в URL такая ссылка
    http://localhost/wordpress/post-type-3/новая-вакансия-3/

    А мне нужно чтоб ссылка была такая
    http://localhost/wordpress/вакансии/новая-вакансия-3/

    Сейчас просто даже пункт меню "Вакансии" не выделяется активным и в крошки не попадает родитель, я хотел бы иметь возможность указывать родительскую страницу.

    Ответить12.Мар.2020 04:30 #
    • Евген

      Мб, изменить
      register_post_type('post-type-3',
      на
      register_post_type('вакансии',

      ?)

      Ответить14.Апр.2020 02:31 #