web-dev-qa-db-ja.com

サポートに基づいて投稿タイプのみを取得

組み込みの投稿タイプとカスタムの投稿タイプの両方を含むリストを取得しようとしています。

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

上記はほとんど動作しますが、このリストからattachmentを除外し、editortitlethumbnailなどの特定のサポートを持つ投稿タイプのみを返します。これは可能ですか?

9
Cyclonecode

私は get_post_types_by_support() が望ましい結果を得るための解決策のように思われることを知りました:

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

上記はpostpage、およびtitleeditorthumbnailをサポートする任意のカスタム投稿タイプを返します。

これは私用の投稿タイプも返すので、リストをループしてフロントエンドでそのタイプが表示可能かどうかをチェックすることができます。これは is_post_type_viewable() 関数を使って行うことができます。

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

get_post_types()ポスト型オブジェクトのフィールドにマッチする引数の配列を受け取ります 。だから、あなたはこのようなことをすることができます(未テスト):

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

残念ながら、この関数では「除外」のようなsometingを設定することはできません。また、 正確に 'editor', 'title', 'thumbnail'をサポートする投稿タイプのみが取得されます。

あるいは、get_post_types_by_support()を使用することもできます(WP 4.5以上の場合のみ。また、この関数で特定の投稿タイプを除外することはできませんが、editor, title, thumbnailをサポートする特定のケースでは、添付ファイルの投稿タイプはほとんどの場合は除外されます)。

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

いずれにしてもうまくいくようなものが欲しいのであれば、私はより広い基準に基づいて投稿タイプを取得してから、次のような独自の配列を作成しようとします。

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

OPの質問に対する最も簡単なアプローチは、返された配列から 'attachment'の設定を解除することです。

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

他のソリューションほどエレガントではありませんが、オーバーヘッドは最も少なくなります。

0
Will