Solo obtenga tipos de publicaciones según el soporte

9

Estoy tratando de recuperar una lista que incluye los tipos de publicaciones integradas y personalizadas:

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

Lo anterior casi funciona, pero me gustaría excluirlo attachmentde esta lista, solo devolviendo tipos de publicaciones con soporte específico como editor, titley thumbnail. es posible?

Código ciclónico
fuente

Respuestas:

9

Descubrí que get_post_types_by_support()parece ser la solución para obtener el resultado deseado:

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

Volverá lo anterior post, pagey cualquier tipo de publicación personalizada que admita title, editory thumbnail.

Como esto también devolverá tipos de publicaciones privadas, podríamos recorrer la lista y verificar si el tipo se puede ver en la interfaz. Esto se puede hacer usando la is_post_type_viewable()función:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}
Código ciclónico
fuente
Solo una nota: esto funcionará en la mayoría de los casos.
cybmeta
4

get_post_types()acepta una serie de argumentos para que coincidan con los campos de un objeto de tipo publicación . Entonces, podría hacer algo como esto (no probado):

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

Desafortunadamente, no puede configurar algo como "excluir" en esta función, y también obtiene solo tipos de publicaciones que admiten exactamente 'editor', 'title', 'thumbnail' , ni más ni menos.

O puede usar get_post_types_by_support()(solo para WP 4.5 y superior. Además, tenga en cuenta que tampoco puede excluir tipos de publicación específicos con esta función, pero para el caso específico de soporte para editor, title, thumbnail, el tipo de publicación de archivo adjunto se excluirá en la mayoría de los casos).

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

Si desea algo que funcione en cualquier caso, trataría de obtener tipos de publicación basados ​​en un criterio más amplio, luego construir su propia matriz, algo como esto:

$_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
fuente
¿Usar supportsno parece funcionar? Tengo un tipo de publicación personalizado que admite editory si lo uso, supports => array('editor')¿obtengo un resultado vacío? Sin embargo, su segundo enfoque parece funcionar.
Cyclonecode
2
Parece que podríamos usar el get_post_types_by_support()apoyo para lograr esto.
Cyclonecode
0

El enfoque más simple para la pregunta del OP sería simplemente desarmar el 'archivo adjunto' de la matriz devuelta;

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

Si bien no es tan elegante como las otras soluciones, tiene la menor sobrecarga.

Será
fuente