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

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

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

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

PHP

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

Q&A

解決済

2回答

2133閲覧

WordPressでforeachがうまく動かない

shixitake

総合スコア7

WordPress

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

PHP

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

0グッド

0クリップ

投稿2017/03/07 04:13

編集2017/03/09 23:35

###前提・実現したいこと
WordPressの投稿部分に、csvファイルから特定の条件(カテゴリ)を満たした行だけピックアップして、HTMLタグを出力させたい。
カテゴリ別で、同じ投稿画面に複数回同じ仕組みを使用する予定。

イメージ
処理1「CSVファイルの読み込み」
WordPress投稿画面上で入力したHTML
処理2「CSV内から、カテゴリAの情報でHTML出力」
WordPress投稿画面上で入力したHTML
処理3「CSV内から、カテゴリBの情報でHTML出力」
・・・続く

現在選択している方法としては、function.phpにショートコードを追加して、CSVファイルの読み込みと、foreachで処理を検討。

###発生している問題・エラーメッセージ
同じサーバー上で、同じphpを動かす場合は、きちんと動作するのに
Wordpressのfunction.phpに仕込むと、動作しない。
var_dumpを見ると、foreachの時点で1行目しか読み込んでくれていない様子。

foreachにこだわっているわけではなく、プラグイン追加以外で、代替案があればそちらも検討する予定で、最終手段はPC側でバッチ処理してHTMLを投稿画面に貼ります。

###該当のソースコード

