@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で画面出力、または後で出力する用に配列に格納、等
}
}
ご返信ありがとうございます。
動作確認のために、頂いたコードを一旦ペーストしてみたのですが、エラーになってしまい、ご教示頂いた内容を検証することができません。。。
せっかくご返信を頂いたのに申し訳ありませんが、コードを再度教えて頂けると幸いです。
度々すみません。
最後のコードが抜けていたようでした。
引き続き宜しくお願いします。
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; ?>
できるだけ無駄な処理は省きシンプルなコードにしたいのですが、どのように記述すれば良いでしょうか?
引き続き、ご教示頂けると幸いです。
宜しくお願いいたします。
仕様の確認ですが、
- 各会員を固定ページとして管理し、各固定ページにACFを使って会員情報を付与している
- 会員数は都度増減する
- TOPページでは、会員ランクでグルーピングした上で全会員を表示したい
であっていますでしょうか。
それですと、そもそも会員を固定ページで管理する事自体がスマートではないように思います。
代わりの一例としては以下です。
- 会員をカスタム投稿として管理する
- 会員カスタム投稿に、会員ランク(rank)をタクソノミーとして紐づける
- その他タクソノミーで管理できない固有の情報(hobby / birthday)については、ACFで情報を付与する
- TOPページではWP_Queryを使い、
tax_query
でrank毎に会員一覧を取得、ループして表示
- ループの中で、ACFの情報を出力する
以上のヒントをもとに、一度全体の設計を再考されてみてはいかがでしょうか。
Tetsuaki Hamano 様
ご返信ありがとうございます。
仕様はおっしゃる通りです。
会員ページ(固定ページ)を削除することはありませんが、常に増加することになります。
また、おっしゃる通り、今回のケースではカスタム投稿タイプの方が適当かと思いますが、訳あって、投稿タイプの使用ができません。
そのため、今回の条件から実装できる方法をご教示頂きたくトピックを立てました。
他の案も教えて頂いてありがとうございます。
そのようなケースで困ったときに是非参考にさせて頂きます。
大変お手数ですが、今回の条件で実装するにはどのようなコードが適当でしょうか??
ご教示頂けると大変助かります。
@mikujin さん
こんにちは。
カスタム投稿を使えず、動的に増減する固定ページとなると、ちょっと力技が必要です。
考え方としては、
- 固定ページのスラッグの命名規則を、「page_{ランク}_{連番}」のように決める
page_gold_0
、page_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_Query
のtax_query
等を使えば、固定ページでもカテゴリー(ランク別)にページを取得出来るかもしれません。
ご返信ありがとうございます。
スラッグ名で会員を分ける方法のアドバイスを頂きましたが、会員レベルは変動するので、スラッグ名には使えそうにありません。
会員を識別するトリガーは、各会員ページ(固定ページ)のACFで設定しているlank
だけという条件下でTOPページに反映できればベストなのですが・・・
TOPにもACFを設置して、ユーザー名などで紐づけないと実装は難しいでしょうか?
引き続きご教示頂ければ助かります。
どうぞ宜しくお願いいたします。
@mikujin さん
こんにちは。
スラッグ名で会員を分ける方法のアドバイスを頂きましたが、会員レベルは変動するので、スラッグ名には使えそうにありません。
会員を識別するトリガーは、各会員ページ(固定ページ)のACFで設定しているlankだけという条件下でTOPページに反映できればベストなのですが・・・
そうすると、一度全ての固定ページを取得した上で、人力でフィルタリング・グルーピングする必要があると思います。
固定ページ一覧を取得するget_pagesという関数があるので、一度リファレンスを参考にしてみて下さい。
具体的なコードも、まずはご自身で書いてみる事をおすすめします。