いろいろな条件や表現で過去の投稿一覧が簡単に表示できるクエリーループブロック、便利ですね。
ただ、コードやプラグインを使ってカスタム投稿タイプを追加し、そこに追加したコンテンツの一覧を表示させようとしたら..カスタム投稿タイプが選択肢に表示されない、そんな時のチェックポイントと解決方法をメモとして公開しておきます。
クエリーループで表示・選択できる条件
まず、追加したカスタム投稿タイプが、クエリーループブロックで一覧として出力されるためには、以下のパラメーターが設定されていることが必要なのは、結構いろいろなサイトで紹介されていますし、AIで聞いても回答が返ってきます。
'show_in_rest' => true,
ただこれは、出力されるということであり、このパラメーターだけではクエリーループブロックの「投稿タイプ」の選択肢として、目的のカスタム投稿タイプは出てきません(つまり追加できません)。
これを解決するためには、以下のパラメーターを同時に追加する必要があります。
'publicly_queryable' => true,
公式の「register_post_type」の解説を見ると、このパラメーターについては、以下のように書かれています。
parse_request() の一部として投稿タイプのフロントエンドでクエリを実行できるかどうか。エンドポイントには以下が含まれます: * ?post_type={post_type_key} * ?{post_type_key}={single_post_slug} * ?{post_type_query_var}={single_post_slug} 設定されていない場合、デフォルトは $public から継承されます。
公式の「register_post_type」の解説
つまりフロントエンドで条件を元に抽出することができないものは、「投稿タイプ」の選択肢には表示されないということのようです。
ここからは推察ですが、解説を見る限りでは、この「publicly_queryable」は「public」パラメーターの値を継承する(つまり「public」が「true」なら自動で有効にする)とされており、AIなどに聞くとこれをくみ取って「show_in_rest」を「true」にすればよいと回答されるようですが、私がテストを繰り返した限りでは、「public」パラメーターの指定に関わらず、「publicly_queryable」を有効にしないと、少なくともクエリーループブロックの「投稿タイプ」の選択肢には加わらないようです。
また、以下のパラメーターについても、場合によっては必要なことがありますのでご注意ください。
'rest_controller_class' => 'WP_REST_Posts_Controller',
'rest_namespace' => 'wp/v2',
ちなみに、カスタム投稿タイプを管理画面から操作できる、有名な「Custom Post Type UI」プラグインであれば、以下の項目が正しいかをチェックしてみてください(逆にこれらを変えてみると、どういう動作をするかの確認もできると思います)。
項目 | 設定値や値 |
---|---|
一般公開クエリー可 | True |
REST API で表示 | True |
REST API コントローラークラス | 空欄 |
REST API 名前空間 | 空欄 |
テーマやプラグインから、パラメーターを操作する方法
前項を参考にすれば、自身でコードを追加したり、プラグインを使って管理画面上からパラメーターの操作ができるようになっているサイトなら、コードの改変や設定の変更で簡単に改善できそうですね。
でも、例えばフロントエンドから何かの投稿ができたりするプラグインを使っていて、そのコンテンツをクエリーループブロックで一覧にしたいけど選択できないという場合などには、プラグインのコードを直接編集して改善すると、プラグインの更新によって元に戻ってしまう場合があるので、困ってしまいます。
そんな時には、以下のコードを有効化しているテーマのfunctions.phpへ追加して、必要なパラメーターをテーマ側から上書きすることで解決できます(今回のパラメーター以外にも使えます)。
function change_cpt_param_sample($args, $post_type){
if ($post_type == '投稿タイプのスラグ'){
//クエリーループに含める
$args ['show_in_rest'] = 'true';
//投稿タイプ選択画面で選べるようにする
$args ['publicly_queryable'] = 'true';
//コントロールが指定されていないことで動作しないときは有効にしてみる
//$args['rest_controller_class'] = 'WP_REST_Posts_Controller';
//$args['rest_namespace'] = 'wp/v2';
}
return $args;
}
add_filter('register_post_type_args', 'change_cpt_param_sample', 10, 2);
「投稿タイプのスラグ」には目的のカスタム投稿タイプのスラグを指定します。
上記は本ページのテーマである「クエリーループブロックでカスタム投稿タイプを選択できるようにする」ためのものですので、その他のパラメーターについて変更が必要な場合は以下の行を追加(または置き換え)していくだけです。
$args ['パラメーター'] = '値';
なお、詳しい方なら「true」「false」はブール値(はい、いいえ)だから、引用符「”」で囲む必要はない!と言われそうですが、引用符があっても結構曖昧に判断してくれるので、今回は他のパラメーターに使われることがあろうと思い、引用符で囲んでいます。もちろん引用符なしの「true」「false」でも同様に動作します。
参考ページ:
コメントを残す