🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1291閲覧

【WP】カスタム投稿タイプのURLのリライトについて

qpooooh

総合スコア11

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/12/10 01:43

###【概要】
1つのドメインにwpが2つインストールされているのですが、カスタム投稿タイプの記事URLをリライトをおこないたいです。

###【環境】

  • PHP7.3.9
  • WordPress 5.2.2

###【前提】

  • 「rootディレクトリ直下」と「/A/B/」それぞれにwpがインストールされいている

wordpress1(URL:wordpress1)
┗A━B━wordpress2(URL:wordpress1/A/B/)

  • wordpress1に「A」という固定ページ(URL:wordpress1/A)が存在する
  • wordpress2のカスタム投稿「C」が存在する(URL:wordpress1/A/B/C/)

###【やりたいこと】

  • wordpress2のカスタム投稿「C」のURLを「wordpress1/A/C/」にリライトしたい
  • wordpress1内にカスタム投稿タイプを作成するのではなく、wordpress2内のカスタム投稿タイプのURLリライトをおこないたい

こちらは実現可能でしょうか?
情報不足等ございましたらご指摘いただけますと幸いです。
ご教示のほど、よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

皆様のご助言のおかげで、当初とは違う形となりましたが、無事解決に至りました。

自分のメモを兼ねて、方法を記載いたします。
不格好ですので、ページ数が多かったり投稿を増やしていきたい場合には向いておりません。

  1. 「wordpress1」に今回設定したいURLのディレクトリを作成する
  2. 作成したディレクトリにそれぞれ「index.php」を設置する
  3. 「wordpress2」のfunctions.phpにリライトルールを記述する

①「wordpress1」に今回設定したいURLのディレクトリを作成する

元々wordpress1直下に「/A」というディレクトリ(URL:wordpress1/A)を作成し、
こちらのサイトを参考に、index.phpを設置しておりました。
今回、このディレクトリに「/D」(URL:wordpress1/A/D)を作成します。
※「wordpress2」のカスタム投稿タイプ「C」(URL:wordpress1/A/B/C)を「D」というディレクトリ(URL:wordpress1/A/D)にリダイレクトさせます
「/D」の中にページ表示用のディレクトリを作成していきます。
例:URL:wordpress1/A/D/01

作成したディレクトリにそれぞれ「index.php」を設置する

作成したディレクトリにindex.phpを設置します。
先ほど同様、こちらのサイトを参考に設置しますが、
このとき、index.php内の記述を下記のように変更する必要があります。

【「/D」(URL:wordpress1/A/D)】

PHP

1require( dirname( __FILE__ ) . '/../B/wp-blog-header.php' );

【「/D/01」(URL:wordpress1/A/D/01)】

PHP

1require( dirname( __FILE__ ) . '/../../B/wp-blog-header.php' );

「wordpress2」のfunctions.phpにリライトルールを記述する

WP Rewriteを参考に、「wordpress2」のfunctions.phpにリライトルールを記述していきます。
wiki内の例をコピペし、「wp_insertMyRewriteRules」を書き換えます。

PHP

1function wp_insertMyRewriteRules($rules) 2{ 3 $newrules = array(); 4 $newrules['A/D/01'] = 'index.php?post_type=C&p=ページID'; 5 return $newrules + $rules; 6}

自分自身十分に理解しておりませんでしたが、上記の書き方で
「A/D/01」(URL:wordpress1/A/D/01)にアクセスしたとき、
wordpress2の「index.php?post_type=C&p=ページID」の情報を表示する
という意味のようです。

以上の方法で「URL:wordpress1/A/B/C/01」を「URL:wordpress1/A/D/01」に表示させることができました。

投稿2019/12/10 07:06

qpooooh

総合スコア11

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

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

0

ちょっと気になる点としては...

wordpress1/A と wordpress2 がインストールされているディレクトリ /A/B 部分の ディレクトリ /A は、同じ名前ですか?

標準状態の WordPress では、スラッグと同名のディレクトリがある場合、ディレクトリが優先されると思うのですが、 wordpress1/A で、固定ページの表示は、正しく動作していますか?


同じサーバー内の別の URL の内容を RewriteRule で表示したいということであれば、 wordpress1/A/.htaccess に

RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*) /A/B/$1 [L]

の様な感じで、.htaccess で、RewriteRule を設定して、WordPress2 へ処理を転送すれば良いと思います。

WordPress2 側から、wordpress1/A/C のような URL で出力が必要であれば、WordPress2 側で、WP_Rewrite で、URLを設定する必要があるかもしれません。


別解としては、WordPress1 の固定ページのカスタムテンプレートで、 WP REST API 等を用いて、WordPress2 のカスタム投稿を取得して、表示させるという方法もありかもしれません。

