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

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

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

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

PHP

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

Q&A

解決済

2回答

3788閲覧

foreachのループ内の値を外に出して使用したい

pontas

総合スコア54

WordPress

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

PHP

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

0グッド

0クリップ

投稿2021/04/13 13:18

編集2021/04/13 13:44

前提・実現したいこと

foreachのループ内の値を外に出して使用したいです。

カスタム投稿:case
ファイル名:archive-case.php

調べても上手くいかず、どなたかアドバイスをいただけないでしょうか

発生している問題・エラーメッセージ

ループの外に出すと値がnullになってしまいます

該当のソースコード

下記ですとh3の$titleがnullになってしまいます。

<h3><?php echo $title;?></h3> <?php foreach ( posts as $post ) : setup_postdata( $post ); ?> <?php if ($termObject->term_id == $termID || in_array($termObject->term_id,$cat_id_list)):?> <p>テスト</p> <?php else:?> 記事はありません <?php $title= 'タイトル';?> <?php endif;?> <?php endforeach;?>

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

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

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

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

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

miyabi_takatsuk

2021/04/13 13:40

記事単体(single.php)での構文でしょうか?
pontas

2021/04/13 13:43

ご連絡ありがとうございます。 いえ、カスタム投稿のアーカイブになります。 ファイル名はarchive-xxx.phpのように作っております
miyabi_takatsuk

2021/04/13 13:50

では・・・、 投稿の数だけ、foreachがループがされるということでしょうか? となると、どのような投稿のタイトルを取得したいか、にもよります。
pontas

2021/04/13 13:53

>投稿の数だけ、foreachがループがされるということでしょうか? はい、そうです。 $titleに関しては任意の文字を入れたいだけなので特にワードプレス内の変数を取得したいわけではありませんでした
miyabi_takatsuk

2021/04/13 13:58

archive-xxx.phpだとループになりますね。 カスタム投稿であっても、single-xxx.phpで確か出せたと思いますが、 とかく、single-xxx.phpであれば、投稿単体のみを出すことできるので、(ループさせても単体のもののみが出ます)single-xxx.phpにて、カスタム投稿を出す方法を調査されたほうが早いかと。
pontas

2021/04/13 14:02

ご返答ありがとうございます。 カスタム投稿の出力方法はわかるのですが foreach内で作った値を外に出す方法がわかっていないのでご質問してました。 基本的な所で申し訳ないです。
miyabi_takatsuk

2021/04/13 14:11

ですので、archive-xxx.phpだと、ループはどうしても、投稿の数だけされてしまうので、 single-xxx.phpでやったほうが早いのでは?ってことです。 そうすれば、foreachを実行しても、一つしかでないで済むので。 foreachの外に出すことはできても、 ループがされてしまえば、最後の投稿のタイトルしか外に出すことはできません。 もしくは、特定の投稿の条件があれば、 その投稿のもののみを、外に出す、ということはできるでしょう。
miyabi_takatsuk

2021/04/13 14:16

あぁ、つまり <?php if ($termObject->term_id == $termID || in_array($termObject->term_id,$cat_id_list)):?> の条件に適合しない場合に、$title変数に、任意の文字列を入れて、それを、上行で表示したいってことですか?
pontas

2021/04/13 14:24 編集

><?php if ($termObject->term_id == $termID || in_array($termObject->term_id,$cat_id_list)):?> はい、そうなんです 実は少し特殊な事をしておりまして Yoast SEOプラグインの「プライマリカテゴリ」機能を使用して選択されたメインカテゴリのみ表示したいのですが上手くいかず基本的な所から見直そうと思いご質問しておりました。
miyabi_takatsuk

2021/04/13 14:24

なるほど。 であれば、私の回答をご参考ください。
pontas

2021/04/13 14:25

ありがとうございます。 参考にさせて頂きます。
退会済みユーザー

退会済みユーザー

2021/04/13 19:02

関係ないけど、posts はおかしいので見直してください。(多分 $posts とかでは?)
guest

回答2

0

ベストアンサー

野暮ったいですが、
先にループを実行させて、変数の格納のみをさせるとするのが一番簡単です。

html

1<?php // 先にループのみを実行させて、$titleに文字列を格納する ?> 2<?php foreach ( posts as $post ) { 3 setup_postdata( $post ); ?> 4 <?php if ($termObject->term_id == $termID || in_array($termObject->term_id,$cat_id_list)){ ?> 5 <?php } else { 6 // ここで格納 7 $title= 'タイトル'; 8 ?> 9 <?php } ?> 10<?php } ?> 11 12<h3><?php echo $title;?></h3> 13<?php // ここで、本来の表示をさせる 14foreach ( posts as $post ) : setup_postdata( $post ); ?> 15<?php if ($termObject->term_id == $termID || in_array($termObject->term_id,$cat_id_list)):?> 16<p>テスト</p> 17<?php else: ?> 18記事はありません 19<?php $title= 'タイトル'; ?> 20<?php endif;?> 21<?php endforeach;?>

投稿2021/04/13 14:21

miyabi_takatsuk

総合スコア9555

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

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

pontas

2021/04/13 14:24

ご回答ありがとうございます。 参考にさせて頂きます。
guest

0

1行目のh3要素の$titleがnullだということですが、とても基本的な変数の初期化と処理順の話です。
1行目の時点では$titleに何も値が格納されていないため、PHPの仕様上nullになります。
その後上から順に処理が進み、7行目で値が格納されるまではずっとnullです。

投稿2021/04/13 13:30

編集2021/04/13 13:44
workshajikoma

総合スコア110

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

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

pontas

2021/04/13 13:32

ご連絡ありがとうございます。 はい、そうです。
miyabi_takatsuk

2021/04/13 13:39

回答者さん、質問修正依頼 という機能がありますので、そちらでやりましょう。 本回答は回答に該当しません。
workshajikoma

2021/04/13 13:49

miyabi_takatsuk さんご指摘ありがとうございます、記載方法を間違えました。 回答修正いたしました。
pontas

2021/04/13 13:50

ご連絡ありがとうございます。 >7行目で値が格納されるまではずっとnullです。 何か記述を直す必要がありますか 単純にelseの分岐に来ていないだけでしょうか
workshajikoma

2021/04/14 12:38

miyabi_takatsuk さんの回答が直接的な答えだと思いますので、そちらご参照ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問