WordPressの404判定はどこのフックタイミングでヒットするのか?

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つをがっちゃん越して表示するのってやっぱりめんどいな。。。