確認してみたところ、デフォルトではカスタム投稿タイプでカテゴリーを使えるようにしても、カテゴリーアーカイブでは、投稿のみしか表示されないようです。どうにもバグっぽいのですが、とりあえず pre_get_posts でカテゴリーとタグが使える投稿タイプを洗い出し、post_type で指定されるコードを書いてみました。
function custom_pre_get_posts( $wp_query ) {
if ( ! is_admin() && $wp_query->is_main_query() ) {
if ( $wp_query->is_category() || $wp_query->is_tag() ) {
$post_types = array();
$all_post_types = get_post_types( array( 'exclude_from_search' => false ) );
if ( $wp_query->is_category() ) {
foreach ( $all_post_types as $pt ) {
$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {
$post_types[] = $pt;
}
}
}
if ( $wp_query->is_tag() ) {
foreach ( $all_post_types as $pt ) {
$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {
$post_types[] = $pt;
}
}
}
if ( $post_types ) {
$wp_query->set( 'post_type', $post_types );
}
}
}
}
add_action( 'pre_get_posts', 'custom_pre_get_posts' );
お答えありがとうございます。
バグなのですか…どうりで出来なかったわけですね。。
原因が判明して良かったです。
教えて頂いたコードをfunctions.phpに記載しましたところ、無事実装できました!
ありがとうございます。
ただ、phpもといwordpressに詳しくないので、内容がよくわからず..
不明点もありつつ自分なりに以下のように解釈しましたが、こんな感じでしょうか?
function custom_pre_get_posts( $wp_query ) {
//管理画面ではなく、メインクエリーの場合
if ( ! is_admin() && $wp_query->is_main_query() ) {
if ( $wp_query->is_category() || $wp_query->is_tag() ) {
$post_types = array();//空の配列
$all_post_types = get_post_types( array( 'exclude_from_search' => false ) );//検索対象に含まれる全ての投稿(メディア含む)を取得
//カテゴリーページの場合
if ( $wp_query->is_category() ) {
//投稿があるだけ繰り返し
foreach ( $all_post_types as $pt ) {
$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );//attachment(メディアが)が添付されていれば、タクソノミーのメディアを取得、無ければ全てのタクソノミーの値(メディアも?)を取得
if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {//$object_taxonomiesの中にcategoryがあり、$post_typesに$ptが含まれていれば...(?)
$post_types[] = $pt;//空の配列に代入していく
}
}
}
//タグページの場合
if ( $wp_query->is_tag() ) {
foreach ( $all_post_types as $pt ) {
$object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
if ( in_array( 'category', $object_taxonomies ) && ! in_array( $pt, $post_types ) ) {//タグページなのにcategoryとは何故でしょうか..?
$post_types[] = $pt;
}
}
}
if ( $post_types ) {
$wp_query->set( 'post_type', $post_types );//$post_typesを投稿順に
}
}
}
}
add_action( 'pre_get_posts', 'custom_pre_get_posts' );
また、別トピを立てた方が良いかもしれませんが、投稿の順番を変えるプラグインもきかず、バグかもということで、同じようにfunctions.phpで設定しようと思いました。
(一覧ページだけなら実装できたのですが、個別ページが投稿順でページ送りになってしまったので、pre_get_postsを使えばよいのかなと..後出しですみません)
if ( $post_types ) {
$wp_query->set( ‘post_type’, $post_types );
}
の後に以下のコードを挿入しましたが、上手くいきませんでした。。
if ( $wp_query->is_post_type_archive('カスタムフィールド名')){
$wp_query->set( 'post_type', 'カスタムフィールド名' );
$wp_query->set( 'order', 'DESC' );//タクソノミーの値でソート
$tax_query[] = array(
'taxonomy'=>'タクソノミー名',
'field'=>'slug'
);
$wp_query->set('tax_query', $tax_query);
}
よろしければ、こちらも教えて頂ければ幸いです。
すみませんがよろしくお願い致します。
個別ページの前後リンクの事であれば、pre_get_posts での調整はできません。
そうなんですね、ありがとうございます。
pre_get_postsはメインクエリーを書き換え、個別ページも順応すると思っているのですが、そういうものではないのでしょうか?
ということを踏まえて色々考えみましたが、
今回のカスタム投稿タイプにカテゴリーなどが表示されなかったのは、投稿とカテゴリーの記事でページ送りが複雑になるを避けるため、という気がしてきました。
pre_get_postsはメインクエリーを書き換え、個別ページも順応すると思っているのですが、そういうものではないのでしょうか?
メインクエリーは、そのページのメインループで表示されるものを取得するもので、個別ページの前後リンクは、また別の取得方法で行われています。
個別ページの前後リンクの順序を変更するのであれば、get_next_post_sort、get_previous_post_sort の2つのフィルターにフックして、SQLの書き換えを行う必要があります。
それぞれのページでの設定になるのですね、勉強になります。
タイトルと内容が外れてきましたので、get_next_post_sort、get_previous_post_sortを試してみて、また分からなければ改めて質問させて頂きます。
有難う御座いました!