• デジタルアーカイブ公開システム(6)

    デジタルアーカイブ公開システム(6)

    第2次システム(続き)

    前回はメタデータの表示関係について説明した。なるべくテーマを変更してもテーマのカスタマイズが少なく済むようにフィルターフックを利用して画像とメタデータを表示するようにした。

    フィルターフックの利用

    add_filterでthe_content 及びthe_excerptをフックし、Single及び検索結果表示にメタデータを付加することとした。

    個別ページを表示するために、カスタム投稿タイプがdaの時「the_content」に左側に画像、右側にメタデータを表示するように変更した。

    個別ページ

    また、複数の画像を表示することができるようにした。

    // singleページで da の時はメタデータを表示する
    function da_mdtuika($the_content) {
     if (is_singular('da')) {
      $return  = da_milist();
      return $return;
     } else {
      return $the_content;
     }
    }
    add_filter('the_content','da_mdtuika');
    
    //コンテンツ表示
    function da_milist(){
      global  $post;
        $args = array(
            'post_type' => 'attachment',
            'numberposts' => -1, //取得する画像数(-1の場合は全て)
            'post_status' => 'inherit',
            'post_parent' => $post->ID,
    'order' => 'ASC',
        );
        $attachments = get_posts($args);
    //画像表示
    ?>
    <div id="layout" class="pure-g">
     <div class="pure-u-1 pure-u-md-3-5">
     <div align="center">
      <img src=<?php echo($attachments[0]->guid); ?> name="ati"  ></img>
     </div>
     <?php 
       if(count($attachments) > 1){
     ?>
    サムネイル表示
      <div class="js-masonry" > masonryでサムネイルを表示する
          <?php  foreach ($attachments as $attachment) {
       ?>
       <div class="card-item slide" align="center">
       <a href="javascript:document.ati.src ='<?php echo($attachment->guid); ?>';void(0);">クリックされたら[ati]に表示
        <?php echo(wp_get_attachment_image($attachment->ID)); ?>
       </a>
      </div>
       <?php 
       }
       ?>
      </div>
     <?php
        }
     ?>
     </div>
     <div class="pure-u-1 pure-u-md-2-5">
      <?php echo da_mdlist(); ?> メタデータを表示 
      </div>
    </div>
    <?php 
    }
    
    

    検索結果ページ

    検索結果ページはカスタム投稿タイプがdaでsearchの時「the_excerpt」をフックし、リスト表示の抜粋をメタデータとして表示させる。

    // searchページで da の時はメタデータを表示する
    function da_ls_mdtuika($the_excerpt) {
     $post_type = get_post_type();
     if (is_search()  && $post_type == 'da') {
       $return  = $the_excerpt;
       $return .= da_se_mdlist();
       return $return;
     } else {
      return $the_excerpt;
     }
    }
    add_filter('the_excerpt','da_ls_mdtuika');
    
    // メタデータを表示
    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;
    }

    このプラグインで、ほぼテーマの改造をせずに済むようにしたが、検索結果表示のsearchページに「絞り込み検索」のための関数を付加する必要がある。(一部のテーマでは「$the_excerpt」を利用していないリストページがあるので、改造する必要がある)

    また、WordPressの標準テーマでは個別ページにサムネイルが表示されるのでその部分の変更が必要である。

    /* 絞り込み検索関数 */
    function da_search(){
      global $da_searchf_sel;
      $da_keys = $_GET;
      $post_type = $da_keys['post_type'];
      foreach( $da_searchf_sel as $sel){
       if($da_keys[$sel]){
         if(is_array($da_keys[$sel])){
           foreach ($da_keys[$sel] as $da_key){
           $metaquerysp[] = array(
                    'key'=>$sel,
                    'value'=> $da_key,
        'compare'=>'LIKE',
                    );
          }
         }else{
           $metaquerysp[] = array(
                    'key'=>$sel,
                    'value'=> $da_keys[$sel],
        'compare'=>'LIKE',
                    );
        }
       }
      }
      $metaquerysp['relation'] = 'AND';
    
      query_posts( array(
        'post_type' => $post_type,
        'meta_query' => $metaquerysp,
        's' => $da_keys['s'],
        'posts_per_page' => '10',
        'paged' => get_query_var('paged'),
        )
      );
    }

    現在のシステム

    現在のシステムは第2次システムをもとに、テンプレート部分を含んだ関数をショートコードにして固定ページに入力することで表示できるようにした。ショートコードについて以下に示す。

    ランダム表示:デジタルアーカイブからランダムにサムネイルを表示する。(表示枚数のデフォルトは10枚、変更はp_p_pageで設定) 「darandom_list」

    全文検索フォーム:全文検索用、ポストタイプ及びプレースホルダ(検索までに表示する文字)を変更可能。(ポストタイプのデフォルトはカスタム投稿「da」、プレースホルダーは「デジタルアーカイブ検索」、 変更はp_type、 p_plhで設定)  「kensaku_form」

    一覧表示:デジタルアーカイブの一覧を表示する。タイトルとサムネールが表示される。「itiran_l」

    詳細検索フォーム:詳細検索用、「メタデータ表示設定」で設定した「検索項目」に基づいて表示。「dakensaku_form」

    カテゴリー検索:カテゴリー検索用、設定されたカテゴリを表示し、選択されたカテゴリのデジタルアーカイブのタイトルサムネイルの一覧を表示する。「cat_list」

    ブログ一覧:ブログの一覧をサムネイル、本文の最初を表示 「toukou_list」

    スライド表示:ランダムに選択されたデジタルアーカイブのサムネイルをスライド表示する。(表示枚数のデフォルトは6枚、変更はp_p_pageで設定) 「daslide_list」

     地図の表示:メタデータでGoogle Mapを設定したデータを表示する。「国土地理院地図」及び「Google地図」を利用した2種ある。(Google地図は回数制限があるため国土地理院地図を利用するほうが良い)初期に表示する緯度、経度、拡大率を(p_lat,p_lag,p_zoom)で設定する。「damap_listk p_lat=’緯度’ p_lag=’経度’ p_zoom=’拡大率’」  国土地理院地図利用「damap_listg p_lat=’緯度’ p_lag=’経度’ p_zoom=’拡大率’」 Google地図利用

    詳細はまた書きます。

  • デジタルアーカイブ公開システム(5)

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

  • デジタルアーカイブ公開システム(4)

    デジタルアーカイブ公開システム(4)

    初期のシステム

    最初に考えたのは、カスタム投稿に画像とメタデータを投稿し、カテゴリーで分類することを考えた。メタデータの検索は全文検索で行うこととした。この形である程度の検索が可能であるが詳細検索ができないことからメタデータをカスタムフィールドに記録し、詳細検索が可能にする必要を感じてWordPressの「Advanced Custom Fields」Pluginを利用することとした。

    テーマの改造によるシステム

    カスタム投稿とカスタムフィールドを利用し、テーマのテンプレートを作成各種機能を実現することを考えた。

    カスタム投稿のコンテンツには画像および概要を記入し、カスタムフィールドにメタデータを記入した投稿を一つのデジタルアーカイブとし、これをもとに全文検索、一覧表示、詳細検索、アーカイブ表示の機能をテーマをカスタマイズして実現した。

    コンテンツ部分
    メタデータ部分

    作成したテンプレート

    デジタルアーカイブランダム表示

    トップページにランダムに6個分サムネイルを表示する。

    投稿タイプを指定し、ランダムに6枚表示するために次のようにした。

    $args = array(
         'post_type' => 'da', /* 投稿タイプを指定 */
    'posts_per_page' => 6,/*1ページ当たり6枚*/
    'orderby' => 'rand',/*ランダムに抽出*/
    ); 
    $wp_query = new WP_Query($args);
    get_template_part('list-tp');//リスト表示テンプレート(サムネイル・タイトル)
    

    デジタルアーカイブコンテンツ表示(シングル表示)

    投稿されたコンテンツ(画像)とメタデータを表示するために、single.phpのthe_content()の後にメタデータ表示用のテンプレートを追加する。

    メタデータ表示用(すべての項目表示)

    資料No:<?php echo post_custom('sno'); ?><br />
    年 代:<?php echo post_custom('nendai'); ?><br />
    場 所:<?php echo post_custom('tiiki'); ?><br />
    内容分類<?php 
            $field = get_field('naiyou');
            foreach($field as $value) {
               echo '  :' . $value;
            }  ?>
    <br />
    著作権:<?php echo post_custom('chosakuken'); ?><br />
    撮影日:<?php echo post_custom('satueibi'); ?><br />
    撮影者:<?php echo post_custom('satueisha'); ?><br />
    
    

    このテンプレートでは、入力されていない項目もフィールド名が表示される。

    検索結果表示

    検索結果を表示するために、シングル表示と同様にメタデータ表示用テンプレートを使用する。今回のテーマはリストをカードで表示するものである。

    コンテンツと同様にメタデータを表示するテンプレートを挿入する。

    <br />
    年 代:<?php echo post_custom('nendai'); ?><br />
    場 所:<?php echo post_custom('tiiki'); ?><br />
    内容分類<?php 
         $field = get_field('naiyou');
         foreach($field as $value) {
           echo ' :' . $value;
         } ?>
    <br />

    詳細検索画面

    詳細検索用のフォームを表示し、検索項目を入力させる。

    固定ページに検索フォーム用テンプレートを追加する。

    <form method="get" action="<?php bloginfo('url') ;?>">
    <input type="hidden" name="post_type" value="da" id="post_type">
     <input type="hidden" name="s" id="s" >
    
    年 代:<select name="nendai">
        <option value="" selected>年代選択</option>
        <option value="平成" >平成</option>
        <option value="昭和">昭和</option>
        <option value="大正">大正</option>
        <option value="明治">明治</option>
        <option value="江戸">江戸</option>
        <option value="江戸以前">江戸以前</option>
    </select><br><br>
    地域・場所:<input type="text"  name="tiiki"  /><br><br>
    内容分類:
    <input type="checkbox" name="naiyou[]" value="文化財" >文化財
    <input type="checkbox" name="naiyou[]" value="美術品">美術品
    <input type="checkbox" name="naiyou[]" value="工芸品">工芸品
    <input type="checkbox" name="naiyou[]" value="歴史">歴史
    <input type="checkbox" name="naiyou[]" value="自然">自然
    <input type="checkbox" name="naiyou[]" value="動植物">動植物
    <input type="checkbox" name="naiyou[]" value="建築">建築
    <input type="checkbox" name="naiyou[]" value="技術">技術
    <input type="checkbox" name="naiyou[]" value="町並">町並
    <input type="checkbox" name="naiyou[]" value="観光">観光
    <input type="checkbox" name="naiyou[]" value="地域資源">地域資源
    <input type="checkbox" name="naiyou[]" value="生活文化(衣食住)">生活文化(衣食住)
    <input type="checkbox" name="naiyou[]" value="交通">交通
    <input type="checkbox" name="naiyou[]" value="災害">災害
    <input type="checkbox" name="naiyou[]" value="産業">産業
    <input type="checkbox" name="naiyou[]" value="教育">教育
    <br><br>
    著作権:<input type="text"  name="chosakuken"  /><br>
    撮影者:<input type="text"  name="satueisha"  /><br>
    撮影日:<input type="text"  name="satueibi"  /><br>
    <input type="submit"  value="検索" /><br>
     </form>

    すべての検索項目をテンプレートに記述する。

    検索結果表示テンプレート

    カスタム投稿の検索結果をリスト表示するテンプレート(search-da.php)を作成した。

    search-da.phpの中に検索用テンプレート(dasearch)を読み込む。

    <?php //検索結果表示用 ?>
    <?php get_header(); ?>
    <style type="text/css">
    #sidebar{display:none;}
    #main{width:1010px;}
    .ad-right{float:left;}
    </style>
      <?php get_template_part('breadcrumbs-page'); //固定ページパンくずリスト?>
    <?php get_template_part('dasearch'); //検索用テンプレート?>
    <?php get_template_part('list-p') ?>
    <?php get_footer(); ?>

    検索フォームのデータをGETし、それをもとに(query_posts)を利用してカスタムフィールドのANDを検索する。

    <?php
    $satueibi = $_GET['satueibi'];
    $satueisha = $_GET['satueisha'];
    $nendai = $_GET['nendai'];
    $chosakuken = $_GET['chosakuken'];
    $tiiki = $_GET['tiiki'];
    $naiyou = $_GET['naiyou'];
    $post_type = $_GET['post_type'];
    if($satueibi){
            $metaquerysp[] = array(
                    'key'=>'satueibi',
                    'value'=> $satueibi,
        'compare'=>'LIKE',
                    );
        }
    if($satueisha){
        $metaquerysp[] = array(
                'key'=>'satueisha',
                'value'=> $satueisha,
                'compare'=>'LIKE',
                );
    }
    if($chosakuken){
        $metaquerysp[] = array(
                'key'=>'chosakuken',
                'value'=> $chosakuken,
                'compare'=>'LIKE',
                );
    }
    if($tiiki){
        $metaquerysp[] = array(
                'key'=>'tiiki',
                'value'=> $tiiki,
                'compare'=>'LIKE',
                );
    }
    if($nendai){
            $metaquerysp[] = array(
                    'key'=>'nendai',
                    'value'=> $nendai,
                'compare'=>'IN',
                    );
     }
    if($naiyou){
        foreach($naiyou as $val){
            $metaquerysp[] = array(
                    'key'=>'naiyou',
                    'value'=> $val,
                'compare'=>'LIKE',
                    );
        }  
    }
    $metaquerysp['relation'] = 'AND';
    query_posts( array(
    'post_type' => $post_type,
        'meta_query' => $metaquerysp,
        )
    );
    ?>
    <?php wp_reset_postdata(); ?>

    第1次案はテンプレートを利用したため、カスタムフィールドの項目やシングル・リスト表示で入力されて無い項目を非表示にすることなど柔軟性が乏しいものとなっていた。そのためにテンプレートだけでなくプラグインで対応することを考えた。

     

  • デジタルアーカイブ公開システム(3)

    デジタルアーカイブ公開システム(3)

    開発したシステムは、文化的、歴史的な写真をデジタル化し、蓄積・公開するためのサイトで、写真にメタデータを付加したデジタルデータをWeb上に蓄積し、誰でも簡単に表示・検索できるシステムです。

    作成したシステムの機能

    • ホームページ閲覧ソフト(ブラウザ)を利用してデジタルアーカイブの蓄積・閲覧・検索ができる。
    • 蓄積するコンテンツは複数枚の画像(jpg,png,gif)及びPDFが可能。
    • 写真にメタデータを付加し、デジタルアーカイブとして蓄積することができる。
    • デジタルアーカイブは複数の投稿者がインターネットを利用して入力できる。
    • 検索機能として
      1. アーカイブ一覧
      2. フリーワード検索
      3. 絞り込み検索が可能。(メタデータをもとに検索する)
      4. 地図から検索(オプション)
      5. カテゴリー検索(オプション)
    • ブログなど記事の投稿ができる。
    • ホームページとしての機能を持たせることができる。

    基本的な閲覧画面

    ・Topページ

    1. デジタルアーカイブに関する説明やこのサイトの位置づけなどを記述する。
    2. アーカイブの写真をランダムに10枚表示する。
    3. フリーワード検索欄を設置している。 内容等は容易に変更可能。

    ・アーカイブ一覧画面

    1. Topページと同様に説明等を記述するとともにフリーワード検索欄を設置。
    2.  現在蓄積されているアーカイブの一覧を表示する。表示されるものは写真及びタイトルとする。
    3.  1ページに10枚の写真を表示し、前後にページ移動可能。
    4.  写真をクリックすると個別ページでアーカイブを表示する。

    ・詳細検索画面

    1. 検索対象のメタデータを入力し絞り込み検索を行う。
    2. 入力形式は「テキスト」、「ドロップダウン選択」、「チェックボックス選択」がある。

    ・カテゴリー検索画面

    カテゴリーを選択し、そのカテゴリーを持つアーカイブ一覧を表示し検索する。

    ・地図から検索画面

    地図上に表示されたピンをクリックすることにより検索する。

    ・検索結果画面

    1. 検索結果のタイトル、写真、メタデータを1ページ10枚表示する。
    2. 10以上結果がある場合には前後にページ移動可能。
    3. 写真をクリックすると個別ページに移動しでアーカイブを表示する。

    ・個別アーカイブ表示画面

    タイトル、大きなサイズの写真及びメタデータを表示する。

    ・お知らせ画面

    ブログと同様に投稿者が自由に記事を投稿した記事の一覧を表示する。

    これらの機能の具体例はデジタルアーカイブのテストサイトにあるのでご覧ください。

     

トップへ戻る