web-dev-qa-db-ja.com

WordPressにはCPTを超えたデータ構造を採用し、 `get_posts`ではキャッチできないサブシステムがありますか?

特定のキーと値の用語のペアを持つ投稿を削除する機能を構築しています。結構ですが、私はこのようなクエリを実行できます。

    $posts = get_posts([
        'post_type' => 'any',
        'posts_per_page' => -1,
        'meta_key' => 'my_key',
        'meta_value' => 'my_value',
    ]);

しかし私は考えていました。 anyは本当に...anyですか?つまり、CPT以外の方法で複雑なデータ構造/コレクションを表現することを選択したプラグインはありますか?

WooCoomerの製品はCPTです。簡単デジタルダウンロードはCPTです。 RevolutionSliderスライダはCPTです(ショートコードと組み合わせて)。 WordPressエコシステムの表現には、CPTが含まれています。

しかし、これが起こらず、それがポピュラーなプラグインであるとき、Edgeのケースはありますか?

私の質問は、私の質問が失敗する可能性があるかどうかということです。

1
coolpasta

実際にコーデックスをよく見ると、any'post_type'引数を設定するとデフォルトでクエリからいくつかの投稿タイプが除外されることがわかります: https://codex.wordpress.org/Class_Reference/WP_Query#Type_Parameters

'any' - 'exclude_from_search'がtrueに設定されているリビジョンとタイプ以外のタイプを取得します。

ですから、実際には投稿タイプを登録して非公開にすることができます。ご存じのとおり、そこにたくさんの引数がありますので、これらを使用して作業することができます。

$args = array(
    'public'                => false,
    'show_ui'               => false,
    'show_in_menu'          => false,
    'show_in_admin_bar'     => false,
    'show_in_nav_menus'     => false,
    'show_in_rest'          => false,
    'can_export'            => false,
    'has_archive'           => false,       
    'exclude_from_search'   => true, // this one is important!
    'publicly_queryable'    => false,
);
register_post_type( 'hidden_post_type', $args );

これを考慮して、私はほとんどの場合CPTを使うのが正しい方法であると言いたいです、そして多くの人気のあるプラグインが非公開投稿を使ってこれをしています。

あなたはいつでもあなたのプラグインのためにデータベースに追加のテーブルを構築するような極端な解決策を探すことができますが、これは私の意見では言えるWordPressの方法ではありません。 CPTを使用することで、キャッシングなど、箱から出してすぐに使えるものがたくさん出てきます。将来の互換性について心配する必要はありません。

2
Levi Dulstein