Obtenha apenas tipos de postagem com base no suporte

9

Estou tentando recuperar uma lista incluindo os tipos de postagem incorporados e personalizados:

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

O exemplo acima quase funciona, mas eu gostaria de excluir attachmentdesta lista, retornando apenas tipos de postagem com suporte específico, como editor, titlee thumbnail. Isso é possível?

Cyclonecode
fonte

Respostas:

9

Eu descobri que get_post_types_by_support()parece ser a solução para obter o resultado desejado:

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

O retorno acima vontade post, pagee qualquer tipo de pós personalizado que apoia title, editore thumbnail.

Como isso também retornará tipos de postagem particulares, poderíamos percorrer a lista e verificar se o tipo está visível no frontend. Isso pode ser feito usando a is_post_type_viewable()função:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}
Cyclonecode
fonte
Apenas uma observação: isso funcionará na maioria dos casos.
cybmeta
4

get_post_types()aceita uma matriz de argumentos para corresponder aos campos de um objeto do tipo postagem . Então, você poderia fazer algo assim (não testado):

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

Infelizmente, você não pode definir algo como "excluir" nesta função, e também obtém apenas tipos de post que suportam exatamente 'editor', 'title', 'thumbnail' , nem mais nem menos.

Ou você pode usar get_post_types_by_support()(apenas para o WP 4.5 e superior. Além disso, também não é possível excluir tipos de postagem específicos com essa função, mas, no caso específico de suporte editor, title, thumbnail, o tipo de postagem de anexo será excluído na maioria dos casos).

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

Se você quiser algo que funcione em qualquer caso, eu tentaria obter tipos de postagem com base em critérios mais amplos e, em seguida, crie sua própria matriz, algo como isto:

$_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
fonte
Usando supportsnão parece funcionar? Eu tenho um tipo de postagem personalizado compatível editore, se eu uso supports => array('editor'), recebo um resultado vazio? Você segunda abordagem parece funcionar embora.
Cyclonecode 15/01/19
2
Parece que poderíamos usar o get_post_types_by_support()suporte para conseguir isso.
Cyclonecode
0

A abordagem mais simples para a pergunta do OP seria desabilitar o 'anexo' da matriz retornada;

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

Embora não seja tão elegante quanto as outras soluções, possui o mínimo de sobrecarga.

Vai
fonte