ワードプレスの固定ページの親子関係のURLを下記のようにしたいです。


aaa/index.html
aaa/page01.html
aaa/page02.html
bbb/index.html
ccc/index.html
ccc/page01.html

上記URLの実現は可能でしょうか。
可能な場合、実現方法のソースorプラグインのご紹介をお願い致します。

プラグインの【.html on PAGES】を入れる事で、

aaa.html
aaa/page01.html
aaa/page02.html
bbb.html
ccc/index.html
ccc/page01.html

とする事は出来ました。が、ディレクトリトップにindex.htmlを置く事が出来ません。
固定ページ投稿ページのスラッグにスラッシュを入れて入力しても
自動で省かれてしまいます。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/05/24 17:58:03
  • 終了:2011/05/31 18:00:02

回答(1件)

id:rouge_2008 No.1

rouge_2008回答回数594ベストアンサー獲得回数3512011/05/25 07:10:01

ポイント60pt

ナビゲーションメニューを利用する方法ですので、WordPress 3.0以上が対象です。(プラグインは使用しません。)


1.パーマリンク設定の変更します。

ダッシュボードの「設定」→「パーマリンク設定」で「月と投稿名」などどれでもいいので、「デフォルト」以外を選択してから「変更を保存」で設定を変更します。


2.「.htaccess」を変更します。

次の行より上に「RewriteRule ^(.+?)/(.+?)\.html$ /wp-blog/index.php/$1-$2/ [L]」を記述します。

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

・変更後


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp-blog/
RewriteRule ^index\.php$ - [L]
RewriteRule ^(.+?)/(.+?)\.html$ /wp-blog/index.php/$1-$2/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp-blog/index.php [L]
</IfModule>

# END WordPress



3.「/wp-includes/nav-menu-template.php」を編集します。(※約192行目)

	// ここから追加
	foreach( $menu_items as $key => $menu_item ) {
		if(preg_match('#[^/]+?(-+?)[^/]+?/$#', $menu_item->url, $arr, 0 , 30←この数値は環境に合わせて変更します) ) {
			$menu_item->url = preg_replace('#([^/]+?)-+?([^/]+?)/$#', '$1/$2.html', $menu_item->url);
		}
	}

	// ここまで追加
	// Set up the $menu_item variables
	_wp_menu_item_classes_by_context( $menu_items );

※上記一箇所変更する必要があります。

