PHPでif文をループで記述する方法
解決済
回答 2
投稿
- 評価
- クリップ 1
- VIEW 3,413
WordPressで下記条件文を100個ほど記述しなければならないのですが、ループを使って記述するにはどうしたら良いのでしょうか。
forやwhile文で試行錯誤してみましたが実現する方法がわからず困っています。
if(is_category('1')):
$hoge = '1';
elseif(is_category('2')):
$hoge = '2';
elseif(is_category('3')):
$hoge = '3';
//これが100個ほど続く…
endif;
//このあと変数を使用した処理
やりたいことは、100個ほどカテゴリー用の変数を定義してその後にその変数を使用した処理を行うことです。
今のところ上記の記述で動作はできています。
ただ、今後多くカテゴリー追加が見込まれるため100個ほど記述しておく必要があり、できればループ等で記述できればと思っています。
下記のような感じで試行錯誤していますが文法エラーが出続けます…
if(is_category('1')):
$hoge = '1';
for ($i=2; $i < 100; $i++) {
//この中で「elseif」以降の記述を試行錯誤
}
endif;
初心者ゆえ、何かを根本的に間違えている可能性が大きいのですが
どうぞよろしくお願いいたします。
(例えばループ以外実現できたりするのでしょうか…)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
is_category は引数に配列をとることができます。
if ( is_category( array( 1, 3, 5, 7, 9 ) ) ) {
$tmp = $cat; // category ID
}
【is_category() | Function | WordPress Developer Resources】
https://developer.wordpress.org/reference/functions/is_category/
【現在のカテゴリーIDを取得する8種の方法 ? WordPress Snippet】
http://tenman.info/labo/snip/archives/7741
追記:
色々なものが動かない理由がいまいち掴めませんが、ループでis_categoryするのであれば下記のようにすれば出来ると思います。
foreach ( array( 1, 2, 3, 4, 5,… ) as $tmp_cat_id ) {
if ( !is_category( $tmp_cat_id ) ) { continue; }
$hoge = $tmp_cat_id;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
■ループで取得する方法
$idArray = array(1,3,5,…); //カテゴリIDの配列
foreach ($idArray as $tmp_cat_id) {
if (is_category( $tmp_cat_id)):
$hoge = $tmp_cat_id;
endif;
}
■配列で取得する方法
if ( is_category(array(1,3,5,…))) {
$hoge = $cat;
}
■get_queried_object();でカテゴリー名称/リンク、スラッグを取得する方法
※配列がなぜかget_the_category();と干渉したため
$categories = get_queried_object();
$categories_id = $categories -> cat_ID; // ID取得
$categories_name = $categories -> cat_name; // カテゴリー名
$categories_slug = $categories -> category_nicename; // スラッグ
$categories_link = get_category_link($categories_id); // リンクURL
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/12/25 15:12
配列であれば、100個でも苦痛なく記述できそうです。とても勉強になりました。
ただ、カテゴリー毎の変数を定義する部分の記述をどのようにしたら良いのでしょうか。
if ( is_category( array( 1, 2, 3, 4, 5,… ) ) ) {
$hoge = $cat;
}
上記では動作せず、「$hoge = $cat;」の部分をarrayのIDと対応させて
$hoge ='1'; $hoge ='2'; $hoge ='3' と出力するにはどうしたら良いのでしょうか。
何度も申し訳ございません。
2016/12/25 16:43
2016/12/25 21:27
$categories = get_the_category(); を使用しており、
これが問題を引き起こしていたようです。
教えていただきました参考サイトにカテゴリーページに使用すると
問題が起きる可能性がある旨書かれておりました。
こちらをコメントアウトしたところ、動作するようになりました!とても嬉しいです。
ただ今度は別の問題が…
実は、
・カテゴリーの文字列を操作したい
・カテゴリースラッグを取得したい
という理由から、the_category();を使用せず
下記のようにカテゴリー名称/リンク、スラッグを取得しておりました。
$categories = get_the_category();
$categories_id = $categories[0]->cat_ID;
$categories_name = $categories[0]->name;
$categories_slug = $categories[0]->category_nicename;
$categories_link = get_category_link($categories_id);
$categories = get_the_category(); をコメントアウトすることにより
これらが機能しなくなってしまいました。
カテゴリー名称は、single_cat_title等、別の方法で試しているところですが
なかなかうまくいきません。
マナーとしては恐らく別の質問とするべきなのかもしれませんが、
引き続き苦戦しており、再度お答えをいただければとても助かります。
ランキングがすごい方でいらっしゃるので…
わがままなお願いで本当に申し訳ございません。
もし、別質問にする必要ありましたらその旨遠慮なくおっしゃってください。
2016/12/25 22:04
今回のものとは関係ないと思いますが、$categories など使われそうな変数名を避けたほうがよいと思います。
get_the_category() で事前に取得しているのであれば、そのまま使えば良いと思います。
if ( is_category( array( 1, 2, 3, 4, 5,… ) ) ) {
$hoge = $categories_id;
}
というか事前に取得しているのであれば、is_category にこだわる必要も無いでしょう。
if ( in_array( $categories_id, array( 1, 2, 3, 4, 5,… ), true ) ) {
$hoge = $categories_id;
}
【PHP: in_array - Manual】
http://php.net/manual/ja/function.in-array.php
> ランキング
マメに回答していればいずれ上がるものなので、残念ながらランキングと技術力は相関しませんよー。
2016/12/25 23:56
変数名にも留意するようにいたします。
教えていただいた「in_array」の判定で、ほぼ実現できるようになったのですが、
もう後一息な感じです…
最初の質問のendif;の後の「//このあと変数を使用した処理」の部分が、
投稿数が「0」のカテゴリーの場合実行されない事象が起こってしまいます。
【パターンA】投稿数「0」の場合でも実行される
if ( is_category( array( 1, 2, 3, 4, 5,… ) ) ) {
$hoge = $cat;
}
※しかし「get_the_category();」と干渉
【パターンB】投稿数「0」の場合実行されない
if ( in_array( $categories_id, array( 1, 2, 3, 4, 5,… ), true ) ) {
$hoge = $categories_id;
}
最初の質問の通り「if文をループで記述する」(といいつつ方法がわからない)
くらいしか解決策が思いつかないのですが、何か手立てはありますでしょうか。
カテゴリーは追加したり、消去したり、欠番になったりするので
ご教授いただいた配列の手法が気に入っているのですが…。
実は本日はじめてこちらのサイトを利用を開始したこともあり(最初の質問になります)
勝手もわかっておらずご迷惑をおかけしております…
2016/12/26 00:53
2016/12/26 01:38
単純に「get_queried_object();」に変更するだけでは「Fatal Error: Cannot use object of type WP_Term as array in…on line 16」になってしまいました…
16行目:$categories_id = $cat[0]->cat_ID;
先に教えていただいたサイト等を参考にしつつ「get_the_category();」以外でカテゴリーページでカテゴリー名称、リンク、スラッグを取得する方法をもうちょっと調べてみます。
遅い時間まで本当にすみませんでした。
2016/12/26 05:10
2016/12/26 17:37
($categories_id = $tmp_cat>term_id;でも難しかったので…)
先に必要なID分の配列を作って…は目からウロコでした。
これだと不要になったIDも削除できますし、最初にご提案いただいた
if ( is_category( array( 1, 2, 3, 4, 5,… ) )と同等のメリットがありますね。
ただ、いただいたソースそのままでは動作せず、下記でやっと動くようになりました。
$idArray = array(1, 2, 3, 4, 5,…); //カテゴリーID
foreach ( $idArray as $tmp_cat_id ) {
if ( is_category( $tmp_cat_id )):
$hoge = $tmp_cat_id;
endif;
}
上記の記述、もっとスマートな記述がありますでしょうか。
「continue;」の使い方を調べてみましたがすぐには理解できず…
(最後に「endif;」を加えてみたら動作するかと思ったのですが)
最初の質問から脱線してしまい申し訳ございませんでした。
「もっとスマートな記述…」の部分だけ少しお返事を待って
本日中に質問を締め切るようにいたします。
(お忙しい場合はお返事大丈夫です。)
2016/12/26 18:26
「スマートな」というのであれば get_queried_object を使う方法を動くようにするほうがスマートなので、自分で組むならそうします。また、そこまで変なコードだとは思いません。
2016/12/26 19:07
一旦は動作するようになったという担保ができましたので
引き続き「get_queried_object」等で実現できるか頑張ってみます。
この度はつたない質問に根気よくお付き合いいただき、感謝の気持ちでいっぱいです。
本当にありがとうございました!!
2016/12/27 22:38
自己解決…ではないのですが、自己解決欄に一式まとめました。
今回、色々と勉強になりました。ありがとうございました。