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

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

ただいまの
回答率

87.94%

【wordpressのfunctionを使う形に変更】mod_rewrite(authorUrlRewrite) で getパラメータをURLに含む形に変換したい

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,829

score 16

URLの整形についてお伺いします。
サーバはヘテムル、apacheで、wordpressでサイトを構築しています。
カスタムフィールドで県(prefecture)、ジャンル(genre)を設定し、

http://xxx.com/北海道/イタリアン/my_shop1.html

にアクセスした際に

http://xxx.com/my_shop1.html?prefecture=北海道&genre=イタリアン

で出力されるページにアクセスしたいのです。
アドレスバーには http://xxx.com/北海道/イタリアン/my_shop1.html と表示させたい、ということです(日本語が挟まってくるのは気持ち悪いのですがご要望なのでこのまま参る予定です)。

mod_rewrite を用いるのが良いかと思っているのですが、
OXY NOTES様の「Apacheのmod_rewriteモジュールの使い方を徹底的に解説( http://oxynotes.com/?p=7392 )」
や、「動的URLを静的URL」をキーワードに検索したりした結果、

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /xxx.com/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /xxx.com/index.php [L]
</IfModule>

# END WordPress

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)\.html$ ^$3\.html?a=$1&b=$2 [L]

と書いてみたのですがうまく行かず、404になります。
BEGIN WordPress〜END WordPressの部分はwordpressによって自動的に作られた部分です。

抜けや間違い、根本的な勘違いなどご指摘いただければと思います。
よろしくお願いします。

追記(2/19):
wordpressのfunctionを使う方法を検討しております。

function authorUrlRewrite(){
add_rewrite_rule('shop/([.*])/([.*])/([.*]).html$' , '$matches[3].html?prefecture=$matches[1]&genre=$matches[2]','top');
}
add_action( 'init', 'authorUrlRewrite' );

と記載してみましたがやはり動きません。
お知恵を拝借できないでしょうか。よろしくお願いします。

★★追記2(2/19)
解決の方法が思い当たらなかったので仕様の方を変えることになりました。 
ご回答いただいた方ありがとうございました。 
回答のご準備頂いていた方、いらっしゃったら申し訳ありません。 
いつかまた同じような問題にぶつかるかもしれませんので改めてお伺いいたします。

ありがとうございました。

★★★追記3(2/20)
仕様が変わって変わった結果結局やらざらるを得なくなったので継続して調査中です。
こちら http://doshiroutonike.com/web/wordpress/wp-custom/868/ とその参照先
http://www.webdesignleaves.com/wp/wordpress/159/
http://www.warna.info/wp-content/uploads/2012/10/wordbench-chiba20121014.pdf
を見ながら

function authorUrlRewrite(){
// echo 'done';
  add_rewrite_rule('restaurant/([^/]+)/?$', 'index.php?area=$matches[1]', 'top');
}
add_action( 'init', 'authorUrlRewrite' );

で、
http://xxxx.jp/test/restaurant/hokkaido

http://xxxx.jp/test/restaurant/?area=$hokkaido
の内容が表示できるところまで来ました。
若干、プラグインの内容や設定も変えているので直撃で参考にならないこともあるかもしれませんが、上記3URL、特に大曲様のPDFはこれを理解せずにリライトを進めようとしていたことを申し訳なく思っております。本件未解決ですが、今後同じことでつまずく方いらっしゃったら先にこちらご参照いただくのが良いかと思いました。

引き続き状況記載します。

★★★★追記4(2/21)
おかげさまで自己解決しましたのでコメント追加しております。
ありがとうございました。

★★★★★追記5(2/22)
>何か別の問題が発生しそう
…を解決する課程で、本件そのものの解決策を含めてごく一般的な方法で解決したのでさらに追記しています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

check解決した方法

0

Custom Post Type Permalinks というプラグインを使って、 設定 > パーマリンク設定 から件のカスタム投稿タイプの設定(下の方に追加されます)のところに
もともと書いてある
http://xxx.jp/test/restaurant
のあとのinput枠に
/%(カスタムタクソノミーの名前)%/%postname%.html

とするだけでした。今回カスタムタクソノミーの名前は area ですので

/%area%/%postname%.html

と入力するだけだったようです。

mod_rewriteなどURLの書き換えに気が行ってしまい全体的にただただややこしいことをしようとしていました。
これで検索のページからでも地域情報を含む形でURLを生成出来そうです。

度々の追記でしたが今後のご参考に(こういう結果ですので大抵はここに来る前にググッて解決しそうですが。。。)なればと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

mod_rewriteは詳しくありませんが以下の正規表現の内容が疑問です。

RewriteRule ^(.*)/(.*)/(.*)\.html$ ^$3\.html?a=$1&b=$2 [L]


期待する動作は以下のような内容ではないでしょうか?(動作環境がないため参考まで)

RewriteRule ^/([^/]+)/([^/]+)/([^/]+\.php)$ ^$3?prefecture=$1&genre=$2 [L]

また確認方法ですが、apacheのログを見ることで
正しくマッチして変換したがエラーになったのかマッチしなかったのか等の詳細が分かるかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/17 02:25

    横から失礼します。
    ログを見るのがいちばん、ということでは mod_rewrite にログを吐かせるのもよいかも。たくさんログ吐くので原因特定したらさっさとログを吐く設定は消した方がいいですが。

    RewriteLog "/tmp/rewrite.log"
    RewriteLogLevel 9

    キャンセル

  • 2016/02/17 07:32

    nakit様

    おはようございます。ありがとうございます。いただいたコメントを元に少し本文を修正いたしました。
    動作は変わらずでしたがありがとうございます。
    レンタルサーバーなのでhttod.confなどが触れず、ログの吐き出し方が分からない、というところです。
    まる一日分を翌日に見ることができるので、昨日の分を確認してみます。

    ありがとうございました!

    キャンセル

