ポ-タルサイトを作ろうとしており、各店舗情報に「投稿」を使ってます。
Smart Custom Fieldsというプラグインを採用しました。
店舗ペ-ジに対し、ユ-ザ-登録した各店舗の店長は、自分のプロフィ-ルから自店舗情報をカスタムフィ-ルド(以下CF)に追加入力し、管理人は店舗ペ-ジ(投稿ペ-ジ)のCFに店長のユ-ザ-IDを入力することで店長と店舗を紐づけし、店舗ペ-ジに、「店長が自分のプロフィ-ルに入力したCFの情報」を出力したいのです。
ただ、それをsingle.phpに出力するためのコ-ドが解りません。
現状のコ-ドではvar_dumpを使っており、これで店舗ペ-ジを表示した時、投稿ペ-ジに入力したユ-ザ-IDに対応した店長のプロフィ-ルにおけるCFの値が全て出力されるのですが、余計な文字が出てきます。
これらを省き、それぞれのCFの値を個別に出力したいのです(テ-ブルの形で出力したいです)。
プラグイン開発者様サイトを参考に
echo SCF::get_user_meta( $user_id, 'カスタムフィールド名' );
としても値は出力されず、唯一、var_dumpでのみ値が出力されるのです。
補足説明と説明画像をご参照ください
この「Smart Custom Fields」というプラグインを採用したのはユ-ザ-のプロフィ-ルにもカスタムフィ-ルドを作る事ができる事と、「繰り返しフィ-ルド」を使う事ができるからです。
プラグイン作者様のサイトは以下となります。
http://2inc.org/blog/2014/10/09/4426/
http://2inc.org/blog/2015/03/24/4682/
また、現状のコ-ドは(仮にですが)、
// 投稿のカスタムフィ-ルドに入力されたユ-ザ-IDを取得
$user_id = post_custom("userid");
// カスタムフィ-ルドのメタデータを全て表示
var_dump( SCF::get_user_meta( $user_id ) );
?>
としております。
説明画像が小さかったので大きなサイズのものをアプロダに貼りつけました。
申し訳ありません。
http://fast-uploader.com/file/7001505157718/
ユ-ザ-プロフィ-ルペ-ジにカスタムフィ-ルドを作って実際に値を入力しているところ
コメント(9件)
「var_dump()」は変数の確認等で使う関数です。(値を表示する為のものではありません。)
・PHP: var_dump - Manual
http://php.net/manual/ja/function.var-dump.php
------------------------------------------------
この関数は、指定した式に関してその型や値を含む構造化された情報を 返します。
------------------------------------------------
> echo SCF::get_user_meta( $user_id, 'カスタムフィールド名' );
> としても値は出力されず、唯一、var_dumpでのみ値が出力されるのです。
「var_dump()」の表示結果はどのようになりますか?
結果が配列で(※「array (size=*) 0 => string 'XXX' (length=*) 1 => string 'ZZZ' (length=*)」のように)表示される場合、「echo」では表示できません。
・PHP: 配列 - Manual
http://php.net/manual/ja/language.types.array.php
以下に、関連する関数をプラグインページから一部抜粋します。
「Smart Custom Fields」
https://ja.wordpress.org/plugins/smart-custom-fields/
------------------------------------------------
How to get meta data ?
SCF::get_user_meta( $user_id, 'field-name' )
This method can get any user meta data.
SCF::get_user_meta( $user_id, 'group-name' )
This method can get user meta data of any group.
SCF::get_user_meta( $user_id )
This method can get all user meta data.
------------------------------------------------
一番上の「SCF::get_user_meta( $user_id, 'field-name' )」ですが、同一名のフィールドが1つだけで他に存在しない場合は「echo」で出力可能ですが、同一名のフィールドが複数ある場合は、配列が返されます。
下の2つは「group-name」は任意のグループの繰り返しフィールド、「field-name」も「group-name」も指定しなかった場合は指定したユーザーのすべてのフィールドなので、それぞれ配列が返されます。
配列は「foreach()」等を使ってループ処理する必要があります。
※上に記載した「配列」のマニュアルページにも処理方法の例が載っています。
・PHP: foreach - Manual
http://php.net/manual/ja/control-structures.foreach.php
※一応、表示前に無害化するためにWordPressの関数「esc_html()」を適用するようにしてみてください。
・WordPress を扱う上で憶えておいて欲しい3つのesc #wacja2012
http://www.warna.info/archives/2476/
コメントをいただきましてありがとうございます。
おっしゃるとおり、foreachを使いル-プ処理をさせるのが正解でした。
ヒントをいただきながら、single.phpに以下としてみました。
<?php $user_id = post_custom("userid"); ?>
<?php $groups = SCF::get_user_meta( $user_id, 'tsuikamenu' ); ?>
<table>
<?php foreach ( $groups as $group ) : ?>
<?php foreach ( $group as $field_name => $field_value ) : ?>
<tr>
<th><?php echo esc_html( $field_name ); ?></th>
<td><?php echo esc_html( $field_value ); ?></td>
</tr>
<?php endforeah; ?>
<?php endforeah; ?>
</table>
ただこの場合、4行目、5行目にコロンがあるとエラ-が出てペ-ジ自体が非表示になってしまうのです。
仮にこの2つのコロンをセミコロンにするとペ-ジは表示されますがル-プせず、以下のようにだけ表示されます。
waribiki 550円
コロンのまま(つまりル-プする状態)で、エラ-にならないようにするにはどこを改善すべきでしょうか。
ちなみに今でているのエラ-は、
Parse error: syntax error, unexpected end of file in ~~~ /single.php/on line~~
というものです。
また、ポイントを差し上げたく、回答の方へ書き込んでいただければ、と思います。
よろしくお願いいたします。
※質問は締め切り状態に変更して、自動終了を待っていただけたらと思います。(キャンセルでは質問ごと消えてしまいますので・・・)
確認不足のままのコメント、たいへん失礼しました。
スペルミスは疑ってなかっただけに、調べれば調べるほどわからず助かりました。
ありがとうございます。
自動終了になれば、rouge_2008さんにポイント付与させていただけるのでしたっけ?
自動終了したことがなくてよくわからないのですが・・。
本当にありがとうございました。
Warning: Invalid argument supplied for foreach() in / ~~~~~single.php on line ~
カスタムフィ-ルドに値を入れていないときには非表示にしたいのですが、どうすれば良いか教えていただけませんでしょうか。
よろしくお願いいたします。
http://2inc.org/blog/2014/10/09/4426/
のコメント欄、上から11番目(ペ-ジ真ん中より少し上あたり)に同様の質問に対する作者様のサンプルコ-ドがありまして、
$loop = SCF::get( 'loop' );
if ( $loop ) {
// あるときのみ
foreach ( $loop as $field_name => $field_value ) {
// 適当な処理
}
}
とすればいけるらしいのです。
しかし、私の組み込み方が悪いと思うのですがうまくいきません。
どこに問題があるのか指摘していただけませんでしょうか。
現状のコ-ドは上記を組み込み、
<?php $tsuikamenu = SCF::get( 'tsuikamenu' ); ?>
<?php if ( $tsuikamenu ) {
// あるときのみ
foreach ( $tsuikamenu as $field_name => $field_value ) {
?>
<?php $user_id = post_custom("userid"); ?>
<?php $groups = SCF::get_user_meta( $user_id, 'tsuikamenu' ); ?>
<table>
<?php foreach ( $groups as $group ) : ?>
<?php foreach ( $group as $field_name => $field_value ) : ?>
<tr>
<th><?php echo esc_html( $field_name ); ?></th>
<td><?php echo esc_html( $field_value ); ?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
</table>
<?php
}
}
?>
としております。
(値があってもなくても非表示になります)
一番外側のループ処理と内側のループ処理でまったく違う配列を使っていますが、「$tsuikamenu」に関する処理(※条件分岐とループ処理)は不要ではないかと思います。
使う必要があるように見えませんので、元の記述に戻してみてください。
※現状では「$tsuikamenu」の値の分、何回も余分に処理が行われていると思います。
ユーザーごとの「tsuikamenu」(グループ?)フィールドデータの配列「$groups」の有無による条件分岐を追加してみてください。
/* ここから */
<?php $tsuikamenu = SCF::get( 'tsuikamenu' ); ?>
<?php if ( $tsuikamenu ) {
// あるときのみ
foreach ( $tsuikamenu as $field_name => $field_value ) { ?>
/* ここまで削除 */
<?php $user_id = post_custom("userid"); ?>
<?php $groups = SCF::get_user_meta( $user_id, 'tsuikamenu' ); ?>
/* 次の条件分岐を追加「$groups」の有無でループ処理 */
<?php if( $groups ) { ?>
<table>
<?php foreach ( $groups as $group ) : ?>
<?php foreach ( $group as $field_name => $field_value ) : ?>
<tr>
<th><?php echo esc_html( $field_name ); ?></th>
<td><?php echo esc_html( $field_value ); ?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
</table>
<?php
} //条件分岐とループを一つずつ削除したが、条件分岐を一つ追加しているのでこの行は削除しない
/* 次の行は(※「}」が一つ余分になるので)削除 */
}
?>
本当にありがとうございます。
ご指摘いただいた通り整理し、思惑通りの挙動になりました。
rouge_2008さんには是非ともポイントを差し上げたく、今までのコメントをコピ-してまとめたものを「回答」に張り付けていただけませんでしょうか。
文句なしのベストアンサ-でして、このまま終了になるのはしのびないのです。
なにとぞよろしくお願いします。
また、もしついでがありましたらもうひとつ教えていただけませんでしょうか。
(これは質問外のことなのでお答えいただけた場合、当然ながら増しポイントさせていただきます)
現状のコ-ドにcssを効かそうと、テ-ブルにclassをつけたのですが、反映されずにいます。
foreachを使った場合は違う記述になるのでしょうか。
現状のコ-ドは以下としております。
<?php $user_id = post_custom("userid"); ?>
<?php $groups = SCF::get_user_meta( $user_id, 'tsuikamenu' ); ?>
<?php if( $groups ) { ?>
<?php foreach ( $groups as $group ) : ?>
<?php foreach ( $group as $field_name => $field_value ) : ?>
<table class="test_01">
<tbody>
<tr>
<th><?php echo esc_html( $field_name ); ?></th>
<td><?php echo esc_html( $field_value ); ?></td>
</tr>
</tbody>
</table>
<?php endforeach; ?>
<?php endforeach; ?>
<?php
}
?>
それに対し、CSSは以下としております。
/* 追加メニュ-の装飾 */
.test_01{
width: 100%;
border-collapse: collapse;
}
.test_01 th{
width: 25%;
padding: 6px;
text-align: left;
vertical-align: top;
color: #333;
background-color: #eee;
border: 1px solid #b9b9b9;
}
.test_01 td{
padding: 6px;
background-color: #fff;
border: 1px solid #b9b9b9;
}
これらの記述ではCSSが効かないのです。
どうすれば良いでしょうか。
PHPを使っている場合でもHTMLやCSSの記述は変わりませんし、上記の記述で正常に反映するようです。
誤字・脱字の問題がない場合は、以下の点について確認してみてください。
1.ブラウザで表示時、HTMLのソースでコード変更が反映されているか確認。(※「table」タグに「class="test_01"」があるかどうか)
※「class="test_01"」がなかった場合は、ページを更新してみてください。
それでも反映されない場合は、ブラウザのキャッシュをクリアしてから再度表示。
2.ブラウザの開発者ツールを使って、該当の箇所に反映されているスタイルを確認。(※「<table class="test_01">」内の「th」および「td」に適用されたスタイル)
別のスタイルが適用されている場合は、そのセレクタや値の記述方法を確認。(優先度の高いCSS指定がある可能性があります。)
※この質問に設定されたポイントで十分高いと思っています。(むしろ減らして欲しいのですが、現在の仕様では無理ですし・・・)