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

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

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

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

352閲覧

URLに応じてチェックを入れつつ、そのページは作りたくないです

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

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

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/06/11 10:04

編集2018/06/11 17:29

実現したいこと

入力されるURLに応じてチェックを入れたいです。

(例1)
http://example.com/a にアクセス
→aにチェックが入った状態で表示。

(例2)
http://example.com/a/c/j にアクセス
http://example.com/a/j/c にアクセス
→aとcとjにチェックが入った状態で表示。

このようなイメージです。

ただし例2にあるように、入力されるURLは a/c/j か a/j/c か順不同です。その上チェックボックスの数も多いので、URLの組み合わせの数のページを管理画面から1つずつ作らずに、でもURLにアクセスしたらページが表示される。という方法がもしございましたら教えて頂ければ幸いです。

前提

・WordPeessを使用しています。
http://example.comという固定ページに abcdefghij という10個のチェックボックスがあります。
(実際には abcdefghij でなく smith jon ethan logan jackson henry…という名前のチェックボックスです。)

該当のソースコード

たとえば$url = $_SERVER["REQUEST_URI"];でURLの a/j/c 部分を取得し、次のHTMLのaとcとjにチェックを入れて表示するという方法になるかと思うのですが、その場合ですとPHPでどのように書けばよろしいでしょうか?

下記コードはhttp://example.com/のトップページのテンプレート「front.php」のチェックボックスの部分です。

html

1<div class="checkbox"> 2 <ul id="alphabet_list"> 3 <!--チェックボックスa--> 4 <li><input id="alphabet_a" class="check_alphabet" type="checkbox" name="check_alphabet" value="a" autocomplete="off"> 5 <label for="alphabet_a" class="check_label"> 6 <span class="test a alphabet"></span><span class="name">a</span> 7 </label> 8 </li> 9 <!--チェックボックスb--> 10 <li><input id="alphabet_b" class="check_alphabet" type="checkbox" name="check_alphabet" value="b" autocomplete="off"> 11 <label for="alphabet_b" class="check_label"> 12 <span class="test b alphabet"></span><span class="name">b</span> 13 </label> 14 </li> 15 <!--チェックボックスc--> 16 <li><input id="alphabet_c" class="check_alphabet" type="checkbox" name="check_alphabet" value="c" autocomplete="off"> 17 <label for="alphabet_c" class="check_label"> 18 <span class="test c alphabet"></span><span class="name">c</span> 19 </label> 20 </li> 21 <!--チェックボックスdefghijは省略--> 22 </ul> 23</div>

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

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

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

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

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

guest

回答3

0

たとえばこう

PHP

1<?PHP 2$url="/a/j/c/"; 3$checked=[]; 4foreach(range("a","z") as $val){ 5 $checked[$val]=""; 6} 7foreach(explode("/",$url) as $val){ 8 if(isset($checked[$val]))$checked[$val]=" checked"; 9}; 10print_r($checked); 11?> 12<div class="checkbox"> 13 <ul id="alphabet_list"> 14 <!--チェックボックスa--> 15<li><input id="alphabet_a" class="check_alphabet" type="checkbox" name="check_alphabet" value="a" autocomplete="off"<?PHP print $checked["a"];?>> 16 <label for="alphabet_a" class="check_label"> 17 <span class="test a alphabet"></span><span class="name">a</span> 18 </label> 19 </li> 20 <!--チェックボックスb--> 21 <li><input id="alphabet_b" class="check_alphabet" type="checkbox" name="check_alphabet" value="b" autocomplete="off"<?PHP print $checked["b"];?>> 22 <label for="alphabet_b" class="check_label"> 23 <span class="test b alphabet"></span><span class="name">b</span> 24 </label> 25 </li> 26 <!--チェックボックスc--> 27 <li><input id="alphabet_c" class="check_alphabet" type="checkbox" name="check_alphabet" value="c" autocomplete="off"<?PHP print $checked["c"];?>> 28 <label for="alphabet_c" class="check_label"> 29 <span class="test c alphabet"></span><span class="name">c</span> 30 </label> 31 </li> 32 <!--チェックボックスdefghijは省略--> 33 </ul> 34</div> 35

a,b,cではない場合

a,b,cの場合は単純にrangeで処理できましたが、任意の文字で処理したいのでしたら
予めホワイトリストをつくっておく必要があります。

php

1<?PHP 2$checked=[]; 3foreach(explode(",","smith,jon,ethan,logan,jackson,henry") as $val){ 4 $checked[$val]=""; 5} 6$url="/smith/hoge/ethan/"; 7foreach(explode("/",$url) as $val){ 8 if(isset($checked[$val]))$checked[$val]=" checked"; 9}; 10print_r($checked); 11?> 12<div class="checkbox"> 13 <ul id="alphabet_list"> 14 <!--チェックボックスa--> 15<li><input id="alphabet_a" class="check_alphabet" type="checkbox" name="check_alphabet" value="smith" autocomplete="off"<?PHP print $checked["smith"];?>> 16 <label for="alphabet_a" class="check_label"> 17 <span class="test a alphabet"></span><span class="name">smith</span> 18 </label> 19 </li> 20 <!--チェックボックスb--> 21 <li><input id="alphabet_b" class="check_alphabet" type="checkbox" name="check_alphabet" value="jon" autocomplete="off"<?PHP print $checked["jon"];?>> 22 <label for="alphabet_b" class="check_label"> 23 <span class="test b alphabet"></span><span class="name">jon</span> 24 </label> 25 </li> 26 <!--チェックボックスc--> 27 <li><input id="alphabet_c" class="check_alphabet" type="checkbox" name="check_alphabet" value="ethan" autocomplete="off"<?PHP print $checked["ethan"];?>> 28 <label for="alphabet_c" class="check_label"> 29 <span class="test c alphabet"></span><span class="name">ethan</span> 30 </label> 31 </li> 32 <!--チェックボックスdefghijは省略--> 33 </ul> 34</div> 35

投稿2018/06/11 11:10

編集2018/06/11 11:44
yambejp

総合スコア114814

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

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

退会済みユーザー

退会済みユーザー

2018/06/11 11:34

ありがとうございます。 それですと普通に「http://example.com」にアクセスしたときにaとjとcにチェックが入るのではないでしょうか。 aとjとcにチェックを入れたいのは、 「http://example.com/a/c/j」かhttp://example.com/a/j/c」かhttp://example.com/c/a/j」かhttp://example.com/c/j/a」かhttp://example.com/j/c/a」かhttp://example.com/j/a/c」のいずれか にアクセスしたときにしたいと考えております。 また、上のURLのページを管理画面で作るのは大変(acjの3つだけでも上のように6通りあり、abcdefjの10個だともっと増えてしまう)ので、管理画面からはページを作らずにできるような方法を模索しております。
退会済みユーザー

退会済みユーザー

2018/06/11 11:38

あと a b c d e f g h i j というのも質問の便宜上のものでして(申し訳ございません)、実際には smith jon ethan logan jackson henry…という名前のチェックボックスです。
yambejp

2018/06/11 11:38

うまく伝わってないようですが $url="/a/j/c/"のところが$url = $_SERVER["REQUEST_URI"]になるという 趣旨なんですけど、そのあたり大丈夫ですか? > 「http://example.com」にアクセスしたときにaとjとcにチェックが入る いえ、まったくなりません 最初のforeachは$checked配列の初期化をしているだけなので。 2個めのforeachでディレクトリでわたしたパラメータをベースに チェックを付けていっています
yambejp

2018/06/11 11:44

smith jon ethan ...のパターンも追記しておきました
退会済みユーザー

退会済みユーザー

2018/06/11 17:04

>うまく伝わってないようですが >いえ、まったくなりません 失礼いたしました。 >smith jon ethan ...のパターンも追記しておきました どうもありがとうございます。お手数おかけしました。 お蔭さまで問題点が「管理画面で作ってもいないURLにアクセスしてもページを表示させる」という点だけになりました。
yambejp