投稿2019/12/10 02:24

CHERRY

総合スコア25218

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

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

qpooooh

2019/12/10 05:45 編集

説明不足の中、ご回答いただきありがとうございます! 【ディレクトリに関しまして】 「wordpress1/A」と「wordpress2/A/B/」の「/A」は同じ名前となっています。 下記サイトを参照し、固定ページを表示させるように設定いたしました。 http://do-wp.com/how-to-place-a-directory-with-the-same-name-as-the-page-slug/ 結果、「wordpress1/A」と「wordpress2/A/B/」ともに表示することができました。 ------------------------------------------------------------------------------------------------------------------------ 【WP_Rewriteに関しまして】 申し訳ございません。wiki等読んだのですが、上手く理解できず… https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Rewrite#.E4.BE.8B こちらを参照して「wordpress2」内のfunctions.phpに 「wp_insertMyRewriteRules」を変更して書いてみたのですが、適用されませんでした。 正規表現、WP_Rewriteともに知識がなく、誤り等ございましたらご指摘くださいますと幸いです… 以下、書いたコードです。 =========================== //応用のリライトルールの追加 add_filter('rewrite_rules_array','wp_insertMyRewriteRules'); add_filter('query_vars','wp_insertMyRewriteQueryVars'); add_filter('init','flushRules'); // ルールを追加するときはflush_rules()を忘れないように function flushRules(){ global $wp_rewrite; $wp_rewrite->flush_rules(); } // 新しいルールを追加 function wp_insertMyRewriteRules($rules) { $newrules = array(); $newrules['/A/B/C/01/'] = '/A/C/01/'; return $newrules + $rules; } // 変数idを追加して、WordPressが認識できるようにする function wp_insertMyRewriteQueryVars($vars) { array_push($vars, 'id'); return $vars; } =========================== 余談ですが、参照したwiki内に > ブログのルートを生成するためのリライトルールにフィルターをかけるにはroot_rewrite_rulesを使います。 > すべてろリライトルールにフィルターをかけるには、rewrite_rules_arrayを使います。 と記載があったのですが、今回の場合、どちらを使用するほうが良いのでしょうか…?
guest

0

ベストアンサー

おおよそイメージ掴まれてるいるようですので、例えば
wordpress2でカスタム投稿タイプを作成とRewriteAPIを利用し、
wordpress1では、単に対応URLへリダイレクトさせるのではどうでしょうか。

投稿2019/12/10 02:07

編集2019/12/10 02:11
madone99

総合スコア1857

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

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

qpooooh

2019/12/10 05:12 編集

ご回答いただきありがとうございます! wordpress2でのカスタム投稿タイプの作成は完了しているのですが、 ①「wordpress2」のfunctions.phpにWP Rewriteを書く ②「wordpress1」の.htaccessに対応URLへリダイレクトさせる ということでしょうか? 理解不足で申し訳ございません…
madone99

2019/12/10 04:19 編集

おっしゃる通りです。おおむねcherry様の仰る事と同じです。 一点、コメントで書いておられたコードでflush_rules()だけでは有効にならないので 設定のパーマリンク設定で、一度変更なしでも保存をする必要があるかも知れません。
qpooooh

2019/12/10 05:22

ご丁寧に教えてくださりありがとうございます! WP Rewriteの変更後は設定のパーマリンクの保存が必要なのですね。勉強になりました。 .htaccessの書き方なのですが、「wordpress1」直下の.htaccess(URL:wordpress1/.htaccess)に 下記の通り設定したところ、変化がありませんでした… (関係あるかは不明ですが、念のため「wordpress1」のパーマリンク設定の更新も行いました) =========================== # リダイレクト処理 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^A/B/C/(.*)$ /A/C/$1 [R=301,L] </IfModule> # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> =========================== 正規表現に明るいわけではないので、どこか間違っているかもしれません。 (そもそもWP Rewriteから誤っている可能性もございます…) ご指摘くださいますと大変助かります。
madone99

2019/12/10 06:40 編集

おそらく.htaccessの問題でなく、WP_Rewriteの書き方の問題かなと。 例えば、/A/B/C/01のうち、「01」が投稿IDなのだとしたら 以下のようではないでしょうか? (A,Bはリライトに関係ないので無視、Cはカスタム投稿タイプという表現です) $newrules['/A/B/(.*)+/(\d*)$'] = 'index.php?post_type=$matches[1]&id=$matches[2]';
qpooooh

2019/12/10 06:33

ご指摘いただきありがとうございます! 根本的な部分が理解できておりませんでした… 試行錯誤の結果、無事に理想のURLへリライトすることに成功しました。 ご助言いただきありがとうございました。
madone99

2019/12/10 06:35

解決されたようで良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問