情報どうもありがとうございます。別のウェブサイトでも質問したものの長らくご回答がつかず、相当苦労していましたので大変ありがたく思います。m(__)m
ご提示のページにある関数を調べていくうちに、必要な処理の意味は理解できました。下記➀➁➂のイメージであっていますでしょうか?
➀ function rewrite_init(){}
→新しいURLを追加する。
➁ function rewrite_query_vars($query_vars){}
→新しいURLにアクセスされたことを判定する機能を追加する。
➂ function rewrite_template_include($template)
→新しいURLにアクセスされたことを判定してテンプレートを表示する。
さてこれらの中で➂がわからず、どうかもう一度ご教授願えましたら幸いです。
まず➀は下記で(多分)できまして、これで「example.com/country/japan/history」という存在しないページにアクセスしてもページが表示されるようになりました。
↓ ➀ function rewrite_init(){}
function rewrite_init() {
add_rewrite_rule('^country/japan/history/?', 'index.php?post_type=country&page_id=$matches[1]', 'top');
}
add_action('init', 'rewrite_init');
そして次に、ご提示いただいたStackexchangeにあるような「currentpage、catname、pref」という3つがなくても➀ができたということは、➁の判定機能はなくてもよさそうに思いました。
しかしそれがないと、次の➂がわかりません。
↓ ➂ function rewrite_template_include($template)
function rewrite_template_include($template){
if( get_query_var('post_type')=='country' ){
$template = locate_template(array('post-country-history.php'));
}
return $template;
}
としてみたのですが、ここで躓いています。
現状をまとめますと、➀で「example.com/country/japan/history」へのアクセスできるようになり、➁は不要だと考えて書かず、➂で目的のテンプレートも表示できたものの、上の➂ですと「example.com/country/japan」でも同じテンプレートが表示されてしまいます。
しかしやりたいこととは、
「example.com/country/japan」では「post-country.php」を表示し、
「example.com/country/japan/history」では「post-country-history.php」を表示したい。
という処理になるのですが…
この部分について、今一度お知恵を拝借させていただけませんでしょうか。
長くなってしまって大変申し訳ございません。いつでもご返信お待ちしております。
宜しくお願いいたします。
こんな感じではどうでしょうか?
function rewrite_init() {
add_rewrite_rule( '^country/([^/]+)/(history|character)?$', 'index.php?country=$matches[1]&countrychild=$matches[2]', 'top' );
}
add_action( 'init', 'rewrite_init' );
function rewrite_query_vars_perf( $query_vars ) {
$query_vars[] = 'countrychild';
return $query_vars;
}
add_action( 'query_vars', 'rewrite_query_vars_perf' );
function rewrite_template_include_perf( $template ) {
if ( get_query_var( 'post_type' ) == 'country' ) {
$child = get_query_var( 'countrychild' );
if ( $child == 'history' ) {
$template = locate_template( 'post-country-history.php' );
} else if ( $child == 'character' ) {
$template = locate_template( 'post-country-character.php' );
}
}
return $template;
}
add_filter( 'template_include', 'rewrite_template_include_perf' );
ご丁寧にどうもありがとうございます。
はっ、➂で分岐させるためにも、➁は必須だったのですね。
なるほど流れが掴めたような気がします。
ただご提示のコードで404になってしまうようでした。
そしてそもそもの話として、先ほどわたしが「➀ができました」と言った次のコードがぜんぜんできておらず、これも404でした。
function rewrite_init() {
add_rewrite_rule('^country/japan/history/?', 'index.php?post_type=country&page_id=$matches[1]', 'top');
}
add_action('init', 'rewrite_init');
ちなみに次も404です。
function rewrite_init() {
add_rewrite_rule( '^country/([^/]+)/(history|character)?$', 'index.php?country=$matches[1]', 'top' );
}
add_action('init', 'rewrite_init');
—
あとこれは関係ないかもしれませんが…
「example.com/hoge/japan」や「example.com/fuga/japan」にアクセスすると
「example.com/country/japan」にリダイレクトされるという現状があります。
hogeやfugaというカスタム投稿タイプは存在ないしリダイレクト設定もしてないように思うのですが、これはWPの初期設定でしょうか?
それともわたしが何か謎の設定をしているせいで生じるリダイレクトでしょうか?
もしかしてこの謎の設定のせいでご提示のコードが404になってしまうということかな?と思い、関係ないかもしれませんが書かせて頂きました。
もしこれらの少ないヒントから何か対策など思いつくものがあったらまたご意見いただけましたら幸いです。
思い切ってシンプルなのを書いてみたのですが、これは普通に「japan」の方が表示されました。
function rewrite_init() {
add_rewrite_rule( 'http://example.com/country/japan', 'http://example.com/country/ameria', 'top' );
}
add_action('init', 'rewrite_init');
これはもう、add_rewrite_rule
自体が作動しないような、何か謎の設定をしているとしか思えませんよね…
リライトルールの更新(管理画面から「設定」->「パーマリンク設定」を選択し、何も変更せずに「変更を保存」をクリック)はしましたか?
日本語版codexで「重要」とあるやつですね。functions.phpの変更後、何も変更せず更新。はい、間違いなくしています。
1つ前のシンプルなのさえ効かないって、おかしいですよね。
ごめんなさい!すみません!!申し訳ございません!!!
出来ました。仰る通り、リライトルールの更新をしていなかったせいだったようです。
「はい、間違いなくしています。」と申し上げたのは、シンプルな方についてだけで、ご提示のコードの方では更新していなかったための発言でした。
お手を煩わせてしまい、本当にすみません。ほんっとにすみません。
—
ひとつ不思議なのは、シンプルな方では効かないということです。
こちらです。
function rewrite_init() {
add_rewrite_rule( 'http://example.com/country/japan', 'http://example.com/country/ameria', 'top' );
}
add_action('init', 'rewrite_init');
こちらはやはり、リライトルールを更新しても効かず「japan」が表示されてしまう、というのが不思議です。
まぁ実験のために書いた不要な機能なので効かなくても構わないのですが、なぜ効かないのかお分かりになりますでしょうか?
add_rewrite_rule() の正規表現パターン ($regex) は、サイトアドレス部分を除いた正規表現パターンになります。
こちらのページの説明がわかりやすいかと思います。
https://elearn.jp/wpman/function/add_rewrite_rule.html
なるほど、「ぜんぶ書いておけばとりあえず正解でしょ」と勝手な解釈で突き進んでいました。笑
最後までどうもありがとうございます。