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

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

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

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

PHP

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

Q&A

解決済

1回答

2131閲覧

WordPressの通常投稿に階層構造(親子関係)を持たせ、URLにも反映させたい

shimosaka_h

総合スコア5

WordPress

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

PHP

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

0グッド

0クリップ

投稿2020/02/24 09:46

前提・実現したいこと

WordPressの通常投稿に、固定ページやカスタム投稿タイプと同じように階層構造(親子関係)を持たせ、URLにも反映させたいと考えております。

【実現したい例】
親ページ:https://example.com/category/parent-slug/
子ページ:https://example.com/category/parent-slug/child-slug/

試したこと

参考:投稿(post)を階層構造にしてもURLは階層構造にならない!を解決する( parent-slug/child-slug にする)

上記サイトを参考に実装してみたのですが、
確かに親子関係を持たせ子ページの作成は出来たのですが、

子ページ②:https://example.com/category/child-slug/

上記URLのような親の階層を抜いたURLでも同じページにアクセスできてしまうようでした。

サイトの構成的にもSEO的にも、どちらでもアクセスできてしまうのは問題だと思いますので、
(そもそも子ページ②でアクセスできてしまうとわざわざ階層構造を持たせた意味がないので、)
子ページ②にはアクセスできないようにしたいです。

ご助力いただけますと幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

きちんとは動作確認をしていないのですが、こんな感じでしょうか。

PHP

1add_action( 'template_redirect', 'teratail243258_shimosaka_h' ); 2function teratail243258_shimosaka_h() 3{ 4 global $post; 5 6 $uri = $_SERVER['REQUEST_URI']; 7 8 if (!is_object($post) || !$post->post_parent) 9 { 10 return; 11 } 12 else 13 { 14 $parent_slug = get_post($post->post_parent)->post_name; 15 } 16 17 // URIに親投稿のスラッグが含まれていなかったら 18 if (!stristr($uri, $parent_slug)) 19 { 20 global $wp_query; 21 $wp_query->set_404(); 22 status_header(404); 23 } 24 25 return; 26}

追記

is_preview()判定を追加しました。

PHP

1add_action( 'template_redirect', 'teratail243258_shimosaka_h' ); 2function teratail243258_shimosaka_h() 3{ 4 global $post; 5 6 $uri = $_SERVER['REQUEST_URI']; 7 8 if (!is_object($post) || !$post->post_parent || is_preview()) 9 { 10 return; 11 } 12 else 13 { 14 $parent_slug = get_post($post->post_parent)->post_name; 15 } 16 17 // URIに親投稿のスラッグが含まれていなかったら 18 if (!stristr($uri, $parent_slug)) 19 { 20 global $wp_query; 21 $wp_query->set_404(); 22 status_header(404); 23 } 24 25 return; 26}

投稿2020/02/27 07:46

編集2020/02/28 08:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shimosaka_h

2020/02/28 05:22 編集

返信が遅れてしまい申し訳ございません。 ご回答いただきありがとうございます。 親ページを持つページで且つURLに親スラッグを持たないものを404に飛ばすという処理ですね。 ひとまずこれで今懸念していることは解消できそうです。 これで対応してみたいと思います。ありがとうございます。 ちなみになのですが、 子ページ②:https://example.com/category/child-slug/ そもそもこのURLが生成されないようにあらかじめ処理をしておくことは可能だったりするのでしょうか。 WordPressのページ生成のメカニズムについてそこまで理解できていなくて申し訳ないのですが、 何か策がありそうであればご教授いただけますと幸いです。 (重ねての質問になりすみません。)
退会済みユーザー

退会済みユーザー

2020/02/28 06:59

「生成されない」とは具体的にどのような状態を想定していますか? もし、懸念しているURLをWordPressのシステムが発行するケースがある(そういう関数が存在する)のであれば、そこにカスタマイズを施す対策はできると思いますが、実際にそういうケースが存在するのでしょうか? 一応補足しておきますと、WordPressのページ生成は(1)HTTPリクエストをWordPressが受け取る、(2)リクエストに含まれるURLもしくはクエリ文字列を解析する、(3)解析結果に応じたページ内容を表示する、という感じで、リクエストに応じて動的にページを表示する仕組みだったと思います。
shimosaka_h

2020/02/28 07:09

回答ありがとうございます。 懸念していたのは、例えば今回のケースですと、 ①https://example.com/category/parent-slug/child-slug/ ②https://example.com/category/child-slug/ ①と②両方で同じページにアクセスできてしまう状態になってしまうため、 Googleに両方をインデックスされ、全く同じページが2つある、重複コンテンツとして扱われてしまうのではないかというものでした。 なので、②の方にアクセスできない(生成されない)ようにすればその懸念も拭えるのではないかと思った次第です。 もしGoogle側に②の方のアドレスが伝わらないのであれば両方でアクセスできる状態でも問題はないのですが… いろいろと勉強不足で大変申し訳ないです。
退会済みユーザー

退会済みユーザー

2020/02/28 07:44 編集

> 懸念していたのは、例えば今回のケースですと、 はい、その点は理解しています。そのため、2の形式のURLにアクセスされた場合は404ステータスコードを返すコードを回答しました。 もし、「生成されない」という状態が意味しているのが、404ステータスコード以外のステータスコードを返したいということであれば、status_headerで返すコードを変更すればよいと思います。 > もしGoogle側に②の方のアドレスが伝わらないのであれば両方でアクセスできる状態でも問題はないのですが… これに関してはGoogle側のクローラーがどんな仕組みで動いているのかを私は知らないので、コメントを差し控えます。 ただ、もし、どこかのページに懸念しているURLへのリンクが表示されることが確認されているのであれば、それの対応策は考えられます
shimosaka_h

2020/02/28 08:02

回答ありがとうございます。 >どこかのページに懸念しているURLへのリンクが表示されることが確認されているのであれば、それの対応策は考えられます 現状この子ページのURLを出力する際は全て①の方で出力されているので問題はなさそうです。 Googleにインデックスされるかどうかは試してみないと分からなそうですよね。ひとまずこれでやってみたいと思います。 ありがとうございます。 最後にもう一点お窺いしたいのですが(何度も本当にすみません) いただいたコードですと、公開前の子ページの記事の編集中、プレビューを表示させようとしても404に飛んでしまうようでした。 (子ページの記事を公開した後であれば問題なくプレビューを表示させることが出来ました。) 公開前プレビュー画面のみ処理を分けたりすることは可能でしょうか。
退会済みユーザー

退会済みユーザー

2020/02/28 08:13

コードに、プレビュー時には親スラッグ有無判定をしないようにする判定を追加しました。 ご確認ください。
shimosaka_h

2020/02/28 08:26

回答ありがとうございます。 考えれば分かることでしたね;お手数おかけいたしました。すみません。 いろいろとありがとうございました。 本当に助かりました。感謝です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問