Otrzymuj tylko typy postów oparte na wsparciu

9

Próbuję pobrać listę obejmującą zarówno wbudowane, jak i niestandardowe typy postów:

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

Powyższy prawie działa, ale chciałbym, aby wykluczyć attachmentz tej listy, tylko wracając pocztowych typy z obsługą konkretnego takich jak editor, titlei thumbnail. czy to możliwe?

Kod cyklonowy
źródło

Odpowiedzi:

9

Okazało się, że get_post_types_by_support()wydaje się to rozwiązaniem, aby uzyskać pożądany wynik:

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

Powyższy zamian post, pagea każdy niestandardowy typ post, który wspiera title, editori thumbnail.

Ponieważ to również zwróci prywatne typy postów, możemy przeglądać listę i sprawdzać, czy typ jest widoczny na interfejsie użytkownika. Można to zrobić za pomocą is_post_type_viewable()funkcji:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}
Kod cyklonowy
źródło
Tylko uwaga: w większości przypadków będzie to działać .
cybmeta
4

get_post_types()akceptuje tablicę argumentów zgodną z polami obiektu typu post . Więc możesz zrobić coś takiego (nie testowane):

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

Niestety w tej funkcji nie można ustawić czegoś takiego jak „wykluczenie”, a także otrzymujesz tylko typy postów, które dokładnie obsługują 'editor', 'title', 'thumbnail', nie więcej i nie mniej.

Lub możesz użyć get_post_types_by_support()(tylko dla WP 4.5 i nowszych. Pamiętaj też, że nie można wykluczyć określonych typów postów za pomocą tej funkcji, ale w konkretnym przypadku wsparcia dla editor, title, thumbnailtypu postu załącznik zostanie w większości przypadków wykluczony ).

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

Jeśli chcesz czegoś, co zadziała w każdym przypadku, postaram się uzyskać typy postów oparte na szerszych kryteriach, a następnie zbuduj własną tablicę, coś takiego:

$_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
źródło
Korzystanie supportsnie wydaje się działać? Mam niestandardowy typ posta, który obsługuje, editora jeśli go używam supports => array('editor'), otrzymuję pusty wynik? Twoje drugie podejście wydaje się jednak działać.
Kod cyklonowy
2
Wygląda na to, że moglibyśmy skorzystać ze get_post_types_by_support()wsparcia, aby to osiągnąć.
Kod cyklonowy
0

Najprostszym podejściem do pytania PO byłoby po prostu usunięcie „przywiązania” ze zwróconej tablicy;

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

Chociaż nie jest tak elegancki jak inne rozwiązania, ma najmniejszy narzut.

Będzie
źródło