※WordPressを設置したURLの文字数を指定します。(http://から数える)

(例えば、「http://www.example.jp/blog/」なら「27」を指定します。)



4.「/wp-includes/canonical.php」を編集します。(約367行目)

	if ( $do_redirect ) {
		// protect against chained redirects
		if ( !redirect_canonical($redirect_url, false) ) {
			// 次から2行をコメントアウト
			//wp_redirect($redirect_url, 301);
			//exit();
		} else {



これで準備は完了です。

※ナビゲーションメニューを利用せず、テンプレートにメニューのHTMLを直接記述する場合は、1と2の手順のみを行ってください。


次はナビゲーションメニューを利用する場合も、テンプレートに直接メニューを記述する場合も共通の作業です。


『固定ページ作成時の注意点』

1.固定ページの作成時にパーマリンクと編集ボタンが表示されたら、次のように「親フォルダ名-(ハイフン)ページ名」の関係になるように、入力して「OK」を押します。

パーマリンク: http://www.example.jp/blog/service-index/

2.ページ属性で親は「親なし」のまま変更しないでください。


※ナビゲーションメニューは、ダッシュボードの「外観」→「メニュー」でカスタムメニューを作成して、「テーマの場所」のメインメニューに作成したカスタムメニューを選択して保存すると、ナビゲーションメニューに対応したメニューで表示されます。

・カスタムメニューの作成方法

http://wordpress.siyouyo.com/dash/gaikan/1973/


http://wpdocs.sourceforge.jp/Appearance_Menus_SubPanel

http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%9...


※何か不明な点がある場合は、コメント欄を開けてくださるとやり取りしやすいです。

id:akide

詳細ご説明ありがとうございます。

せっかく頂いたご説明ですが、RewriteEngineでつまずいています。

具体的には、URLの書き換えが出来ません。

頂いたご説明では

「RewriteRule ^(.+?)/(.+?)\.html$ /wp-blog/index.php/$1-$2/ [L]」

となっていますが、「service/index.html」にアクセスしても「/service-index」を

読み込まず、404エラーになります。

RewriteRuleを私なりに

「RewriteRule ([0-9A-Za-z]+)/index\.html$ /wp/$1-index [L]」と

しましたが、やはり404エラーになります。

解決策はどちらにありますか。

2011/05/25 16:57:19
  • id:rouge_2008
    すみません。一部(RewriteBase等)自分のブログの記載になっていました。
    wpフォルダに設置しているのでしたら、以下のようになります。

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /wp/
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^(.+?)/(.+?)\.html$ /wp/index.php/$1-$2/ [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /wp/index.php [L]
    </IfModule>

    # END WordPress
  • id:akide
    WPフォルダの件失礼致しました。
    断りなく自分の環境で書いてしまい失礼致しました。

    RewriteRule ^(.+?)/(.+?)\.html$ /wp/index.php/$1-$2/ [L]
    この部分でサーバが500エラーになってしまいます。正規表現も詳しくないのですが

    RewriteRule ^(.*)/(.*)\.html$ /wp/index.php/$1-$2 [L]
    RewriteRule ^([0-9a-zA-Z]+)/([0-9a-zA-Z]+)\.html$ /wp/index.php/$1-$2 [L]
    になるのでは?と考えたのですが、上記2パターンでアクセスしても
    やはり、「service/index.html」にアクセスしてもWPの404エラーが表示されます。

    もう少々お付合い願えますか。。。
  • id:rouge_2008
    こちらこそすみません。
    akideさんの設置環境を聞かずにうっかり自分の環境のままで回答してしまいました。
    「http://ドメイン名/wp/」というURLがWordPressのトップですか?
    それから、1~4の作業をすべて完了済みでしょうか?(※ナビゲーションメニュー使用)
    以下ではどうでしょうか?

    RewriteRule ^([^/]+)/([^/]+)\.html$ /wp/index.php/$1-$2/ [L]


    あるいは、ご自分で考えた記述の最後に「/」を付けても大丈夫かもしれません。

    RewriteRule ^([0-9a-zA-Z]+)/([0-9a-zA-Z]+)\.html$ /wp/index.php/$1-$2/ [L]

    ※最後はスラッシュが必要です。「~$1-$2 [L]」ではなくて「~$1-$2/ [L]」



    ※どちらの記述も「http://ドメイン名/」がトップの場合、RewriteBaseなどその他の記述も変更する必要があります。
  • id:akide
    >「http://ドメイン名/wp/」というURLがWordPressのトップですか?

    設置環境としましては、
    http://ドメイン/wp/wp-admin/ 本体ファイル
    http://ドメイン/wp/ WordPressのトップ 公開ディレクトリとなっています。

    > それから、1~4の作業をすべて完了済みでしょうか?(※ナビゲーションメニュー使用)

    いえ、ナビゲーションメニューの利用予定はなく、
    固定ページ「service/index.html」はURLを直接指定しての
    ページ遷移の予定です。

    現状 RewriteRule ^([^/]+)/([^/]+)\.html$ /wp/index.php/$1-$2/ [L]
    試し1 RewriteRule ^([^/]+)/([^/]+)\.html$ /wp/$1-$2/ [L]
    試し2 RewriteRule ^([^/]+)/([^/]+)\.html$ [絶対パス/wp/$1-$2/ [L]

    http://ドメイン/wp/service/index.html ワードプレスの404エラー
    http://ドメイン/wp/service-index 正常にアクセス

    になります。。。

  • id:rouge_2008
    すみません。
    直接メニューリンクを書く場合も4の作業は必要でした。

    RewriteRuleに関してはご紹介した方法のどれでも大丈夫かもしれません。
    とりあえずおすすめは次です。

    RewriteRule ^([^/]+)/([^/]+)\.html$ /wp/index.php/$1-$2/ [L]


    お手数取らせて申し訳ありません。m(__)m
  • id:akide
    rouge_2008さん、何度も恐縮です。。。

    >直接メニューリンクを書く場合も4の作業は必要でした。

    3.「/wp-includes/nav-menu-template.php」を編集します。(※約192行目)
    4.「/wp-includes/canonical.php」を編集します。(約367行目)

    上記2ファイルを更新し試してみましたが、やはり
    WPの404が出力されてしまいます。

    関係が無いかも知れませんが

    RewriteBase /wp
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^([0-9a-zA-Z]+)/([0-9a-zA-Z]+)\.html$ $1-$2 [L]

    としますと、WPの404エラー

    RewriteBase [絶対パス]/wp
    RewriteRule ^index\.php$ - [L]
    RewriteRule ^([0-9a-zA-Z]+)/([0-9a-zA-Z]+)\.html$ $1-$2 [L]

    としますと、さーばの404エラー
    The requested URL [絶対パス]/wp/service-index was not found on this server.

    また、現状試しているサーバは制限が多いサーバのようで
    (ホスティング会社は不明)で、PHPはcgi版、PHP Version 5.2.8
    PHPの設定など何か確認したほうがよい事ありそうでしょうか。

    また、さくらの共用サーバで同様に試してみましたが、
    No input file specified. と表示され、素人考えですが、
    [service/index.html]にブラウザアクセスし、サーバ内で
    [service-index]を表示する際に、PHPとして認識されていないのでは?
    と考えてみたんですが、何かの参考にならないでしょうか。

    >お手数取らせて申し訳ありません。m(__)m

    rouge_2008さんだけが頼りです、、、
    もう少々お付合い頂けると助かります。
  • id:rouge_2008
    すみません。
    モジュール版で確認していたので気がつきませんでした。
    別の方法で出来ないか調べている所ですが、他の方の回答も待ってみてください。
    このまま誰からの回答も付かなかった場合は、モジュール版のPHPが使えるサーバーへの移行も検討してみてください。
    それでは、解決方法が見つかったらまたコメントします。m(__)m
  • id:rouge_2008
    すみません。私では無理でした。
    「Improved Page Permalinks」でしたら、以下のような構成に出来ます。
    /aaa/
    /aaa/abc.html
    /aaa/efg.html
    /bbb.html(※子ページを作成するまではフォルダ名扱いになりません。親の1ページだけ必要な場合でも、ダミーの子ページを作成して親子指定をしてから、子ページを非公開にしてください。)
    /ccc/
    /ccc/test01.html

    http://wordpress.org/extend/plugins/improved-page-permalinks/

    ※.htaccessに次の記述を追加すると、「/aaa/index.html」へのアクセスがあった場合は、[/aaa/]にリダイレクトさせる事ができます。

    RewriteRule ^([^/]+)/index.html$ /wp/$1/ [R=301,L]


    ※「/aaa/index.html」の方を作成して、「/aaa/」にアクセスがあった場合に「/aaa/index.html」へのリダイレクトにする場合は、次の記述を追加します。
    (WordPressでは、「/aaa/」へのアクセスで「/aaa/index.html」を読み込み表示させる事はできないので、リダイレクトになります。)

    RewriteRule ^([^/]+)/?$ /wp/$1/index.html [R=301,L]



    ※ページ作成に関してですが、パーマリンクを「page01」、「page02」等とした場合、なぜか「page01-2」、「page02-2」等となりました。(「test01」等「page+数字」の組み合わせ以外でしたら大丈夫なようです。)


    どうしてもCGI版PHPのサーバーを利用する場合は、上記の方法など運用面でカバーしてみてください。
  • id:rouge_2008
    一部訂正します。
    「/aaa/」にアクセスがあった場合に「/aaa/index.html」へリダイレクトさせる記述は以下になります。

    RewriteCond $1 !(wp-admin|\.php)
    RewriteRule ^([^/]+)/?$ /wp/$1/index.html [R=301,L]


    大変失礼しました。m(__)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません