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

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

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

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

PHP

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

Q&A

解決済

2回答

1099閲覧

Wordpress上に設置した独自関数を用いたstrstrでのif文で内容によって1つ前に設定した内容で分岐されてしまう。

NNC

総合スコア22

WordPress

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

PHP

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

0グッド

0クリップ

投稿2021/03/09 06:28

現在、Wordpressにて、独自関数を複数設置し、
その内容がURLに含まれるか含まれないかで分岐できるように行っています。

その上で、例えば関数1に「hoge-test」、関数2に「hoge-test1」、関数3に「hoge-test10」と設定し

設定している内容

独自関数を読み込ませる為に

<?php $url = $_SERVER['REQUEST_URI']; $before = $_SERVER['HTTP_REFERER']; $code001 = get_option('code001'); $code002 = get_option('code002'); $code003 = get_option('code003'); $code004 = get_option('code004'); $code005 = get_option('code005'); ?>

このように記述しておき

<?php if(strstr($url,$code001)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code001'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code002)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code002'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code003)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code003'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code004)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code004'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code005)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code005'); ?>">トップにもどる</a> <?php else: ?> <a href="<?php echo home_url(); ?>">トップにもどる</a></a> <?php endif; ?>

このようにして分岐させています。
URLに「hoge-test」が含まれる場合、トップにもどるのリンク先は「example.com?hoge-test」となり
「hoge-test1」が含まれる場合は、「example.com?hoge-test1」となるようにさせたいのですが、
hoge-test1でも、「example.com?hoge-test」が飛び先になってしまいます。

只、関数2と関数3をそれぞれ「hogetest1」「shiken10」のようにすると
「example.com?hogetest1」「example.com?shiken10」のように変わってくれますが、
関数2と関数3をそれぞれ「hogetest1」「hogetest2」にした状態で
3を入れた「example.com?hogetest2」のURLの場合、2に設定した「example.com?hogetest1」が
トップにもどるの飛び先になってしまいます。

部分一致?になってしまっているようなのですが、

<?php if(strstr($url,$code001)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code001'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code002)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code002'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code003)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code003'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code004)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code004'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code005)==true): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code005'); ?>">トップにもどる</a> <?php else: ?> <a href="<?php echo home_url(); ?>">トップにもどる</a></a> <?php endif; ?>

この状態であれば、完全一致になると認識していましたので、
なぜ、この症状が出るのか分からない状態です。

次に試した事

<?php if(strstr($url,$code001)): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code001'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code002)): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code002'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code003)): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code003'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code004)): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code004'); ?>">トップにもどる</a> <?php elseif(strstr($url,$code005)): ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code005'); ?>">トップにもどる</a> <?php else: ?> <a href="<?php echo home_url(); ?>">トップにもどる</a></a> <?php endif; ?>

分岐の処理内容は変わらないであろうと、上記のようにもしてみましたが、
やはり症状は変わりませんでした。

完全一致させる方法を探しましたが、どれも上記と同じような記述ばかりでしたので、
ぜひ、お知恵お借りできれば幸いです。

宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

strstr()は完全一致の検索ではないはず。
マッチした文字列から、それ以降の文字列を返す関数では?
リンク内容

つまり、

「hoge-test」「hoge-test1」「hoge-test2」すべてに「hoge-test」が入っているので、

php

1 if(strstr($url,$code001)==true):

は常に成立する。

ですから、ifの条件式の順番を変えればうまくいくかも。

php

1if(strstr($url,$code002)==true): 2 3elseif(strstr($url,$code003)==true): 4 5elseif(strstr($url,$code001)==true): 6 7else: 8

投稿2021/03/09 14:03

hiok

総合スコア590

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

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

NNC

2021/03/09 16:29

回答ありがとうございます。 確かに『文字列が最初に現れる位置を見つける』と記載されていました・・ 頂いた内容ですと、たしかに上手くいったのですが、 get_option('code001')→hoge-test2 get_option('code002')→hoge-test1 get_option('code003')→hoge-test だった場合、同じ症状になってしまい頭を悩ませています・・。 正規表現として、preg_matchを使った方法でも試してみたのですが ────────────────────── <?php if(preg_match($code001,$url)){ ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code001'); ?>">トップにもどる</a> <?php }elseif(preg_match($code002,$url)){ ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code002'); ?>">トップにもどる</a> <?php }elseif(preg_match($code003,$url)){ ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code003'); ?>">トップにもどる</a> <?php }else{ ?> <a href="<?php echo home_url(); ?>">トップにもどる</a> <?php } ?> ────────────────────── これですと、それ以前になぜか分岐すらしない結果になってしまい、 うまい具合に完全一致などしてくれない状態です;;
hiok

2021/03/10 00:07 編集

やりたいことを実現する方法はいくつもあるような気がしますが、 if(strstr($url,$code002)==true): の条件式を「true」ではなく、 if(strstr($url,$code002)== $code002): としたらいかがですか?
KazuhiroHatano

2021/03/10 01:55