0

ちょっと検証環境準備するのがおっくうなので未検証ですが、ファイルが存在しない場合は、WordPress 用に書いた次のルールのところで解釈が止まってそこから下のルールは適用されないのではないでしょうか。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /xxx.com/index.php [L]


ここの三行で言っているのは、「ファイルやディレクトリが存在しない場合は、index.php に飛ばすようにして、これ以上のルール適用はしないよ ([L] で指定)」ですよね。
「存在しない .html だったら」というルールは、この三行目より前に書く必要がありそうです。

あとは、nakit さんがおっしゃっているようにログを見ながら試行錯誤してみるとよいのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/17 07:35

    unau様

    おはようございます。
    コメントありがとうございます。確かに L はそうですね。
    修正と確認後改めて結果をコメントいたします。

    ログの件もありがとうございます。確認してみます。

    ありがとうございます。

    キャンセル

0

mod_rewriteなら確実だとは思いますが、
私はWordpressならWordpressだけで完結させるのが良いと思っていますので、
add_rewrite_rule()とadd_filter('query_vars', function(){});
を使って実現することをおすすめします。

またサイトの全体構造はわかりませんが
投稿タイプやタクソノミーが複数ある場合、
やろうとしている正規表現だと
例えば
http://xxx.com/お知らせ/セール/my_news1.html
というページがある場合も
http://xxx.com/my_news1.html?prefecture=お知らせ&genre=セール
となりますのでもしそうであるならば
http://xxx.com/店舗/北海道/イタリアン/my_shop1.html
などと正規表現を区別できるようなURLにした方が良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/18 19:07

    ki6ool様

    ありがとうございます。お返事が遅くなって申し訳ありません。

    http://xxx.com/北海道/イタリアン/my_shop1.html

    http://xxx.com/my_shop1.html?prefecture=北海道&genre=イタリアン

    に、ということで

    function authorUrlRewrite(){
    add_rewrite_rule('shop/([.*])/([.*])/([.*]).html$' , '$matches[3].html?prefecture=$matches[1]&genre=$matches[2]','top');
    }
    add_action( 'init', 'authorUrlRewrite' );

    と書いてみました。が、やはり404です。

    サイトのURLは実は開発中のため http://hoge/xxx.com/ となっていますので、

    本来は
    http://hoge/xxx.com/北海道/イタリアン/my_shop1.html



    http://hoge/xxx.com/my_shop1.html?prefecture=北海道&genre=イタリアン

    が、これはなにか影響がありますでしょうか。

    ご回答ありがとうございました。よろしければ引き続きお知恵を貸していただけますでしょうか。
    よろしくお願いします。


    キャンセル

  • 2016/02/19 16:07

    すみません忘れてました、リライトルールを変更した場合は、パーマリンクを更新しなればいけないので
    管理画面の設定のパーマリンク設定で何も変更せずにそのまま変更を保存していただき、
    再度動作確認してみてください。

    キャンセル

  • 2016/02/20 17:32

    ki6ool様

    ありがとうございます。そしていただいたコメントに気づかずお返事がテレコになっており大変申し訳ございません。
    パーマリンクの更新、ありがとうございます。忘れずに実施します。

    追記の通り継続でadd_rewrite_rule()を試すことになりましたので状況を記載します。
    wordpressそのものにそんな機能があることを知らなかったので、ご助言が大変役立つ形となりました。ありがとうございます。

    キャンセル

0

解決の方法が思い当たらなかったので仕様の方を変えることになりました。
ご回答いただいた方ありがとうございました。
回答のご準備頂いていた方、いらっしゃったら申し訳ありません。
いつかまた同じような問題にぶつかるかもしれませんので改めてお伺いいたします。

ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こちらの件、wordpressのadd_rewrite_rule()を使うことで解決しました。
追記に書いてあるサイトや資料、頂いたコメントを参考にいたしました。
皆さん、ありがとうございます。

http://xxx.jp/test/restaurant/hokkaido/oreno_mise.html

で、
カスタム投稿タイプ restaurant の
カスタムタクソノミー hokkaido の
oreno_mise の情報を出す。

function authorUrlRewrite(){
  add_rewrite_rule('restaurant/([^/]+)/(.+?).html?$', 'index.php?restaurant=$matches[2]&area=$matches[1]', 'top');
}
add_action( 'init', 'authorUrlRewrite' );

と、なりました。
表示にあたってはエリア情報(hokkaidoの部分)は要らないのですが一応入れてます。
要らない時は

function authorUrlRewrite(){
  add_rewrite_rule('restaurant/([^/]+)/(.+?).html?$', 'index.php?restaurant=$matches[2]', 'top');
}
add_action( 'init', 'authorUrlRewrite' );


で表示できました。

ページ送り?など考慮していないのと、投稿の作成で生成されるURLはカスタムタクソノミーの挟まらない
http://xxx.jp/test/restaurant/oreno_mise.html
なのでまた何か別の問題が発生しそうですが^_^; ひとまず解決とさせていただきます。

ご助言いただいた皆様、投稿を見た頂いた皆様ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る