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

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

新規登録して質問してみよう
ただいま回答率
85.48%
mod_rewrite

ApacheウェブサーバーのためのURL書き換えモジュールです。主にプリティーURLに使われていますが、同様に単純置換を超えた、多様なタスクの処理能力や柔軟性があります。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

6回答

2851閲覧

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

c5kmx9ts

総合スコア16

mod_rewrite

ApacheウェブサーバーのためのURL書き換えモジュールです。主にプリティーURLに使われていますが、同様に単純置換を超えた、多様なタスクの処理能力や柔軟性があります。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

1クリップ

投稿2016/02/16 13:30

編集2016/02/22 03:12

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)

何か別の問題が発生しそう

…を解決する課程で、本件そのものの解決策を含めてごく一般的な方法で解決したのでさらに追記しています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答6

0

自己解決

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

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

/%area%/%postname%.html

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

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

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

投稿2016/02/22 03:18

c5kmx9ts

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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
なのでまた何か別の問題が発生しそうですが^_^; ひとまず解決とさせていただきます。

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

投稿2016/02/20 22:54

c5kmx9ts

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2016/02/19 07:28

c5kmx9ts

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/17 04:56

ki6ool

総合スコア150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

c5kmx9ts

2016/02/18 10:07

ki6ool様 ありがとうございます。お返事が遅くなって申し訳ありません。 http://xxx.com/北海道/イタリアン/my_shop1.htmlhttp://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.htmlhttp://hoge/xxx.com/my_shop1.html?prefecture=北海道&genre=イタリアン が、これはなにか影響がありますでしょうか。 ご回答ありがとうございました。よろしければ引き続きお知恵を貸していただけますでしょうか。 よろしくお願いします。
ki6ool

2016/02/19 07:07

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

2016/02/20 08:32

ki6ool様 ありがとうございます。そしていただいたコメントに気づかずお返事がテレコになっており大変申し訳ございません。 パーマリンクの更新、ありがとうございます。忘れずに実施します。 追記の通り継続でadd_rewrite_rule()を試すことになりましたので状況を記載します。 wordpressそのものにそんな機能があることを知らなかったので、ご助言が大変役立つ形となりました。ありがとうございます。
guest

0

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

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

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

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

投稿2016/02/16 17:34

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

c5kmx9ts

2016/02/16 22:35

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

0

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

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

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

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

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

投稿2016/02/16 14:02

nakit

総合スコア410

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unau

2016/02/16 17:25

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

2016/02/16 22:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問