質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

1625閲覧

WordPressで404判定を回避したい

sakurasakura

総合スコア14

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/07/21 07:13

編集2019/07/21 14:19

###前提
下記「functions.php」のように、パーマリンクにリダイレクトをかけました。

これによって、
「example.com/country/japan/history/」へのアクセス時に、
「post-country-history.php」が読み込まれ、リダイレクトは正常に作動しています。

###問題
しかしそのアクセス時に、下記「header.php」の処理において、if( is_404() ){}に該当してしまいます。
つまり'404です'という文字列がcookieに保存されてしまうのです。

###実現したいこと
「example.com/country/japan/history/」のような、リダイレクト可能なページにアクセスしたときに、if( is_404() ){}に該当させない方法を知りたいです。

###「functions.php」
こちらで、リダイレクトは正常に作動する状態です。

php

1// リライトルールを指定 2function rewrite_init() { 3 add_rewrite_rule( 4 '^country/([^/]+)/(history|character)?$', 5 'index.php?country=$matches[1]&countrychild=$matches[2]', 6 'top' 7 ); 8} 9add_action( 'init', 'rewrite_init' ); 10 11// 子ページのルールを追加 12function rewrite_query_vars_perf( $query_vars ) { 13 $query_vars[] = 'countrychild'; 14 return $query_vars; 15} 16add_action( 'query_vars', 'rewrite_query_vars_perf' ); 17 18// 子ページで使うテンプレートを指定 19function rewrite_template_include_perf( $template ) { 20 if ( get_query_var( 'post_type' ) == 'country' ) { 21 $child = get_query_var( 'countrychild' ); 22 if ( $child == 'history' ) { 23 $template = locate_template( 'post-country-history.php' ); 24 } else if ( $child == 'character' ) { 25 $template = locate_template( 'post-country-character.php' ); 26 } 27 } 28 return $template; 29} 30add_filter( 'template_include', 'rewrite_template_include_perf' );

###「header.php」
リダイレクトは正常に作動する状態にも関わらず、下記の処理において、if( is_404() ){}に該当してしまうのが問題です。

php

1<head> 2 <?php 3 if( is_404() ){ 4 echo "<script>$.cookie('page', '404です');</script>"; 5 }else{ 6 echo "<script>$.cookie('page', 'OKです');</script>"; 7 } 8 ?> 9 <?php wp_head(); ?> 10</head>

###補足
「example.com/country/japan/history/」へのアクセス時が問題でして、
「example.com/country/japan/」は通常通りアクセスできます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YukiYamashina

2019/07/21 08:59

https://wpdocs.osdn.jp/Rewrite_API/add_rewrite_rule > 重要: リライトルールの変更後は、忘れずにリライトルールデータベースの内容をフラッシュし、再作成してください。WordPress の 管理画面から、「設定」->「パーマリンク設定」を選択し、何も変更せずに「変更を保存」をクリックしてください。 こちらを行った上で404になる、ということでしょうか?
sakurasakura

2019/07/21 11:02 編集

はい。忘れがちな処理ですが、そちら更新済みです。 ちなみにおわかりかと思いますが念のため、「404.php」が表示される、という問題ではなくて、 きちんと「post-country-history.php」が表示されるけど、質問にある「header.php」の処理で「404です」という文字列がcookieに保存されてしまう、という問題になります。
YukiYamashina

2019/07/21 12:41

カスタム投稿タイプ country に japan というスラッグ名の投稿も存在しているのに 404 として扱われる、ということでよろしいでしょうか?
sakurasakura

2019/07/21 13:59 編集

えっと、404として扱われるのは、 「example.com/country/japan/」でなくて、example.com/country/japan/history/」ですが、 そこは大丈夫ですか? 因みに、「example.com/country/japan/」は管理画面から投稿されたもので、確かに存在します。(特に問題ないです。) 他方で、「example.com/country/japan/history/」は存在せず、あくまでadd_rewrite_rule でアクセス可能にしただけのページです。(これが問題です。)
YukiYamashina

2019/07/21 14:07 編集

現状 404 になるということはグローバル変数の $post が null になっているということだと思います。 リライトルールで 'index.php?country=$matches[1]&countrychild=$matches[2]' とし、 example.com/country/japan/history/ にリクエストを出すということは、カスタム投稿タイプ country の、スラッグ名が japan の投稿をDBに問い合わせます($wp_query->query は [ 'country' => 'japan', 'post_type' => 'country', 'name' => 'japan', 'countrychild' => 'character' ] になっていると思われます。これは pre_get_posts のフック内等で確認できると思います)。その投稿がなければ当然 404 扱いになりますので、まずその投稿が存在するかどうかを確認させていただきました。
sakurasakura

2019/07/21 14:20 編集

質問にそれを書いておくべきでしたね。気が回らず煩わしい思いをさせてしまって申し訳ございません。補足しました。どうもありがとうございます。
YukiYamashina

2019/07/21 15:06

まっさらな WordPress で 1. デフォルトテーマの functions .php に、質問に記載されているコードをコピー 2. カスタム投稿タイプ country を作成(CPT UIを利用) 3. カスタム投稿タイプ country にスラッグ名 japan の投稿を作成 4. functions.php に add_action( 'template_redirect', function() { var_dump(is_404()); } ); を追加 すると、/country/japan/history/、/country/japan/character/ ともに bool(false) が表示されてしまうため(404として処理されない)、質問に記載された情報だけから is_404() が true となってしまう原因を探るのは難しいかと思われます。
CHERRY

2019/07/22 01:53

WP_Rewrite の不具合は、Webサーバーで、URL書き換えのログを記録するように設定して、URL書き換えのログを取って、WordPress 側で、` $wp_rewrite ` グローバル変数の中身をログに出力して、デバッグする必要があると思います。 アクセスした URL から どのように URL が書き換えられて、どのように書き換えられたURLで、404 が発生するのかを追いかけないと原因特定は難しいと思います。
sakurasakura

2019/07/22 20:26

@YukiYamashinaさま すみません、遅くなりました。何か複雑な問題が絡むようなので、別の方法をさぐることに致します。丁寧にご対応いただき改めて感謝申し上げます。ありがとうございます。
sakurasakura

2019/07/22 20:27

@CHERRYさま デバッグの困難さに愕然ですwありがとうございました。別の方法で対応しようと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問