#WordPressにおける404ページ
404.phpを設置しておけば、
存在しないページにアクセスされたときに、
WP_Queryはis_404=trueとなり、404ページを返す。
だいたいそんな流れだったはず
#でも404ページにならない
##よくある解決法
.htaccessにエラー設定を記述
ErrorDocument 404 /index.php?error=404
##解決しない
/aaaaaaaaaaaaaaaaaaaaaa/とかテストでもそれはどうなのみたいなのでも404にならない
試しにget_header()の一番最初にvar_dump()してみた
結果
["date_query"]=>
bool(false)
["post_count"]=>
int(1)
["current_post"]=>
int(-1)
["in_the_loop"]=>
bool(false)
(略)
["is_single"]=>
bool(false)
["is_preview"]=>
bool(false)
["is_page"]=>
bool(true)
["is_archive"]=>
bool(false)
(略)
["is_attachment"]=>
bool(false)
["is_singular"]=>
bool(true)
(略)
["is_page"]=>
bool(true)
["is_singular"]=>
bool(true)
なんなん君ら
#htaccessでも効かない急いでる人向けの解決法
##概要
-
404にならないページのパーマリンク洗い出し
これしないと全ページ404という素敵なページが出来上がる -
template_redirect()アクションに$wp_queryの書き換えを追記
is_404のフラグを強制的に立てる
そして、それ以外のis_●●のフラグをすべて折る
##力技で解決した結果
例として、
front-page.php
news.php(archive.phpではなく別テンプレート作成)
single.php
のうちどれも通らないものは404としたい場合で
パーマリンク設定は"/?p=page_id"とする
// 404.phpが効かないのでリダイレクト措置
// テーマ内で固定ページや新規カスタム投稿を追加する場合はここに除外設定を追加
function redirect_404() {
// archive.php
if (is_page_template('news.php')) {
if ($_SERVER['REQUEST_URI'] == '/news/' || '/news/?' . $_SERVER['QUERY_STRING'] == $_SERVER['REQUEST_URI']) {
// Adsenseも404対象外とするため、あまり厳密すぎないように
if (strpos($_SERVER['QUERY_STRING'], 'paged') === false || preg_match('/paged=[0-9]+/',$_SERVER['QUERY_STRING'])) {
return;
}
}
}
if ('/news/?' . $_SERVER['QUERY_STRING'] == $_SERVER['REQUEST_URI']) {
return;
}
global $wp_query;
//is_404()が効かないので強制的にフラグを付加する
$wp_query->is_404 = 1;
//$wp_queryをdumpしてフラグがたっていたものはリセット
$wp_query->is_singular = '';
$wp_query->is_page = '';
get_template_part('404');
// exit()しないと余計なことするときある
exit();
}
add_action('template_redirect', 'redirect_404');
#困ったときのtemplate_redirect
template_redirect使ってる時点で力技感出る