WordPressで404の判定がどのタイミングでされているのか調べてみた。
また、その時にクエリを変更して404判定を解除できるのか?
※hook名 → is_404()で判定。
parse_query → bool(false)
pre_get_posts → bool(false)
the_posts → bool(false)
wp → bool(true)
となった。
wpで判定されている。
じゃあ、例えば、2つのカスタム投稿をまたいで一覧を表示したい場合はどうするか。。
具体的なイメージは、
あるタクソノミーのときだけ、別のカスタム投稿の記事も合計した一覧を作りたい場合。
→これでページネーションをすると、メインのカスタム投稿の記事がないと404の判定になってしまう。
どこでhookをかけたらよいのか….
結論として「pre_get_posts」でhookをかける
「$query->set()」でクエリを変更する。archive時の表示件数を変更するのと同じ感じです。
function change_posts_query($query) { if ( is_admin() || ! $query->is_main_query() ) return; if ( $query->is_archive() ) { /* アーカイブページの時に表示件数を5件にセット */ $query->set( 'posts_per_page', 5); } if ( $query->is_archive() && $query->is_tax()) { $query->set( 'post_type', array('custom_post1','custom_post2')); } } add_action( 'pre_get_posts', 'change_posts_query' );
この場合の「get_post_type()」はどっちになるのか
→記事があるのほうのPOSTTYPEが返ってくる。オレオレ的にはメインはこっちのPOSTTYPEだからこっちを返せよ!!っていうのは通じない。
「get_query_var( ‘post_type’ )」では2つのPOSTTYPEが返ってきます。
っていうことで元の情報を取りながら…
下記のようにすることでURLで指定されたカスタム投稿タイプを取得することが可能
global $wp_query; var_dump($wp_query->query["post_type"] );
2つをがっちゃん越して表示するのってやっぱりめんどいな。。。