Erhalten Sie Post-Typen nur basierend auf Support

9

Ich versuche, eine Liste mit integrierten und benutzerdefinierten Beitragstypen abzurufen:

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

Das obige funktioniert fast, aber ich möchte das attachmentvon dieser Liste ausschließen und nur Post-Typen mit spezifischer Unterstützung wie editor, titleund zurückgeben thumbnail. Ist das möglich?

Cyclonecode
quelle

Antworten:

9

Ich fand heraus, dass get_post_types_by_support()dies die Lösung zu sein scheint, um das gewünschte Ergebnis zu erzielen:

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

Das oben Gesagte wird zurückgegeben post, pageund jeder benutzerdefinierte Beitragstyp, der unterstützt title, editorund thumbnail.

Da dies auch private Post-Typen zurückgibt, können wir die Liste durchlaufen und prüfen, ob der Typ im Frontend angezeigt wird. Dies kann mithilfe der folgenden is_post_type_viewable()Funktion erfolgen:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}
Cyclonecode
quelle
Nur eine Anmerkung: Dies wird in den meisten Fällen funktionieren .
Cybmeta
4

get_post_types()Akzeptiert ein Array von Argumenten, die mit den Feldern eines Post-Typ-Objekts übereinstimmen . Sie könnten also so etwas tun (nicht getestet):

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

Leider können Sie in dieser Funktion nichts wie "ausschließen" festlegen, und Sie erhalten auch nur Beitragstypen, die genau unterstützen 'editor', 'title', 'thumbnail' , nicht mehr und nicht weniger.

Oder Sie können verwenden get_post_types_by_support()(nur für WP 4.5 und höher. Beachten Sie auch, dass Sie mit dieser Funktion auch bestimmte Beitragstypen nicht ausschließen können, aber für den speziellen Fall der Unterstützung für editor, title, thumbnailwird der Beitragstyp für Anhänge in den meisten Fällen ausgeschlossen).

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

Wenn Sie etwas wollen, das auf jeden Fall funktioniert, würde ich versuchen, Post-Typen basierend auf breiteren Kriterien zu erhalten, und dann Ihr eigenes Array erstellen, ungefähr so:

$_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
quelle
Verwenden supportsscheint nicht zu funktionieren? Ich habe einen benutzerdefinierten Beitragstyp, der unterstützt, editorund wenn ich ihn verwende, supports => array('editor')erhalte ich ein leeres Ergebnis. Ihr zweiter Ansatz scheint jedoch zu funktionieren.
Cyclonecode
2
Es scheint, als könnten wir get_post_types_by_support()Unterstützung gebrauchen, um dies zu erreichen.
Cyclonecode
0

Der einfachste Ansatz für die Frage des OP wäre, einfach "Anhang" aus dem zurückgegebenen Array zu entfernen.

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

Es ist zwar nicht so elegant wie die anderen Lösungen, hat aber den geringsten Overhead.

Wille
quelle