2018/06/12 00:35

> 管理画面で作ってもいないURLにアクセスしてもページを表示させる については、別の方の解にもあるとおりapache自体の機能rewriteruleを利用するのが妥当 wpの場合rewrite系のAPIが用意されているようなので検証されるとよいでしょう
退会済みユーザー

退会済みユーザー

2018/06/12 13:49

ありがとうございます。引き続き調べてみます。
退会済みユーザー

退会済みユーザー

2018/06/13 21:47

おはようございます。 大変恐れ入りますが、こちらを「大文字でも小文字でも大丈夫」という機能にするためにはどのようにしたらよろしいでしょうか…? 次のようなイメージかと思ったのですが、違ったようでして…。 $checked=[]; foreach(explode(stristr(",","smith,jon,ethan,logan,jackson,henry")) as $val){ $checked[$val]=""; }
yambejp

2018/06/14 00:20

「大文字でも小文字でも」というのはすべてを小文字(もしくは大文字)で チェックすればいいのと同意です $checked=[]; foreach(explode(",","smith,jon,ethan,logan,jackson,henry") as $val){ $checked[$val]=""; } $url="/smith/hoge/Ethan/"; foreach(explode("/",$url) as $val){ $val=strtolower($val); if(isset($checked[$val]))$checked[$val]=" checked"; }; print_r($checked);
退会済みユーザー

退会済みユーザー

2018/06/14 01:09

そのように書くのですね。大文字にしたかったので「mb_strtolower」を使ってみようかと思います。たびたびのご返信、誠にありがとうございます。
yambejp

2018/06/14 01:13

すべて大文字でチェックするならもとの文字列も最初から大文字化しておいてくださいね
退会済みユーザー

退会済みユーザー

2018/06/14 01:17

はい!ありがとうございます!
guest

0

add_rewrite_endpoint とかかなぁ。エンドポインと以下は まとめて受け取れるはずなので。

【Rewrite API/add rewrite endpoint « WordPress Codex】
https://codex.wordpress.org/Rewrite_API/add_rewrite_endpoint

【WordPressの投稿や固定ページなどのURLの後ろに「/json」「/amp」などでアクセスできるようにエンドポイントを追加する方法 | 今村だけがよくわかるブログ】
https://www.imamura.biz/blog/24846

【Rewrite APIその2 WordPressでアプリを作る基本(WordPressプラグイン開発のバイブルのボツ原稿から) - Shinichi Nishikawa's】
https://nskw-style.com/2014/wordpress/wordpress-app-with-rewrite-api.html

投稿2018/06/11 11:40

kei344

総合スコア69407

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

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

退会済みユーザー

退会済みユーザー

2018/06/11 17:17

add_rewrite_endpointとは便利そうですね。ありがとうございます。 試したのですが、こちらは複数ある場合にはどのように使うのでしょうか? たとえば、下記のような使い方ではありませんよね? $checked=[]; foreach(explode(",","smith,jon,logan,jackson,henry") as $val){ $checked[$val]=""; } add_rewrite_endpoint( $checked, EP_PERMALINK | EP_ROOT );
KazuhiroHatano

2018/06/12 02:00

add_rewirte_endpointで追加されるURLは example.com/{$key}/{$val}/ みたいな構成で example.com/{$key}/{$val}/{$val}/{$val}/ みたいにすれば複数の値を受け取ることも可能
退会済みユーザー

退会済みユーザー

2018/06/12 13:48

たとえばそのkeyとvalはどのように登録すればよろしいでしょうか? あとvalは順番が変わっても平気ですか?
退会済みユーザー

退会済みユーザー

2018/06/13 12:21

拝見いたしました。ありがとうございます。 add_rewrite_endpoint( $name, $places, $query_var = null ); のうち、smith や jon にあたるのは $name ですよね? すると複数あるので $name を事前に配列として登録しておくようになると思うのですが、 でしたらこちら↓でいいのではと思ってしまうのですが、何がいけないのでしょうか? $name=[]; foreach("smith,jon,logan,jackson,henry") as $val){ $name[$val]=""; } add_rewrite_endpoint( $name, EP_ROOT );
退会済みユーザー

