Ottieni solo tipi di post in base al supporto


9

Sto cercando di recuperare un elenco che include sia tipi di post predefiniti sia personalizzati:

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

Quanto sopra funziona quasi, ma vorrei escludere attachmentda questo elenco, restituendo solo i tipi di post con supporto specifico come editor, titlee thumbnail. È possibile?

Risposte:


9

Ho scoperto che get_post_types_by_support()sembra essere la soluzione per ottenere il risultato desiderato:

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

Il ritorno sopra volontà post, pagee qualsiasi tipo messaggio personalizzato che supporta title, editore thumbnail.

Poiché ciò restituirà anche i tipi di post privati, potremmo scorrere l'elenco e verificare se il tipo è visualizzabile sul frontend. Questo può essere fatto usando la is_post_type_viewable()funzione:

foreach ($post_types as $key => $post_type) {
  if (!is_post_type_viewable($post_type)) {
    unset($post_types[$post_type]);
  }
}

Solo una nota: funzionerà nella maggior parte dei casi.
cybmeta,

4

get_post_types()accetta una matrice di argomenti per abbinare i campi di un oggetto di tipo post . Quindi, potresti fare qualcosa del genere (non testato):

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

Sfortunatamente, non puoi impostare qualcosa come "escludi" in questa funzione e ottieni solo tipi di post che supportano esattamente 'editor', 'title', 'thumbnail' , né più né meno.

Oppure potresti usare get_post_types_by_support()(solo per WP 4.5 e versioni successive. Inoltre, tieni presente che non puoi escludere specifici tipi di post con questa funzione, ma per il caso specifico di supporto per editor, title, thumbnail, il tipo di post allegato sarà escluso nella maggior parte dei casi).

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

Se vuoi qualcosa che funzioni in ogni caso, proverei a ottenere tipi di post basati su criteri più ampi, quindi costruisci il tuo array, qualcosa del genere:

$_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;
    }
}

Usando supportsnon sembra funzionare? Ho un tipo di post personalizzato che supporta editore se uso supports => array('editor')ottengo un risultato vuoto? Il tuo secondo approccio sembra funzionare però.
ciclico

2
Sembra che potremmo usare il get_post_types_by_support()supporto per raggiungere questo obiettivo.
ciclico

0

L'approccio più semplice per la domanda del PO consisterebbe nel disinserire 'attaccamento' dall'array restituito;

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

Sebbene non sia elegante come le altre soluzioni, ha il minimo sovraccarico.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.