デジタルアーカイブ公開システム(5)
第2次システム
初期のシステムはテーマのテンプレートを作成して各種の表示を行うシステムであった。このシステムではテーマを変更するたびに新しくテンプレートを作成する必要があった。そこで、プラグインを作成し、最低限のテンプレートを作成で済ませるようにした。また、個別表示や詳細検索などのメタデータの選択をテーマカスタマイザーを用いて指定できるようにした。
作成したプラグインの構造
│ digital_archive.php ├─js │ da.js 複数画像選択 │ gmaps.min.js 地図表示 │ masonry.pkgd.min.js 画像をタイル状に並べる ├─templates │ dalist.php ランダムにサムネイル表示 │ dalistall.php 一覧表示複数ページ可 │ dalistmap.php 地図表示 │ kensakuform.php 詳細検索フォーム │ searchform.php 全文検索フォーム │ style.css
プラグインのテンプレートを利用
PHPファイルを呼び出すショートコード「myphp」を作成し、デジタルアーカイブのサムネイルを「ランダムに表示する」、「一覧表示する(1ページ10枚表示し、それ以上なら次ページを表示する」、「詳細検索フォーム」、「全文検索フォーム」を呼び出すことにした。また、オプションとしてGoole Map Api を利用して地図を表示しそこへピンを立てるものも作成した。
最初のシステムでは、サムネイル等の表示をすることをテーマのlist表示テンプレートを利用した。しかしテーマから独立した表示を考えたので、サムネイル等の表示を整列するために、「ランダムに表示する」、「一覧表示する」ではWordPressのコアに含まれている「Masonry」を利用することにした。
ランダムに表示
一覧表示
詳細検索フォーム
カスタマイザを利用したメタデータの表示
一次システムでは、メタデータの表示はテーマのテンプレートに直接記述するため、メタデータの項目変更・表示項目変更等に手間がかかった。そこで、テーマカスタマイザを利用し、テーマのカスタマイズ画面で、表示するメタデータを決定するようにした。
メタデータ表示を行うために、フィールド名からフィールドラベルを求める関数「da_label($sel)」、シングル表示でメタデータを表示するための関数「da_mdlist()」、検索結果表示のメタデータを表示するための関数「da_se_mdlist()」、詳細検索フォームのための関数「da_sef_mdlist()」などを作成した。(相変わらずスパゲッティプログラムである)
フィールド名からフィールドラベルを求める関数
// acf グループ データ取得 function da_getlabel( ) { global $da_acf_g; $meta = array(); $target_label = array(); $found_posts = get_posts( array('post_type'=>'acf') ); foreach( $found_posts as $p ) { if( $p->post_title == $da_acf_g ) { $acf_id = $p->ID; break; } } if( $acf_id ) { $fields = get_post_meta($acf_id); foreach( $fields as $f ) { $meta = unserialize($f[0]); if( $meta['key'] ) { $target_label[]=array('name' => $meta['name'],'label' => $meta['label']); } } } return $target_label; } //label 表示用 function da_label($name){ global $target_label; foreach($target_label as $t_label){ if($t_label['name'] == $name){ $g_label = $t_label['label']; break; } } return $g_label; }
Singleページでメタデータを表示
function da_mdlist(){ global $da_single_sel; $se_mdlist=""; foreach ( $da_single_sel as $sel ) { $field = get_field_object ( $sel ); if ( $field ) { if($field['value'] != ""){ if(is_array($field['value'])){ $se_mdlist .= "<div><b>" . da_label($sel) . " :</b>"; foreach ( $field['value'] as $mvalue ) { $se_mdlist .= $mvalue . " "; } $se_mdlist .= "</div>"; }else{ $se_mdlist .= "<div><b>" . da_label($sel)/*$field['label']*/ . " :</b>" . $field['value'] . "</div>"; } } } } return $se_mdlist; }
検索結果ページでメタデータを表示
function da_se_mdlist(){ global $da_search_sel; $se_mdlist=""; foreach ( $da_search_sel as $sel ) { $field = get_field_object ( $sel ); if ( $field ) { if($field['value'] != ""){ if(is_array($field['value'])){ $se_mdlist .= "<div><b>" . da_label($sel) . " :</b>"; foreach ( $field['value'] as $mvalue ) { $se_mdlist .= $mvalue . " "; } $se_mdlist .= "</div>"; }else{ $se_mdlist .= "<div><b>" . da_label($sel) . " :</b>" . $field['value'] . "</div>"; } } } } return $se_mdlist; }
詳細検索ホーム作成
//acf グループのメタデータ取得 function da_getacffield( $group, $name ) { $target_field = array(); $found_posts = get_posts( array('post_type'=>'acf') ); foreach( $found_posts as $p ) { if( $p->post_title == $group ) { $acf_id = $p->ID; break; } } if( $acf_id ) { $fields = get_post_meta($acf_id); foreach( $fields as $f ) { $meta = unserialize($f[0]); if( $meta['name'] == $name ) { $target_field = $meta; break; } } } return $target_field; } function da_sef_mdlist(){ global $da_acf_g; global $da_searchf_sel; $sef_mdlist=""; foreach( $da_searchf_sel as $sel ) { $meta=da_getacffield( $da_acf_g,$sel ); if ( $meta['type'] == 'select') { $sef_mdlist.="<tr><th>".$meta['label'].":</th><td><select name='".$sel."'><option value=''"." selected>年代選択</option>"; foreach($meta['choices'] as $mt){ $sef_mdlist.= "<option value='".$mt."'>".$mt."</option>";} $sef_mdlist.="</select></td></tr>"; }elseif($meta['type'] == 'checkbox'){ $sef_mdlist.="<tr><th>".$meta['label'].":</th><td>"; foreach($meta['choices'] as $mt){ $sef_mdlist.=" <input type='checkbox' name='".$meta['name']."[]' value=".$mt." >".$mt." ";} $sef_mdlist.="</td></tr></select></td></tr>"; }else{ $sef_mdlist.="<tr><th>".$meta['label']."</th><td><input type=".$meta['type']." name=".$sel." style='width:100%' ></td></tr>"; } } return $sef_mdlist; }
これらの関数はいずれもカスタマイザーからの変数をもとに表示するメタデータを決めている。
詳細検索フォームは「kensakuform.php」で利用し、このテンプレートを固定ページで呼び出すようにしてある。