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

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

ただいまの
回答率

88.37%

wordpressカスタムフィールドのループ記述について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,158

ssk

score 288

<?php
    for ($i = 1; $i < 10; $i++){
        $attachment_id.$i = get_field('bu_images'.$i.'');
        $size.$i = "full"; // (thumbnail, medium, large, full or custom size)
        $image.$i = wp_get_attachment_image_src( $attachment_id.$i[id], $size.$i );
        $attachment.$i = get_post( get_field('image') );
        $alt.$i = get_post_meta($attachment.$i->ID, '_wp_attachment_image_alt', true);
        $image_title.$i = $attachment.$i->post_title;
    }
    ?>

カスタムフィールドに以下のフィールドがあります(画像)。
bu_images1
bu_images2
bu_images3
bu_images4
bu_images5
bu_images6
bu_images7
bu_images8
bu_images9
bu_images10

これをループで取得して
画像があれば出力するようにしたいのです。

上記の書き方では取れないのですが、どうすれば情報が取れるでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2016/05/05 16:18

    どのように出力したいのか、出力部分のコードも質問に追記していただけませんか?

    キャンセル

回答 2

checkベストアンサー

+2

まず大きく分けて3つ修正すべきところがあります。

  1. ループ文の使い方
  2. カスタムフィールドの取得方法
  3. テンプレートタグの使い方

以下に詳細をまとめます。

1.ループ文の使い方

この記述だと正しくループが回らないのではありませんか?

for ($i = 1; $i < 10; $i++){
  $attachment_id.$i = get_field('bu_images'.$i.''); 
/*この時点で 「変数$i」 に 「get_field()の戻り値が代入」されてしまい変数$iの値が狂います。
  あと、get_field()の引数の末尾にある「.''」は何でしょう?多分不要な記述かと*/


ループ(for)文内部の変数にいちいち連番を振る必要はありません。

$attachment_id.$i は $attachment_id
$size.$i は $size
$image.$i は $image
//以下省略

で問題なく動きます。

2.カスタムフィールドの取得方法

カスタムフィールドはどのようにして作成されていますか?

  • 「Advanced Custom Fields Pluginの取得用関数」
  • 「通常のカスタムフィールドの取得用関数」

が混在していますが、それぞれの取得方法は違っています。どのようにして作成されていますか?
(混在させるのは正しい用法とは言えません)

get_field()…「Advanced Custom Fields Plugin」専用の関数です。
「Advanced Custom Fields」プラグインを使用してカスタムフィールドを作成されていますか?
使用していないなら、無効な関数です。
逆に、使用されているのであれば、こちらを使用するだけですべて事足ります。
※画像フィールドならば、「画像オブジェクト」にしておけば、そこにフィールドの画像に関するデータはすべて入っています。(取得はその一回で済み、以後の回りくどい処理をすべて省いて出力できます)
ACF Imgae
https://www.advancedcustomfields.com/resources/image/

3.テンプレートタグの使い方

使用する前に、ご存知ないテンプレートタグなのであれば、
Codexで「テンプレートタグ」の意味と使い方を調べてから使用することをおすすめします。

例えば、get_post()の引数にget_field('image')を渡していますが、使い方を間違っているかと。
(それともimageという別のフィールドを作成されていて、そこに何らかの別の値を収めている?)

get_post()を使うなら渡すべき引数は「投稿ID」です。画像のIDを渡してしまうと、全然別の記事の情報を取得します。
関数リファレンス/get post
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_post

※Advanced Custom Fieldsを使用しているのであれば
$attachment_id = get_field('bu_images'.$i)で取得した後の処理全部を先述の「ACF Imgae」のリンク先にある書き方へ変更すれば取得〜出力まで行えます。

また、テンプレートタグで取得したデータに何が入っているかを
逐一var_dump()で一回出力してみることもおすすめいたします。
そうすることで、

  • どのデータが取得できていなくてエラーになるのか
    どの段階までデータを取得できているのか?あるいは、それが欲しかったデータなのかが分かる
  • どういった取得の方法を使うべきか
    欲していた結果通りだったか、そうでなければ、どのような方法を使うべきかを考える判断材料になる
  • 取得したデータからどのようにして出力できるか
    返ってきた結果から、どのようなデータ形状になっているか分かるため、出力を適切に選べる

なども分かるようになっていくと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 15:44

    返信が遅くなってしまい、申し訳ございませんでした。
    内容を参考に実装することができました。回答ありがとうござます、助かりました。

    キャンセル

  • 2016/05/20 20:24

    無事実装できたようで何よりです!
    カスタムフィールドをデフォルトかプラグインかどちらで実装しているのか定かではなかったので、ちょっとふわっとした回答になってしまいましたが、お役に立てたのであれば幸いです。

    キャンセル

0

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<?php endwhile;endif; ?>
のループの中で記述をしないと出てこないとかではないでしょうか?
その場合は
for ($i = 1; $i < 10; $i++)
は必要ありません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 15:45

    ご指摘ありがとうございました><

    キャンセル

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

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る