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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

904閲覧

Advanced Custom FieldsのRepeater Fieldを使って年分けした沿革を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/05/06 13:16

編集2018/05/07 04:24

現在、Advanced Custom FieldsのRepeater Fieldを使って
「沿革」と命名した繰り返し項目があります。
「沿革」内には「日付:デイトピッカー」「事柄:テキスト」の項目を設定しています。

これまでは、Advanced Custom Fieldsのマニュアルにあるように、
標準的な方法で表示していました。

php

1<ul> 2<?php if(have_rows('沿革')): ?> 3<?php while(have_rows('沿革')): the_row(); ?> 4<li><?php the_sub_field('日付'); ?> <?php the_sub_field('事柄'); ?></li> 5<?php endwhile; ?> 6<?php endif; ?> 7</ul>

しかし、表示項目が長くなってきたのもあって、
年別に出力し、アコーディオンメニューの処理を行いたいと考えています。

出力イメージは下記のような内容です。

html

1<ul> 2<li> 3<h1>2017年</h1> 4<ul> 5<!--ここからがRepeater Fieldで出力したい部分です--> 6<li>2017.01.01 テキストテキスト</li> 7<li>2017.01.01 テキストテキスト</li> 8<!--ここまでがRepeater Fieldで出力したい部分です--> 9</ul> 10</li> 11<li> 12<h1>2016年</h1> 13<ul> 14<!--ここからがRepeater Fieldで出力したい部分です--> 15<li>2016.01.01 テキストテキスト</li> 16<li>2016.01.01 テキストテキスト</li> 17<!--ここまでがRepeater Fieldで出力したい部分です--> 18</ul> 19</li> 20</ul>

しかし、Advanced Custom FieldsのRepeater Fieldをデイトピッカーの情報で
年別に出力する方法について、様々なキーワードで検索をしてみても、実装するにあたってのヒントが見つけられずにいます。

どうか皆様のお力添えを頂きた、質問させて頂きました。
何卒よろしくお願い致します。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

確かリピーターフィールドも get_field() で変数に配列として格納できるはずなので一旦変数に入れて加工してから出力すれば良いと思います。

php

1$history = get_field('沿革'); 2 3if ($history) { 4 // 年別にグルーピング 5 $yearly_history = array_reduce($history, function ($carry, $item) { 6 if (empty($carry)) { 7 $carry = array(); 8 } 9 10 list($year, $month, $date) = explode('.', $item['日付']); 11 12 if (!isset($carry[$year])) { 13 $carry[$year] = array(); 14 } 15 16 $carry[$year][] = $item; 17 18 return $carry; 19 }); 20 21 // 年を降順ソート 22 krsort($yearly_history); 23 24 // 出力 25 echo '<ul>'; 26 27 foreach($yearly_history as $year => $items) { 28 echo '<li>'; 29 echo '<h1>' . $year . '年</h1>'; 30 echo '<ul>'; 31 32 foreach($items as $item) { 33 echo '<li>'. $item['日付'] . ' ' . $item['事柄'] . '</li>'; 34 } 35 36 echo '</ul>'; 37 echo '</li>'; 38 } 39 40 echo '</ul>'; 41}

投稿2018/05/07 07:32

yhg

総合スコア2161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/07 17:04

yhg様 ご回答をありがとうございます。 イメージしていた以上に便利なループ処理をご教授頂き感謝致します。 無事に実装が完了しました!
guest

0

phpのみ、ACFの機能のみでは実装できません。

cssのみ、もしくはjavascript、jQueryを利用するなりして
実装する方法が実に多様にあります。

ですので、どの処理が好みなのか見当がつかないので、
見本となる回答がつけにくいです。

"jquery アコーディオン"、"css アコーディオン"などのキーワードで
検索すればそれこそ選びきれないほど出てくるので
その中からご希望に沿うものを選んで実装されると良いと思います。

投稿2018/05/07 03:17

編集2018/05/07 03:20
stampdoor

総合スコア483

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/07 04:12

stampdoor様 ご回答をありがとうございます。 現在の困り後に関して、説明が分かりづらく申し訳ありません。 アコーディオンなどの処理に関しては、困っておらず、 カスタムフィールドの吐き出しの方が困っています。 デイトピッカーで入力した年月日を元に、 年別で繰り返しフィールドを出力したいと考えています。 出力する方法が分かれば、アコーディオンなどの最終処理は何とかできると思います。
stampdoor

2018/05/07 14:43

下記の回答のいずれかを選択すると良いかと思います。 kanashiro様の解決方法では、 処理方法としては確実ですが新たにacfのフィールドを作るので、 現存するフィールドを置換するのに手間がかかってしまうので フィールド数が現実的な範囲であれば選択しても良いと思います。 yhg様が書いた内容は正解のように見えますが、 リピーターフィールドをget_field()で取得できたかどうか 定かではなかったため断言出来ないです。 とにかく、「新たに判断基準になるフィールドを足す」か「現在のフィールドを元にソートし直す」しかないので、acfのベーシックな使い方以外の出力になると思います。
退会済みユーザー

退会済みユーザー

2018/05/07 17:10

stampdoor様 今回はyhg様のアドバイス内容で、無事に実装が完了しました! 当方の確認に先んじて、他の方のアドバイスをご判断下さりありがとうございました!
guest

0

リピーターフィールドの中にリピーターフィールドを使用しました。

★コードは下記の通りです。★

<ul> <?php if(get_field('沿革')): ?> <?php while( has_sub_field('沿革') ): ?> <li><a href="#" class="toggle-menu"> <?php the_sub_field('年代'); ?></a> <?php if(get_sub_field('項目')): ?> <ul class="child"> <?php while( has_sub_field('項目') ): ?> <li><?php the_sub_field('日付'); ?> <?php the_sub_field('事柄'); ?></li> <?php endwhile;?> </ul> <?php endif; ?> </li> <?php endwhile; endif; ?> </ul>

◆そして、下記 javascript を header 内に追記◆

<script type="text/javascript"> jQuery(function() { jQuery(".toggle-menu").click(function(){ jQuery(this).next('.child').slideToggle(); if (jQuery(this).hasClass("close")) { jQuery(this).removeClass("close"); } else { jQuery(this).addClass("close"); } return false; }); }); </script>

◆CSSを追記◆

ul.child { display: none; }

これで解決できればいいです。

投稿2018/05/07 03:52

編集2018/05/07 04:05
kanashiro

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/07 17:07

kanashiro様 ご回答をありがとうございます。 今回当方の説明べたのせいで、困りごとが伝わりづらかったと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問