Obtenir uniquement les types de publication en fonction du support

9

J'essaie de récupérer une liste comprenant à la fois les types de publication intégrés et personnalisés:

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

Ce qui précède fonctionne presque, mais je voudrais exclure le attachmentde cette liste, ne renvoyant que les types de messages avec un support spécifique tels que editor, titleet thumbnail. Est-ce possible?

Cyclonecode
la source

Réponses:

9

J'ai découvert que cela get_post_types_by_support()semble être la solution pour obtenir le résultat souhaité:

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

Ce qui précède reviendra post, pageet tout type de publication personnalisé qui prend en charge title, editoret thumbnail.

Comme cela retournera également des types de publication privés, nous pourrions parcourir la liste et vérifier si le type est visible sur le frontend. Cela peut être fait en utilisant la is_post_type_viewable()fonction:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}
Cyclonecode
la source
Juste une note: cela fonctionnera dans la plupart des cas.
cybmeta
4

get_post_types()accepte un tableau d'arguments pour correspondre aux champs d'un objet de type post . Donc, vous pouvez faire quelque chose comme ça (non testé):

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

Malheureusement, vous ne pouvez pas définir quelque chose comme "exclure" dans cette fonction, et vous n'obtenez que des types de messages qui prennent en charge exactement 'editor', 'title', 'thumbnail' , ni plus ni moins.

Ou vous pouvez utiliser get_post_types_by_support()(uniquement pour WP 4.5 et supérieur. Notez également que vous ne pouvez pas non plus exclure des types de publication spécifiques avec cette fonction, mais pour le cas spécifique de prise en charge de editor, title, thumbnail, le type de publication de pièce jointe sera exclu dans la plupart des cas).

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

Si vous voulez quelque chose qui fonctionnera dans tous les cas, j'essaierais d'obtenir des types de publication basés sur des critères plus larges, puis de créer votre propre tableau, quelque chose comme ceci:

$_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
la source
L'utilisation supportsne semble pas fonctionner? J'ai un type de publication personnalisé qui prend en charge editoret si j'utilise supports => array('editor')j'obtiens un résultat vide? Votre deuxième approche semble fonctionner.
Cyclonecode
2
Il semble que nous pourrions utiliser le get_post_types_by_support()support pour y parvenir.
Cyclonecode du
0

L'approche la plus simple pour la question de l'OP serait de simplement annuler la «connexion» du tableau renvoyé;

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

Bien qu'il ne soit pas aussi élégant que les autres solutions, il a le moins de frais généraux.

Volonté
la source