preg_matchの使いどころではないですが一応 まずpreg_matchの第一引数に渡すパターンの文字列は / や | などの正規表現の開始・終了の記号を含めて '/'.$code002.'/' などのようにする必要があります また - は正規表現において意味を持つので \- としてエスケープする必要があります
NNC

2021/03/10 14:29

hiok様 ありがとうございます。 今までtrueかfalseしか使う事がなかったので、 >if(strstr($url,$code002)== $code002): この使い方は盲点でした。 不要かもしれませんが、 逆にするパターンと上記の両方の処理をした所、 きちんと完全一致するようになりました! KazuhiroHatano様 仰る通りで/を入れるのを失念していました。 ご指摘頂いた方法でも、思っていた分岐ができました。 ありがとうございました。
guest

0

var_dumpするなりして確認せんと想像で書いても動かんよ。

$_SERVER['REQUEST_URI']と完全一致ってことだろ?
$_SERVER['REQUEST_URI']にはスラッシュも含まれると思うがget_option()で取得したデータもスラッシュがある文字列なのか?

そういう確認もしながら進めんと動くもんも動かんよ。

とりあえず
strstr()
https://www.php.net/manual/ja/function.strstr.php

注意:

もし特定の haystack に needle があるかどうかを調べるだけの場合、 より高速でメモリ消費も少ない strpos() を代わりに使用してください。

と書いてあるのでstrpos()を使う方が良い。

strpos()
https://www.php.net/manual/ja/function.strpos.php

【PHP】特定の文字列を含むかのチェック
https://qiita.com/kazu56/items/2c72d187438de07c2503

投稿2021/03/09 09:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

NNC

2021/03/09 09:43

回答ありがとうございます。 >$_SERVER['REQUEST_URI']と完全一致ってことだろ? 例えば「example.com?hoge-test」と入力した場合、 example.com?hoge-testの中にcode001で設定したhoge-testが含まれている場合は、 トップにもどるのリンク先は「example.com?hoge-test」となるようにしており、 これは思った通りになっているのですが、 2つめ以降の独自関数にhoge-test1と入れていた場合、 本来であれば「example.com?hoge-test1」となるはずなのですが、example.com?hoge-test1」になってしまっていると言う事です。 ※説明の仕方が下手くそですみません・・。 ただ、2つめ以降の独自関数をhoge-testが含まれていない 「hogetest1」「shiken10」のように「hoge-test」が含まれていないもので設定すると各々のリンク先が 「example.com?hogetest1」「example.com?shiken10」になってくれるので、 なぜ、「hoge-test」「hoge-test1」「hoge-test2」でそれぞれ設定しておくと 「hoge-test」の部分だけで判別されて、引っ張られてしまうのかがわからないと言った内容になります。 >$_SERVER['REQUEST_URI']にはスラッシュも含まれると思うがget_option()で取得したデータもスラッシュがある文字列なのか? 独自関数には「/」は入れる事はないので、そこは加味しておりませんでした。 また、strpos()の件、ありがとうございます。 こちらも試しており ──────────────────────── <?php if(strpos($url,$code001) !== false){ ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code001'); ?>">トップにもどる</a> <?php }elseif(strpos($url,$code002) !== false){ ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code002'); ?>">トップにもどる</a> <?php }elseif(strpos($url,$code003) !== false){ ?> <a href="<?php echo home_url(); ?>?<?php echo get_option('code003'); ?>">トップにもどる</a> <?php }else{ ?> <a href="<?php echo home_url(); ?>">トップにもどる</a> <?php } ?> ──────────────────────── 上記のように行っておりましたが、 記述の仕方が違うだけで判別内容に大きな違いはなく、 strstrのように「hoge-test」「hoge-test1」「hoge-test2」でそれぞれ設定しておくと 「hoge-test」の部分だけで判別されて、引っ張られてしまう状態になっています・・。
退会済みユーザー

退会済みユーザー

2021/03/09 12:00

$_SERVER['REQUEST_URI']とget_option()の出力結果が完全に一致するならば if( $url === $code001 ){ で良いのでは?
NNC

2021/03/09 16:24

お伝えの仕方が悪くてすみません。 $_SERVER['REQUEST_URI']とget_option()の出力結果が完全というよりは $_SERVER['REQUEST_URI']にget_option()の出力結果が含まれる場合です。 ※そのおつもりで仰っていたらすみません。 前提として get_option('code001')→hoge-test get_option('code002')→hoge-test1 get_option('code003')→hoge-test2 と設定しておき、 $_SERVER['REQUEST_URI']がexample.comとします。 URL欄にexample.com?hoge-test と手動で入力した際に トップに戻るといったリンクがexample.com内にあった場合、 example.com?hoge-testでアクセスした場合は <a href="example.com?hoge-test">トップに戻る</a> となり example.com?hoge-test1でアクセスした場合は <a href="example.com?hoge-test1">トップに戻る</a> となるようにとしていましたが、 example.com?hoge-test1でアクセスをしても <a href="example.com?hoge-test">トップに戻る</a> になってしまう症状です。 頂いたif( $url === $code001 ) で試しに検証してみた所、 hoge-testすらも反応しない結果になってしまいました;;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問