前提・実現したいこと
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
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
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しているので、当然一行目しか出ません。
return $HOGE1 . $HOGE2 . $HOGE3;
}
unset($line);
}
コード中にも書いてありますが、foreach
のループ中でreturnしてしまっているので、当然一行目しか出ません。var_dump
で1つしか入ってないのは当然です。($HOGE1
も$HOGE2
も配列じゃありません)
foreachループの中で文字列を作って、ループを抜けたあとに、returnでそれを返すようにしたらいいですね。
仕様が分からないので、なんともそれ以上答えようが無いですけど。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
var_dumpを見ると、foreachの時点で1行目しか読み込んでくれていない様子。
foreach
の中でreturn
しているため、1行目しか読み込んでいないように見えているだけではないですか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.12%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
kei344
2017/03/07 14:25
質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
shixitake
2017/03/07 18:10
コードブロックについて、丁寧な内容も添えてご指摘いただきありがとうございました。修正いたしました。
kei344
2017/03/07 18:40
こちらの環境では変更/修正が確認できませんでした。すみませんが、もう一度確認してもらえませんか?最近teratailで修正が保存されない事がたまにあるようなので・・・。
shixitake
2017/03/10 08:37
遅くなってしまって申し訳ありません。確かに最初に修正した時、うまく保存できなかったので2〜3回行って、保存できたと思ったのですが出来ていなかったです。今度は大丈夫だと思います。2度も教えて頂きありがとうございました。