2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

WordPress:力技で404リダイレクトする方法

Last updated at Posted at 2018-07-24

#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"とする

functions.php
// 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使ってる時点で力技感出る

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?