退会済みユーザー

2018/06/13 12:39 編集

ありがとうございます。 英語が読めずにすみません。 >元々配列を受け取る仕様になっていないからです。 ということは、どうしたらいいのでしょうか?
KazuhiroHatano

2018/06/13 12:44

add_rewirte_endpointで実現されるURLは 例えばadd_rewrite_endpoint( 'checked', EP_ROOT );とすれば example.com/checked/smith/jon/logan/ と言った感じのものになります add_rewirte_ruleならば example.com/smith/jon/logan/ という感じのURLを実現できますが ちゃんと書けば長すぎてスマートじゃないし チェック項目が増える度にパーマリンクの更新が必要 かと言ってパターンを曖昧にすれば 他のルールとコンフリクトするものになってしまいます なので、URLに一つ余計なものを挟むことになっても add_rewrite_endpointの方がスマートです
kei344

2018/06/13 12:47

example.com/root/ とかしてルートを決めるか、個別に add_rewrite_endpoint して処理をするか、add_rewrite_ruleで正規表現で受けとる(KazuhiroHatanoさんのコメントにあるようにいくつか注意点はありますが)かですね。 どちらにせよ関連する機能周りの情報を英語も含めて集めてみてください。
退会済みユーザー

退会済みユーザー

2018/06/13 12:48

To: KazuhiroHatanoさん なるほど。そのような理由でしたか。endpointに致します。 ところで、 >例えばadd_rewrite_endpoint( 'checked', EP_ROOT );とすれば example.com/checked/smith/jon/logan/ と言った感じのものになります とのことですけれど、「smith/jon/logan/」というのはどこにどう書くことでリンクとして登録(?)されるようになるのでしょうか? 私が上に書いているようなものではできませんよね?
KazuhiroHatano

2018/06/13 12:56

add_rewrite_ruleにせよadd_rewrite_endpointにせよ、書いたURLのルールは flush_rewrite_rules()を実行するか 管理画面のパーマリンク設定から更新ボタンを押すことで初めて有効になります
退会済みユーザー

退会済みユーザー

2018/06/14 01:38

はい。「add_rewrite_rule」の方で無事できました。どうもありがとうございます。
guest

0

ベストアンサー

WPならadd_rewrite_ruleでやらないと404になっちゃう

php

1add_filter('query_vars', function($vars){ 2 $vars[]='form_values'; 3 return $vars; 4}); 5add_rewrite_rule('([abcdefghij](/[abcdefghij])+)/?$','index.php?form_values=$matches[1]','top');

でパーマリンク設定更新

php

1global $wp_query; 2$form_values =explode('/',$wp_query->query_vars['form_values']);

みたいな感じに値を受け取り


ちょっとローカルでテストしてみたら
canonicalが結構邪魔してきたのでお気をつけ
当該のURLでのリクエストの場合は
リクエストされたURLをまんま返すようにしないと動作不良


一応実現したいURLを実現するパターンを書くけど
add_rewrite_endpointの方がいいよ

選択肢が増えたりする都度対応が必要になる

php

1add_filter('query_vars', function($vars){ 2 $vars[]='form_values'; 3 return $vars; 4}); 5$names='(smith|jon|ethan|logan|jackson|henry)'; 6add_rewrite_rule('('.$names.'(/'.$names.')*)/?$','index.php?form_values=$matches[1]','top');

投稿2018/06/11 11:23

編集2018/06/13 16:46
KazuhiroHatano

総合スコア7804

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

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

退会済みユーザー

退会済みユーザー

2018/06/11 17:20

ありがとうございます。残念ながらよくわかりませんでした。add_rewrite_ruleというのはfunctions.phpに書くものだと思いますが、そちらのコードを書くと画面が真っ白でした。
KazuhiroHatano

2018/06/12 01:55

