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

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

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

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

PHP

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

Q&A

解決済

1回答

2543閲覧

Wordpressでスラッグに「/」を含めることはできますか?

gorimaz

総合スコア26

WordPress

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

PHP

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

0グッド

0クリップ

投稿2019/12/02 09:22

###前提・実現したいこと
お世話になっております。
先日からWordpressでのサイト作りに取り組んでいます。

以下のURL構造を目指し、「red/smith」や「pink/smith」の部分をスラッグとして扱いたいです。

http://example.com/mypost/red/smith
http://example.com/mypost/pink/smith

(※mypostはカスタム投稿タイムです)

###発生している問題
スラッグからページ情報を取得する関数「get_page_by_path()」の使用に際して、第一引数に上のような「red/smith」というスラッグを指定しても、ページ情報が取得できません。

つまり次のコードで「$page」を取得したいのですが…できますでしょうか?
$page = get_page_by_path( 'red/smith', OBJECT, 'mypost' );

###該当のソースコード
functions.phpに以下「sanitize_title」を記載し、スラッグに「/」を含めることには成功致しました。

あとは問題の点ですが、どうすれば最終行にある「$page」を取得できますでしょうか。

php

1 2// 各記事のページでパーマリンク文字列を入力する際、スラッシュがハイフンに自動変換されてしまうのを防ぐ 3remove_filter('sanitize_title', 'sanitize_title_with_dashes'); 4add_filter('sanitize_title', function($title, $raw_title = '', $context = 'display'){ 5 if(seems_utf8($title)){ 6 $title = utf8_uri_encode($title, 200); 7 } 8 return $title; 9}); 10 11// 以下の取得が目的 12$page = get_page_by_path( 'red/smith', OBJECT, 'mypost' ); 13

###試したこと
■プラグイン導入
上のソースコードを削除し、プラグイン「Permalink Manager Lite」を導入しました。
しかしこちらも、スラッグに「/」を含めることには成功しても、「get_page_by_path()」が使用できません。

■ソースコードの追加
functions.phpに以下を追加しましたが、「get_page_by_path()」は使えませんでした。

php

1// リライトルールを書き換える 2function my_rewrite_rules_array($my_rewrite) { 3 4 $return_rule = array(); 5 6 foreach ($my_rewrite as $regex => $rewrite){ 7 8 // スラッシュをはじかないルールに書き換える。 9 $regex = str_replace('[^/]', '.', $regex); 10 11 // リライトルールをセット 12 $return_rule[$regex] = $rewrite; 13 } 14 15 return $return_rule; 16} 17 18add_filter('rewrite_rules_array', 'my_rewrite_rules_array');

■ハイフンへの置換
最終的にできたのが次で、「/」として保存したものを、取得の際は「-」に置換するという方法です。

php

1// スラッグを取得 2$url = "http://example.com/mypost/red/smith/"; 3preg_match( '/http://example.com/mypost/(\S+)/', $url, $slug ); 4/* 5var_dump( $slug ); 6array(2) { 7 [0]=>string(36) "http://example.com/mypost/red/smith/" 8 [1]=>string(10) "red/smith/" 9} 10*/ 11 12// 上の「red/smith/」を「red-smith」へ置換 13$slug = rtrim( $slug[1], '/' ); 14$slug = str_replace('/', '-', $slug); 15 16// 以下で取得できたが、置換の手間をなくしたい 17$page = get_page_by_path( $slug, OBJECT, 'mypost' );

上のコードでできましたがこの置換の手間をなんとも野暮ったく感じております。

登録値が「red/smith」なのですから、置換の手間なくそのまま
$page = get_page_by_path( 'red/smith', OBJECT, 'mypost' );
で取得したいと考え、ご質問させて頂いた次第です。

アドバイスや情報などお待ちしております。どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

無理です

get_page_by_pathのソースコードを見ると

php

1$parts = explode( '/', trim( $page_path, '/' ) );

というコードがあり、/を区切り文字として処理をしていることがわかります
つまり/を名前に使うと、そこで区切られてしまい正常に処理ができなくなるということです

尚且つ関数の中にフィルタがないため
特定のパスを条件に上書きするといったこともできません

get_page_by_pathはページの親子関係のパスを解釈してページを取得します
get_page_by_path( 'red/smith',でページを取得したいなら
素直にページを親子関係にしましょう

投稿2019/12/02 09:38

編集2019/12/02 09:43
KazuhiroHatano

総合スコア7804

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

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

gorimaz

2019/12/02 10:54

あちらこちらでお世話になってしまいすみません。ご回答ありがとうございます。 ということは、my_get_page_by_path()のような関数を自作し、 ご指摘の $parts = explode( '/', trim( $page_path, '/' ) ); を変えて、うまいこと WHERE post_name IN ($in_string) の$in_stringに渡せるようにできれば取得できそうな臭いがしませんか? とかいって、これをやるとさらに懸念が生まれそうで怖いですw
KazuhiroHatano

2019/12/03 03:50

それで取得できるようにしたところであまりメリットはないように思います get_page_by_pathはWP内部でそこそこ使われていて この関数で正常に投稿を取得できなくしてしまうことは いくつかの処理においてWPがその投稿の存在を 認識できないということになり 予期しない問題を引き起こす可能性を生みます
gorimaz

2019/12/03 07:18

なるほど、お伺いしてみてよかったです。 そもそもなぜ、ご教示いただいたような親子関係にせず、1つのスラッグを使おうとしているのかと言いますと、 すでにあるサイトのURLが http://red.com/smith のような一階層だけでなく http://red.com/right/smith http://red.com/left/taste/smith など多階層でして、 これらに今回のWordpressを対応させようとすると http://example.com/mypost/red/smith http://example.com/mypost/red/right/smith http://example.com/mypost/red/left/taste/smith が必要になってしまい、「smith」の親として必要なページが「red,right,left...」と肥大してしまうのです。 このページ肥大化を避けるため、多階層を親子関係で表現することをやめて1つのスラッグで表現する必要を感じています。 そこで最後に改めてご質問させてください。 このように1つのスラッグで表現することが必須(たぶんw)である場合ですと、 ・質問にあるようにハイフンに置換して、get_page_by_path()を使う。 ・ハイフンには置換せず、my_get_page_by_path()を作る。 では前者が安全面や手間を考慮すれば妥当でしょうか? もし他に妙案ございましたら頂戴できましたら幸いです。 長々とこちらの事情を書き連ねてしまい申し訳ございません。
KazuhiroHatano

2019/12/04 02:32

http://example.com/mypost/red/left/taste/smithというページがあるとして http://example.com/mypost/red/left/taste/ http://example.com/mypost/red/left/ http://example.com/mypost/red/ というページも存在するなら親子ページでやるのが一番シンプルです ページの関係性がわからないので ベストな選択がどれだとは言えないですが カスタム投稿 リライトエンドポイント マルチサイト と言ったものも選択肢にあるんじゃないでしょうか 特に下層ページが同じ商品やサービスの 表示内容のバリエーションに過ぎないとかなら リライトエンドポイントは有力な選択肢です
gorimaz

2019/12/04 09:16

>特に下層ページが同じ商品やサービスの >表示内容のバリエーションに過ぎないとかなら 仰る通りです。リライトエンドポイントですか。いくつか関数もあるようですね。このあたり勉強不足なので調べてみたいと思います。ひとまず今回の質問は「/」は使えないということで解決とさせて頂こうかと思います。有力な選択肢のアドバイスに感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問