サポート » プラグイン » ACFフィールドを別ページに表示する方法

  • お世話になります。
    各固定ページに設置しているACFフィールドの出力をTOPページに表示させたいのですが、記述方法がどうしても分からず質問させて下さい。

    やりたいことは、以前下記よりトピックを立てた内容の反対のことに少し付け加えたようなことです。
    https://ja.wordpress.org/support/topic/acf%e3%81%ae%e5%80%a4%e3%82%92%e5%88%a5%e3%83%9a%e3%83%bc%e3%82%b8%e3%81%ab%e8%a1%a8%e7%a4%ba%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/

    前回のトピックでは、
    TOPに設置したACFフィールドを各固定ページ出力する方法を質問しました。
    TOPと各固定ページを紐づけるために、それぞれACFフィールドで「名前」を設置しました。
    この名前が一致すると、その名前に紐づいたユーザー情報が出力されるというものです。
    複数のユーザーに応じて、連番の定義づけを行い、やりたいことが実装できました。

    この要領で、逆のことをすれば解決できると、簡単に考えていたのですが、解決に至らず、今回の質問をさせて頂きました。

    問題点
    ・TOPにACFフィールドを使用しない
    (前回はACFフィールドの「名前」を設置)

    ・TOPと固定ページの紐づけは、固定ページ(別ページ)から、値を引っ張ってきて表示したい
    (前回はACFフィールドの「名前」に一致で紐づけ)

    ・各固定ページからTOPに、ACFフィールドを出力する場合、そもそものトリガーとなる各固定ページのIDが一定ではないので指定ができない
    (前回は1つのTOPページに対して複数の固定ページに反映させたので、元データが同じでまだ分かりやすかったです)

    ・固定ページで設置するACFの「名前」に番号はつけない(連番処理はしない)

    以上となります。
    お力貸して頂けるととても助かります。
    どうぞよろしくお願いいたします。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • @mikujinさん

    こんにちは。
    詳しい要件は分かりませんが、「TOPページに、任意の固定ページが持つACFの情報を出力したい」という事でしょうか。

    そうすると、「TOPページ側で、どの固定ページの情報を取得するかを指定するためのフィールドを用意する」
    というやり方になるかと思います。

    具体的には以下のようなやり方です。

    • カスタムフィールドグループ作成:「ルール」は、「ページ=トップページ」等
    • 「投稿オブジェクト」フィールドを複数追加:page_1, page_2など。「投稿タイプ」は「固定ページ」、「返り値のフォーマット」は「投稿ID」
    • トップページの記事編集画面で、作成したカスタムフィールドのプルダウンから、情報を表示させたい固定ページを選んでおく
    • トップページに、以下のようなコードを記述(未検証です)
    <?php
    // TOPページで指定出来る固定ページの数を5つとした場合(page_1 ~ page_5)
    for ( $i = 1 ; $i <= 5; $i++ ) {
      // 指定した固定ページのIDを取得
      $page_id = get_field( 'page_' . $i );
    
      // ページを指定していない場合はなにもしない
      if ( ! $page_id ) continue;
    
      // 各固定ページで指定したカスタムフィールドを取得する
      $page_meta = get_field( 'page_info', $page_id );
    
      if ( $page_meta ) {
        // ここで固定ページの情報を使って何かする
        // echoで画面出力、または後で出力する用に配列に格納、等
      }
    }
    スレッド開始 mikujin

    (@mikujin)

    ご返信ありがとうございます。
    動作確認のために、頂いたコードを一旦ペーストしてみたのですが、エラーになってしまい、ご教示頂いた内容を検証することができません。。。
    せっかくご返信を頂いたのに申し訳ありませんが、コードを再度教えて頂けると幸いです。

    スレッド開始 mikujin

    (@mikujin)

    度々すみません。
    最後のコードが抜けていたようでした。
    引き続き宜しくお願いします。

    スレッド開始 mikujin

    (@mikujin)

    Tetsuaki Hamano 様

    ご返信ありがとうございます。
    アドバイス頂いた内容を一つづつ試してみましたが、解決に至っておりません。

    こちらの説明不足で申し訳ないのですが、具体的なやりたいことは、各固定ページ(会員ページ)に設置している特定のACFフィールド(趣味、誕生日など)をTOPページに表示させたいということです。

    固定ページA スラッグ名:page-a
    ∟ ACFフィールド名:lank
    ∟ ACFフィールド名:name
    ∟ ACFフィールド名:hobby
    ∟ ACFフィールド名:birthday

    固定ページB スラッグ名:page-b
    ∟ ACFフィールド名:lank
    ∟ ACFフィールド名:name
    ∟ ACFフィールド名:hobby
    ∟ ACFフィールド名:birthday

    固定ページC スラッグ名:page-c
    ∟ ACFフィールド名:lank
    ∟ ACFフィールド名:name
    ∟ ACFフィールド名:hobby
    ∟ ACFフィールド名:birthday


    ACFフィールド名の「lank」によって、TOPページの中で表示する場所を変えます

    TOPページ

    ★会員ランク・シルバー
    user1:
    name
    hobby
    birthday

    user3:
    name
    hobby
    birthday

    ★会員ランク・ゴールド
    user2:
    name
    hobby
    birthday


    下記のコードで、表面的に実装ができますが、固定ページの数(ユーザーの数)が増加するごとに手動でスラッグを入力してコードを追加していかなければいけないので、現実的ではありません。
    また、ランク別に表示する際の条件分岐のコードも意図した通りに動きません。

    
    <?php if(get_post_meta( $post->ID , 'lank', true ) == '★会員ランク・シルバー'): ?>
    
    <?php
    $page_id = get_page_by_path('page-a');//このスラッグを手動で入力・追記するのが問題です
    $page_id = $page_id->ID;
    ?>
    
    <div class="box-silver">
    <?php the_field('name', $page_id); ?>
    <?php the_field('hobby', $page_id); ?>
    <?php the_field('birthday', $page_id); ?>
    </div>
    
    <?php
    $page_id = get_page_by_path('page-b');//このスラッグを手動で入力・追記するのが問題です
    $page_id = $page_id->ID;
    ?>
    
    <div class="box-silver">
    <?php the_field('name', $page_id); ?>
    <?php the_field('hobby', $page_id); ?>
    <?php the_field('birthday', $page_id); ?>
    </div>
    
    <?php
    $page_id = get_page_by_path('page-c');//このスラッグを手動で入力・追記するのが問題です
    $page_id = $page_id->ID;
    ?>
    
    <div class="box-silver">
    <?php the_field('name', $page_id); ?>
    <?php the_field('hobby', $page_id); ?>
    <?php the_field('birthday', $page_id); ?>
    </div>
    
    <?php endif; ?>
    <?php endif; ?>
    
    

    できるだけ無駄な処理は省きシンプルなコードにしたいのですが、どのように記述すれば良いでしょうか?
    引き続き、ご教示頂けると幸いです。
    宜しくお願いいたします。

    • この返信は1ヶ月、 3週前にmikujinが編集しました。

    仕様の確認ですが、

    • 各会員を固定ページとして管理し、各固定ページにACFを使って会員情報を付与している
    • 会員数は都度増減する
    • TOPページでは、会員ランクでグルーピングした上で全会員を表示したい

    であっていますでしょうか。

    それですと、そもそも会員を固定ページで管理する事自体がスマートではないように思います。

    代わりの一例としては以下です。

    • 会員をカスタム投稿として管理する
    • 会員カスタム投稿に、会員ランク(rank)をタクソノミーとして紐づける
    • その他タクソノミーで管理できない固有の情報(hobby / birthday)については、ACFで情報を付与する
    • TOPページではWP_Queryを使い、tax_queryでrank毎に会員一覧を取得、ループして表示
    • ループの中で、ACFの情報を出力する

    以上のヒントをもとに、一度全体の設計を再考されてみてはいかがでしょうか。

    スレッド開始 mikujin

    (@mikujin)

    Tetsuaki Hamano 様

    ご返信ありがとうございます。
    仕様はおっしゃる通りです。
    会員ページ(固定ページ)を削除することはありませんが、常に増加することになります。

    また、おっしゃる通り、今回のケースではカスタム投稿タイプの方が適当かと思いますが、訳あって、投稿タイプの使用ができません。
    そのため、今回の条件から実装できる方法をご教示頂きたくトピックを立てました。

    他の案も教えて頂いてありがとうございます。
    そのようなケースで困ったときに是非参考にさせて頂きます。

    大変お手数ですが、今回の条件で実装するにはどのようなコードが適当でしょうか??
    ご教示頂けると大変助かります。

    @mikujin さん

    こんにちは。
    カスタム投稿を使えず、動的に増減する固定ページとなると、ちょっと力技が必要です。

    考え方としては、

    • 固定ページのスラッグの命名規則を、「page_{ランク}_{連番}」のように決める
      page_gold_0page_silver_2
    • 連番は、必ず抜けが無いようにする
    • トップページでは、大き目の回数を指定したループ文を使い、グループ別に固定ページ全件を取得する
    • ループ内で固定ページが無ければ、以後の連番の固定ページは無いものとしてそこで処理を終了する

    です。

    コード例は以下です。

    <div class="box-gold">
      <h2>ゴールドランク</h2>
      <?php
      for ( $i = 0; $i < 999; $i++ ) { // 全件取得出来るように大きめの回数を指定
        // ゴールドランクに属する固定ページを取得
        $page = get_page_by_path( 'page_gold_' . $i );
    
        // ページが無ければ、以後の固定ページは無いものとして処理を修了
        if ( ! $page ) break;
    
        $page_id = $page->ID;
    
        the_field( 'name', $page_id );
        the_field( 'hobby', $page_id );
        the_field( 'birthday', $page_id );
      }
      ?>
    </div>
    
    <div class="box-silver">
      <h2>シルバーランク</h2>
      <?php
      for ( $i = 0; $i < 999; $i++ ) { // 全件取得出来るように大きめの回数を指定
        // シルバーランクに属する固定ページを取得
        $page = get_page_by_path( 'page_silver_' . $i );
    
        // ページが無ければ、以後の固定ページは無いものとして処理を修了
        if ( ! $page ) break;
    
        $page_id = $page->ID;
    
        the_field( 'name', $page_id );
        the_field( 'hobby', $page_id );
        the_field( 'birthday', $page_id );
      }
      ?>
    </div>

    別の方法として、固定ページにカテゴリーを設定する事も出来るようです。
    試した事はありませんが、WP_Querytax_query等を使えば、固定ページでもカテゴリー(ランク別)にページを取得出来るかもしれません。

    スレッド開始 mikujin

    (@mikujin)

    ご返信ありがとうございます。

    スラッグ名で会員を分ける方法のアドバイスを頂きましたが、会員レベルは変動するので、スラッグ名には使えそうにありません。
    会員を識別するトリガーは、各会員ページ(固定ページ)のACFで設定しているlankだけという条件下でTOPページに反映できればベストなのですが・・・

    TOPにもACFを設置して、ユーザー名などで紐づけないと実装は難しいでしょうか?
    引き続きご教示頂ければ助かります。
    どうぞ宜しくお願いいたします。

    @mikujin さん

    こんにちは。

    スラッグ名で会員を分ける方法のアドバイスを頂きましたが、会員レベルは変動するので、スラッグ名には使えそうにありません。
    会員を識別するトリガーは、各会員ページ(固定ページ)のACFで設定しているlankだけという条件下でTOPページに反映できればベストなのですが・・・

    そうすると、一度全ての固定ページを取得した上で、人力でフィルタリング・グルーピングする必要があると思います。

    固定ページ一覧を取得するget_pagesという関数があるので、一度リファレンスを参考にしてみて下さい。

    具体的なコードも、まずはご自身で書いてみる事をおすすめします。

9件の返信を表示中 - 1 - 9件目 (全9件中)
  • このトピックに返信するにはログインが必要です。