<?php function hoge_csvinport() { global $file; $hoge_info = "sampledir"; $hoge_list = "$hoge_info/sample_list.csv"; $file = new SplFileObject($hoge_list); $file->setFlags(SplFileObject::READ_CSV); } add_shortcode('hoge_csv', 'hoge_csvinport'); function hoge_images() {//後々、ここに引数を入れてカテゴリ特定処理をするifで使いたい) global $file, $HOGE1, $HOGE2, $HOGE3, $HOGE4, $PHOGE5, $HOGE6, $HOGE7, $HOGE8; foreach($file as $key=>$line){ var_dump($file); //CSVが読み込まれている(結果を後半に貼ります) var_dump($line); //1行目だけが読み込まれている var_dump($key); // 0だけ入っている $HOGE1 = $line[0]; $HOGE2 = $line[1]; $HOGE3 = $line[2]; $HOGE4 = $line[3]; $HOGE5 = number_format($line[4]); $HOGE6 = $line[5]; $HOGE7 = $line[6]; $HOGE8 = $line[7]; var_dump($HOGE1); //1つしか値が入っていない var_dump($HOGE2); //1つしか値が入っていない return $HOGE1 . $HOGE2 . $HOGE3; //これはWordPress上に表示されます。本来はこの後ifで他の行も表示したいです。 } unset($line); } add_shortcode('hoge_img', 'hoge_images'); ?>

###試したこと
単純にサーバー上に置いた場合とWordPressに仕込んだ場合のvar_dumpの比較。

var_dump($file);の結果
object(SplFileObject)[6366]
private 'pathName' (SplFileInfo) => string 'sampledir/sample_list.csv' (length=23)
private 'fileName' (SplFileInfo) => string 'sample_list.csv' (length=15)
private 'openMode' => string 'r' (length=1)
private 'delimiter' => string ',' (length=1)
private 'enclosure' => string '"' (length=1)

変数の指定方法がまずいのかもしれないと、いろいろ試しましたが
原因が特定できませんでした。

PHPは過去独学で数年ぶりに触っているので、常識/お作法等に不備がありましたらすみません。
お手数ですがご指摘頂けますと幸いです。

###補足情報(言語/FW/ツール等のバージョンなど)

以下、開発環境です。(対象のWordPress環境に近いものを作成)

CentOS 6(2.6.32-642.13.1.el6.x86_64)
WordPress 4.5.6
PHP 5.6.30

rpm -qa |grep php
php-devel-5.6.30-1.el6.remi.x86_64
php-opcache-5.6.30-1.el6.remi.x86_64
php-pecl-zip-1.13.5-1.el6.remi.5.6.x86_64
php-mysqlnd-5.6.30-1.el6.remi.x86_64
php-cli-5.6.30-1.el6.remi.x86_64
php-pdo-5.6.30-1.el6.remi.x86_64
php-5.6.30-1.el6.remi.x86_64
php-fpm-5.6.30-1.el6.remi.x86_64
php-pecl-jsonc-1.3.10-2.el6.remi.5.6.x86_64
php-pecl-jsonc-devel-1.3.10-2.el6.remi.5.6.x86_64
php-xml-5.6.30-1.el6.remi.x86_64
php-gd-5.6.30-1.el6.remi.x86_64
php-mbstring-5.6.30-1.el6.remi.x86_64
php-common-5.6.30-1.el6.remi.x86_64
php-pear-1.10.1-10.el6.remi.noarch
php-process-5.6.30-1.el6.remi.x86_64
php-mcrypt-5.6.30-1.el6.remi.x86_64

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

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

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

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

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

kei344

2017/03/07 05:25

質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
shixitake

2017/03/07 09:10

コードブロックについて、丁寧な内容も添えてご指摘いただきありがとうございました。修正いたしました。
kei344

2017/03/07 09:40

こちらの環境では変更/修正が確認できませんでした。すみませんが、もう一度確認してもらえませんか?最近teratailで修正が保存されない事がたまにあるようなので・・・。
shixitake

2017/03/09 23:37

遅くなってしまって申し訳ありません。確かに最初に修正した時、うまく保存できなかったので2〜3回行って、保存できたと思ったのですが出来ていなかったです。今度は大丈夫だと思います。2度も教えて頂きありがとうございました。
guest

回答2

0

ベストアンサー

PHP

1function hoge_images() {//後々、ここに引数を入れてカテゴリ特定処理をするifで使いたい) 2 global $file, $HOGE1, $HOGE2, $HOGE3, $HOGE4, $PHOGE5, $HOGE6, $HOGE7, $HOGE8; 3 4 foreach($file as $key=>$line){ 5 6 var_dump($file); //CSVが読み込まれている(結果を後半に貼ります) 7 var_dump($line); //1行目だけが読み込まれている 8 var_dump($key); // 0だけ入っている 9 10 $HOGE1 = $line[0]; 11 $HOGE2 = $line[1]; 12 $HOGE3 = $line[2]; 13 $HOGE4 = $line[3]; 14 $HOGE5 = number_format($line[4]); 15 $HOGE6 = $line[5]; 16 $HOGE7 = $line[6]; 17 $HOGE8 = $line[7]; 18 19 var_dump($HOGE1); //1つしか値が入っていない 20 var_dump($HOGE2); //1つしか値が入っていない 21 22 // ここでreturnしているので、当然一行目しか出ません。 23 return $HOGE1 . $HOGE2 . $HOGE3; 24 } 25 unset($line); 26} 27```コード中にも書いてありますが、`foreach`のループ中でreturnしてしまっているので、当然一行目しか出ません。`var_dump`で1つしか入ってないのは当然です。(`$HOGE1`も`$HOGE2`も配列じゃありません) 28 29foreachループの中で文字列を作って、ループを抜けたあとにreturnでそれを返すようにしたらいいですね。 30仕様が分からないので、なんともそれ以上答えようが無いですけど。

投稿2017/03/07 07:57

shi_ue

総合スコア4437

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

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

shixitake

2017/03/07 09:18

ご回答ありがとうございました。恥を忍んでお聞きして良かったです。やっと謎が解けました。 今晩残りの作業ができそうです。心から感謝いたします。ありがとうございました。
guest

0

var_dumpを見ると、foreachの時点で1行目しか読み込んでくれていない様子。

foreachの中でreturnしているため、1行目しか読み込んでいないように見えているだけではないですか?

投稿2017/03/07 07:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shixitake

2017/03/07 09:19

ご回答ありがとうございました。 自分の知識不足による初歩的なミスだとは思っていましたが、お聞きしなければきっともうしばらくはまっていました。 大変助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問