Отримуйте лише типи публікацій на основі підтримки


9

Я намагаюся отримати список, включаючи вбудовані та власні типи публікацій:

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

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

Відповіді:


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]);
  }
}

Лише зауваження: це спрацює в більшості випадків.
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;
    }
}

Використання supports, здається, не працює? У мене є власний тип публікації, який підтримує, editorі якщо я використовую, supports => array('editor')я отримую порожній результат? Здається, ваш другий підхід працює.
Циклонекод

2
Схоже, ми могли б використовувати get_post_types_by_support()підтримку, щоб досягти цього.
Циклонекод

0

Найпростішим підходом до питання ОП було б просто зняти «вкладення» з повернутого масиву;

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

Хоча він не такий елегантний, як інші рішення, він має найменші витрати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.