どもです。
いつぞや書いた記事の改良版を出しておきます。
企業サイト等で、全ページWordPressで作られていない場合。
/sp/とかその辺のディレクトリ名でスマホサイトを構築することがよくありますね。
あるいは、英語サイトを作る場合。
これも/en/とかその辺のサブディレクトリを作ってサイト構築することがあるでしょう。
このとき、WordPressのURLを/sp/blog/とか、/en/blog/とか綺麗な流れで放出したい。
そんなときに使うのが、今回の改造です。
カスタム投稿を使わない場合
add_rewrite_rule('sp/date/([^/]+)/([^/]+)/?$', 'index.php?year=$matches[1]&monthnum=$matches[2]&sp', 'top');
add_rewrite_rule('sp/([^/]+)/([^/]+)/page/([0-9]+)/?$', 'index.php?category_name=$matches[1]%2F$matches[2]&paged=$matches[3]&sp', 'top');
add_rewrite_rule('sp/([^/]+)/page/([0-9]+)/?$', 'index.php?category_name=$matches[1]%2F&paged=$matches[2]', 'top');
add_rewrite_rule('sp/([^/]+)/?$', 'index.php?category_name=$matches[1]&sp', 'top');
add_rewrite_rule('sp/([^/]+)/([^/]+)/?$', 'index.php?category_name=$matches[1]%2F$matches[2]&sp', 'top');
add_rewrite_rule('sp/([^/]+)/([^/]+)/([^/]+)/?$', 'index.php?category_name=$matches[1]%2F$matches[2]&p=$matches[3]&page=&sp', 'top');
remove_filter('template_redirect', 'redirect_canonical');
上述のコードを、functions.phpに記載します。
やっていることは、当サイトではお馴染みのリライトルール弄りです。
(リライトルールについては昔の記事参照で)
([^/]+) は、半角スラッシュ以外の全ての文字、
([0-9]+) は、0-9の数字の繰り返しを指します。
また、$matches[1]の意味は、左の式で指定した自由記述の部分を代入する、という感じです。
数値はその順番を指します。
よって、
の意味は、
です。
孫カテゴリ以上が想定される場合、上の法則に従って項目を増やします。
カスタム投稿を使う場合
add_rewrite_rule('en/カスタム投稿名(半角)/([0-9]+)/?$', 'index.php?post_type=カスタム投稿名(半角)&slug=カスタム投稿名(半角)&p=$matches[1]&page&en', 'top');
add_rewrite_rule('en/カスタム投稿名(半角)/page/([0-9]+)/?$', 'index.php?post_type=カスタム投稿名(半角)&slug=カスタム投稿名(半角)&paged=$matches[1]&en', 'top');
add_rewrite_rule('en/タクソノミー名(半角)/([^/]+)/page/([0-9]+)/?$', 'index.php?タクソノミー名(半角)=$matches[1]&paged=$matches[2]&en', 'top');
add_rewrite_rule('en/タクソノミー名(半角)/([^/]+)/?$', 'index.php?タクソノミー名(半角)=$matches[1]&en', 'top');
add_rewrite_rule('en/カスタム投稿名(半角)/?$', 'index.php?post_type=カスタム投稿名(半角)&en', 'top');
remove_filter('template_redirect', 'redirect_canonical');
このとき、singleのパーマリンクは「カスタム投稿名/id」です。
左の式が被れば当然バグが起きるので、パーマリンクはIDにしておくのが最も安全です。
テンプレートの記述
<?php
$data = $_SERVER["REQUEST_URI"]; list($domain,$dir_01) = explode("/",$data);
if( $dir_01 == 'en' ): get_template_part('/en/有のときのテンプレート');
else: get_template_part('/en/なしのときのテンプレート');
endif;
?>
これを各categoryやsingleテンプレートに記載します。
URLを取得し、ドメインの次の部分が/en/か否かでifをかけています。
ifをかけたい部分がもっと下の階層であるなら、list($domain,$dir_01)の部分をlist($domain,$dir_01,$dir_02)といった形で増やし、if( $dir_02 == などでifをかけます。
注意事項!
リライトルールに関する設定・変更を行ったら、すぐにパーマリンク設定の空更新を行ってください!
僕はそれを忘れて一時間以上作業を停滞させたことがあります(´・ω・`)
また、リライトルールは上に書いたものが優先されます。
上手く表示されないときは、リライトルール追加の順番を確認してください。