アルファベット1文字ということならadd_rewrite_ruleでも まあいいかとも思ってましたが これは多分add_rewrite_endpointがBAですね WPのパーマリンクの設定のいじり方はまず自分で調べてみてください このスレで手取り足取りやるのはかなり面倒です 別にadd_rewrite_ruleでadd_rewrite_endpointと 同様にすることもできるんですけどね add_rewrite_endpointの方が多分スマートです そっち方面で調べてみてください
退会済みユーザー

退会済みユーザー

2018/06/12 13:49

ありがとうございます。そのように致します。
退会済みユーザー

退会済みユーザー

2018/06/13 13:02 編集

>一応実現したいURLを実現するパターンを書くけど ありがとうございます! そちらはfunctions.phpに書くもの、ですよね?真っ白になってしまいました… 「}」をどこかに書くべきでしょうか? ちなみに選択肢が増えることはなさそうなので大丈夫です。お気遣いありがとうございます。
退会済みユーザー

退会済みユーザー

2018/06/14 01:16

それとも大文字と小文字に対応したいならば、「mb_strtolower」ではなく $names1='(smith|jon|ethan|logan|jackson|henry)'; $names2='(SMTITH|JON|ETHAN|LOGAN|JACKSON|HENRY)'; というような書き方が良いでしょうか?
KazuhiroHatano

2018/06/14 01:37

mb_strtolowerでできると思いますよ 正規表現パターンにiフラグ立てれたら一番早いんですけどね
退会済みユーザー

退会済みユーザー

2018/06/14 01:55 編集

あ、すみません。「アルファベットだけで、チェックボックスのvalueは大文字」なので「mb_strtolower」でなく「strtoupper」でしょうか。 しかし、 $names='(SMTITH|JON|ETHAN|LOGAN|JACKSON|HENRY)'; $names=strtoupper($names); ですと、 【O K】http://example.com/SMITH 【404】http://example.com/smith でした。(パーマリンク設定から更新ボタンは押しました。) ちなみに、 $names='(SMTITH|JON|ETHAN|LOGAN|JACKSON|HENRY)'; $names=mb_strtolower($names); ですと、上と逆で 【O K】http://example.com/smith 【404】http://example.com/SMITH でした。??? なかなか厄介ですね・・すみません。。何かヒントなど思い当たることございませんでしょうか?
KazuhiroHatano

2018/06/14 02:14

大文字版と小文字版の両方でadd_rewrite_ruleしないとね
退会済みユーザー

退会済みユーザー

2018/06/14 02:46 編集

なるほど。「mb_strtolower」を書けば勝手に大文字と小文字になるのかと思っておりました。 下記のようにするわけですね。 1と2を書いてみのたところ、なんとかできたようです。ありがとうございます。 add_filter('query_vars', function($vars){ $vars[]='form_values'; return $vars; }); $names1='(smith|jon|ethan|logan|jackson|henry)'; add_rewrite_rule('('.$names1.'(/'.$names1.')*)/?$','index.php?form_values1=$matches[1]','top'); $names2='(SMTITH|JON|ETHAN|LOGAN|JACKSON|HENRY)'; add_rewrite_rule('('.$names2.'(/'.$names2.')*)/?$','index.php?form_values2=$matches[1]','top'); しかし、 大文字と小文字をミックスしても大丈夫なようにはできませんでしょうか????????? http://example.com/SMITH/jon/Logan のようなイメージです。
KazuhiroHatano

2018/06/14 03:22

改めて調べてみたけどやっぱりwpのrewrite_ruleにiフラグを立てる術はなし 大文字小文字ミックスまで許容するパターンはできないことはないけど、 もうパターン長すぎてやばい… 大文字小文字がランダムに混合を許容するなら ([sS][mM][iI][tT][hH])みたいなパターン せめて1文字目だけ大文字許容 (SMITH|[sS]mith)ぐらいならそこまで長くならないかなぁ
退会済みユーザー

退会済みユーザー

2018/06/14 03:38

大変お手数おかけしました。誠に!ありがとうございます! >大文字小文字がランダムに混合を許容するなら こちらで対応できそうです。 何度も親身にご返信いただき心から感謝いたします。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問