Получать только типы сообщений на основе поддержки

9

Я пытаюсь получить список, включающий как встроенные, так и пользовательские типы сообщений:

$post_types = get_post_types(array(
  'public' => TRUE,
), 'objects');

Вышеуказанное почти работает, но я хотел бы исключить attachmentиз этого списка только возвращаемые типы сообщений с определенной поддержкой, такой как editor, titleи thumbnail. Это возможно?

Cyclonecode
источник

Ответы:

9

Я обнаружил, что, get_post_types_by_support()кажется, решение для получения желаемого результата:

$post_types = get_post_types_by_support(array('title', 'editor', 'thumbnail'));

Выше будет возвращать post, pageи любой пользовательский тип поста , который поддерживает title, editorи thumbnail.

Так как это также вернет приватные типы записей, мы могли бы пройтись по списку и проверить, доступен ли тип для просмотра во внешнем интерфейсе. Это можно сделать с помощью is_post_type_viewable()функции:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}
Cyclonecode
источник
Просто примечание: это будет работать в большинстве случаев.
Cybmeta
4

get_post_types()принимает массив аргументов, чтобы соответствовать полям объекта типа записи . Итак, вы можете сделать что-то вроде этого (не проверено):

$post_types = get_post_types(array(
  'public'   => true,
  'supports' => array( 'editor', 'title', 'thumbnail' )
), 'objects');

К сожалению, вы не можете установить что-то вроде «исключить» в этой функции, а также вы получаете только те типы сообщений, которые поддерживают точно 'editor', 'title', 'thumbnail' , не больше и не меньше.

Или вы можете использовать get_post_types_by_support()(только для WP 4.5 и выше. Также обратите внимание, что вы не можете исключить определенные типы записей с помощью этой функции, но для конкретного случая поддержки editor, title, thumbnail, тип сообщения вложения будет исключен в большинстве случаев).

$post_types = get_post_types_by_support( array( 'editor', 'title', 'thumbnail' ) );

Если вы хотите что-то, что будет работать в любом случае, я постараюсь получить типы постов на основе более широких критериев, а затем создать свой собственный массив, что-то вроде этого:

$_post_types = get_post_types_by_support( array( 'editor', 'title', 'thumbnail' ) );

$post_types = [];

foreach($_post_types as $post_type) {
    // In most cases, attachment post type won't be here, but it can be
    if( $post_type->name !== 'attachment' ) {
        $post_types[] = $post_type;
    }
}
cybmeta
источник
Использование supportsне похоже на работу? У меня есть пользовательский тип сообщения, который поддерживает, editorи если я использую, supports => array('editor')я получаю пустой результат? Ваш второй подход, похоже, работает.
Cyclonecode
2
Кажется, что мы могли бы использовать get_post_types_by_support()поддержку, чтобы достичь этого.
Циклон-код
0

Простейший подход к вопросу OP состоит в том, чтобы просто удалить «вложение» из возвращенного массива;

$post_types = get_post_types(array('public' => TRUE,), 'objects');
unset($post_types['attachment']);

Хотя он не так элегантен, как другие решения, он имеет наименьшие накладные расходы.

Будет
источник