デジタルアーカイブ公開システム(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」で利用し、このテンプレートを固定ページで呼び出すようにしてある。