サポート » 使い方全般 » add_rewrite_rule で、強制的に子階層を追加する方法

  • 解決済 fongafon

    (@fongafon)


    宜しくお願い致します。

    example.com/country/japan/ にアクセスしたときに、
    example.com/country/japan/history/ にリダイレクトをかけたいです。

    つまりカスタム投稿タイプ「country」へアクセスしたとき、デフォルトの子ページ「history」を設定したい、ということになります。

    そのために書いた下記のルール設定ですが、リダイレクトが起こらずexample.com/country/japan/のままです。

    下記の【これができません】は、どこがおかしいのでしょうか?

    (なお、下記をfunctions.phpに書いたのちの、管理画面からのパーマリンク更新は済んでいます。)

    // リライトルールを指定
    function rewrite_init() {
    
    	// デフォルトの子ページを指定【これができません】
    	add_rewrite_rule(
    		'^country/([^/]+)?$',
    		'index.php?country=$matches[1]/history',
    		'top'
    	);
    	
    	// 各子ページへのアクセスを指定
    	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' );
9件の返信を表示中 - 1 - 9件目 (全9件中)
  • こんにちは

    こんな感じでしょうか?

    // デフォルトの子ページを指定【これができません】
    add_rewrite_rule(
    	'^country/([^/]+)?$',
    	'index.php?country=$matches[1]/history',
    	'top'
    );

    add_rewrite_rule( '^country/([^/]+)/?$', 'index.php?country=$matches[1]&countrychild=history', 'top' );

    トピック投稿者 fongafon

    (@fongafon)

    @ishitakaさま、こんにちは。いつもお世話になっております。

    やってみたのですが、やはり
    example.com/country/japan/ にアクセスしたときのURLは
    example.com/country/japan/ のままで、
    example.com/country/japan/history/ に変化するということはありませんでした。

    きちんとコピペしてアップロードしましたし、アップロード後にパーマリンク更新もしたのですが。

    こちらは参考になりませんか?

    トピック投稿者 fongafon

    (@fongafon)

    なるほど。add_rewrite_ruleは「>ブラウザの上のURLバーに表示されるURLはアクセスさせたくないページのURLのまま」なのですね。

    なんでもよくご存じですね…💧笑

    となるとそちらの参考リンクを見ながら、質問のfunction rewrite_init()はこう変更すればいいのかと思ったのですが…変化なく。

    	// デフォルトの子ページを指定【これができません】
    	add_rewrite_rule(
    		'^country/([^/]+)?$',
    		'index.php?country=$matches[1]/history',
    		'top'
    	);
    

    ↓ 変更

    	//現在ページのURLの取得
    	$url = $_SERVER["REQUEST_URI"];
    	
    	// リダイレクト前後のURLを指定(この2行を参考リンクに追加しました)
    	$source_url = '^country/([^/]+)/?$';
    	$dest_url   = 'index.php?country=$matches[1]&countrychild=history';
    
    	//取得したURLがアクセスさせたくないURLかどうかの比較
    	$match = preg_match('<.$source_url.>', $url);
    
    	if($match === 1){
    		wp_redirect($dest_url, 302);
    		exit;
    	}	
    

    上記(この2行を参考リンクに追加しました)を自分で追加したのですが、ここが問題でしょうか?

    またはこの部分を次のようにも試したのですがやはりだめで…もし他にも試すべきことがございましたら、また宜しくお願い致します。

    	// リダイレクト前後のURLを指定(この2行を参考リンクに追加しました)
    	$source_url = home_url().'^country/([^/]+)/?$';
    	$dest_url   = home_url().'^country/([^/]+)/history/?$';
    
    • この返信は4年、 8ヶ月前にfongafonが編集しました。

    preg_match() については、
    https://www.php.net/manual/ja/function.preg-match.php

    wp_redirect() については、
    https://wpdocs.osdn.jp/関数リファレンス/wp_redirect

    をご覧ください。

    トピック投稿者 fongafon

    (@fongafon)

    ありがとうございます。

    preg_match() については正規表現にすべきですよね。先日も教えて頂いたのにすみませんでした。

    wp_redirect()については絶対パスにすればいいとのアドバイスかと思うので、とりあえず同様にしていいと解釈しました。

    それらを踏まえた下記ですができず、何がおかしいか今一度アドバイスをいただけませんでしょうか?

    	// リダイレクト前後のURLを指定(この2行を参考リンクに追加しました)
    	$source_url = '^http:\/\/example.com\/country\/([^/]+)?$';
    	$dest_url   = '^http:\/\/example.com\/country\/([^/]+)\/history?$';

    もう一度、コードを見直してください。

    $match = preg_match('<.$source_url.>', $url);

    $match = preg_match('<'.$source_url.'>', $url);

    wp_redirect() の説明も今一度精読してみてください。
    第一引数は「ユーザーがリダイレクトされる 絶対 URI」です。

    例:

    function redirect_sample() {
    	$url = $_SERVER["REQUEST_URI"];
    	if ( $url == '/country/japan/' ) {
    		wp_redirect( 'http://example.com/country/japan/history/' );
    		exit;
    	}
    }
    add_action( 'wp', 'redirect_sample' );
    トピック投稿者 fongafon

    (@fongafon)

    すみません$_SERVER["REQUEST_URI"]が何を取得するかわかっていませんでした。

    あとひょっとしたらですが、function rewrite_init()に書くのが間違っていたのでしょうか?

    下記のように<head>内に書きましたら、URLの変更には成功しました!

    //header.php
    
    <head>
    
    <?PHP
    	//現在ページのURLの取得
    	$url = $_SERVER["REQUEST_URI"];
    	
    	// リダイレクト前後のURLを指定
    	$source_url = '#/country/japan/#';
    	$dest_url   = 'http://example.com/country/japan/history/';
    
    	//取得したURLがアクセスさせたくないURLかどうかの比較
    	$match = preg_match($source_url, $url);
    
    	if($match === 1){
    		wp_redirect($dest_url, 302);
    		exit;
    	}	
    ?>
    
    <?php wp_head(); ?>
    </head>

    しかし、URLの変更には成功したのですが、ブラウザで「ページの自動転送設定が正しくありません。このアドレスへのリクエストに対するサーバーの自動転送設定がループしています。」というエラーが表示されてしまうことに…

    なかなかです。泣

    トピック投稿者 fongafon

    (@fongafon)

    失礼いたしました。入れ違いでコメント気づきませんでした。

    例!
    どうもありがとうございます!

    'wp'というアクションフックを使うのですね。ほんっとに、どんなケースでもご存じですね。脱帽すぎます。

    できました。

    いつもいつもいつも、本当にありがとうございます。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • トピック「add_rewrite_rule で、強制的に子階層を追加する方法」には新たに返信することはできません。