サポート » 使い方全般 » カスタム投稿に子階層URLを作る方法

  • 解決済 fongafon

    (@fongafon)


    カスタム投稿に子階層URLを作る方法はございませんでしょうか?

    現在下記のように「country」というカスタム投稿があり、その記事として「japan」や「america」などが投稿されます。

    教えて頂きたいのは、これら記事の子階層URLとして「history」と「character」の2つを作ることです。

    country
    │
    ├ japan (example.com/country/japan) 
    │ ├ history   (example.com/country/japan/history)
    │ └ character (example.com/country/japan/character)
    │
    ├ amrica (example.com/country/america) 
    │ ├ history   (example.com/country/america/history)
    │ └ character (example.com/country/america/character)

    難しいのは次の点です。

    「history」や「character」の2つは、管理画面から記事として投稿するのではなく、あくまで「japan」や「america」などを投稿した後にアクセスできるようになるURLにすぎないという点です。

    たとえば、普通なら「japan」を投稿しただけでは
    example.com/country/japan/history
    にアクセスすると404になりますが、そうならないようにしたいということになります。

    次の➀➁の処理で実現できましたが、これでは一度404に行くという余分な流れが生じ、多少の違和感を覚えています。

    ➀「404.php」の冒頭でアクセスされたURLを取得し、
    ➁そこに「history」があれば、「post-country-history.php」を表示する。

    もっと適切な方法がないかと探しています。良い方法がございましたら教えてください。
    宜しくお願い致します。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • こんにちは

    下記ページが参考になると思います。
    https://wordpress.stackexchange.com/questions/57950/optimal-code-for-two-add-rewrite-rules

    トピック投稿者 fongafon

    (@fongafon)

    情報どうもありがとうございます。別のウェブサイトでも質問したものの長らくご回答がつかず、相当苦労していましたので大変ありがたく思います。m(__)m

    ご提示のページにある関数を調べていくうちに、必要な処理の意味は理解できました。下記➀➁➂のイメージであっていますでしょうか?

    ➀ function rewrite_init(){}
    →新しいURLを追加する。

    ➁ function rewrite_query_vars($query_vars){}
    →新しいURLにアクセスされたことを判定する機能を追加する。

    ➂ function rewrite_template_include($template)
    →新しいURLにアクセスされたことを判定してテンプレートを表示する。

    さてこれらの中で➂がわからず、どうかもう一度ご教授願えましたら幸いです。

    トピック投稿者 fongafon

    (@fongafon)

    まず➀は下記で(多分)できまして、これで「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');
    トピック投稿者 fongafon

    (@fongafon)

    そして次に、ご提示いただいた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; 
    }

    としてみたのですが、ここで躓いています。

    トピック投稿者 fongafon

    (@fongafon)

    現状をまとめますと、➀で「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' );
    • この返信は4年、 9ヶ月前にishitakaが編集しました。
    トピック投稿者 fongafon

    (@fongafon)

    ご丁寧にどうもありがとうございます。

    はっ、➂で分岐させるためにも、➁は必須だったのですね。
    なるほど流れが掴めたような気がします。

    ただご提示のコードで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になってしまうということかな?と思い、関係ないかもしれませんが書かせて頂きました。

    もしこれらの少ないヒントから何か対策など思いつくものがあったらまたご意見いただけましたら幸いです。

    トピック投稿者 fongafon

    (@fongafon)

    思い切ってシンプルなのを書いてみたのですが、これは普通に「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自体が作動しないような、何か謎の設定をしているとしか思えませんよね…

    リライトルールの更新(管理画面から「設定」->「パーマリンク設定」を選択し、何も変更せずに「変更を保存」をクリック)はしましたか?

    トピック投稿者 fongafon

    (@fongafon)

    日本語版codexで「重要」とあるやつですね。functions.phpの変更後、何も変更せず更新。はい、間違いなくしています。

    1つ前のシンプルなのさえ効かないって、おかしいですよね。

    トピック投稿者 fongafon

    (@fongafon)

    ごめんなさい!すみません!!申し訳ございません!!!

    出来ました。仰る通り、リライトルールの更新をしていなかったせいだったようです。

    「はい、間違いなくしています。」と申し上げたのは、シンプルな方についてだけで、ご提示のコードの方では更新していなかったための発言でした。

    お手を煩わせてしまい、本当にすみません。ほんっとにすみません。

    ひとつ不思議なのは、シンプルな方では効かないということです。
    こちらです。

    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

    トピック投稿者 fongafon

    (@fongafon)

    なるほど、「ぜんぶ書いておけばとりあえず正解でしょ」と勝手な解釈で突き進んでいました。笑
    最後までどうもありがとうございます。

13件の返信を表示中 - 1 - 13件目 (全13件中)
  • トピック「カスタム投稿に子階層URLを作る方法」には新たに返信することはできません。