CSV ファイルのデータからテーブルを作成するプラグインを開発!?


本ブログ、意外とテーブルを多用しています!閲覧して頂いている方々は気が付いておられなくても、私個人として結構時間を掛けて作表していて、手間が掛っているんですよね!Excel でデータを作成して、テーブルにするにはとっても手間をかけてテーブルタグを挿入しなければなりません・・・

そこで、テーブルをもっと簡単に作成できるようなプラグインを自分で開発しちゃいました!って、嘘に近いのですが、実際には、以下の公開された投稿記事を参考にして・・・いや~嬉しい限りです!

「ウェブル::初心者でも10秒でできる WordPress プラグインの作り方」に記述されているように、全てのプラグインに必要な以下のコードを記述しました。

<?php
/*
Plugin Name: AAA-ZeroTable
Plugin URI: http://www.startat50.net/2011/08/28/764
Description: CSVファイルのデータからテーブルを表示させるプラグイン。あくまでも Zero Cool の個人利用のために開発したもので一般に公開されているものではありません。
Version: 1.1
Author: Zero Cool
Author URI: http://www.startat50.net/
*/

// こっからコードを記述する
?>

上記は、参考サイトの通りに本ブログ用にちょっと変更を加えただけ!そして、「Simple Colors::CSVファイルのデータからテーブルを表示させるショートコード」にあるコードをコピペしただけです。全てのコードを以下に示しておきましょう。

<?php
/*
Plugin Name: AAA-ZeroTable
Plugin URI: http://www.startat50.net/2011/08/28/764
Description: CSVファイルのデータからテーブルを表示させるプラグイン。あくまでも Zero Cool の個人利用のために開発したもので一般に公開されているものではありません。
Version: 1.1
Author: Zero Cool
Author URI: http://www.startat50.net/
*/
function table_shortcode( $atts ) {
    $default = array(
        'th'            => 'row',
        'caption'       => '',
        'file'          => '',
        'id'            => false,
        'charset'       => 'sjis-win',
        'table_id'      => '',
        'table_class'   => '',
        'tfoot'         => 'false',
    );
    $args = shortcode_atts( $default, $atts );
 
    if ( is_numeric( $args['id'] ) ) {
        $post = get_post( $args['id'] );
        if ( $post->post_mime_type == 'text/csv' ) {
            $args['file'] = $post->guid;
        }
    }
 
    $match_num = 0;
    if ( preg_match( '|^https?://|', $args['file'] ) && strpos( $args['file'], '../' ) === false ) {
        $file = str_replace( WP_CONTENT_URL, WP_CONTENT_DIR, $args['file'], $match_num );
    } elseif ( preg_match( '|^/|', $args['file'] ) && strpos( $args['file'], '../' ) === false ) {
        $file = $_SERVER['DOCUMENT_ROOT'] . $args['file'];
        $match_num = 1;
    }
 
    if ( $match_num && file_exists( $file ) && is_readable( $file ) ) {
        $charset = in_array( strtolower( $args['charset'] ), array( 'utf-8', 'euc-jp', 'eucjp-win', 'sjis', 'sjis-win', 'iso-2022-jp' ) ) ? $args['charset'] : $default['charset'];
        $th = in_array( strtolower( $args['th'] ), array( 'col', 'row', 'both' ) ) ? strtolower( $args['th'] ) : $default['th'];
        $fh = fopen( $file, 'r' );
        if ( $fh ) {
            $row_num = $th == 'row' ? 1 : 0;
            $table_id = $args['table_id'] ? ' id="' . esc_attr( $args['table_id'] ) . '"' : '';
            $table_class = $args['table_class'] ? ' class="' . esc_attr( $args['table_class'] ) . '"' : '';
            $output = '<table' . $table_id . $table_class . '>' . "n";
            if ( $args['caption'] ) {
                $output .= '<caption>' . esc_html( $args['caption'] ) . "</caption>n";
            }
            while ( $row = Ps_fgetcsv_reg( $fh, $args['charset'] ) ) {
                if ( $row_num == 0 ) {
                    $row_class = 'head_row';
                } else {
                    $row_class = $row_num % 2 ? 'odd' : 'even';
                }
                if ( $row_num == 0 ) {
                    $output .= '<thead>' . "n";
                } elseif ( $row_num == 1 ) {
                    $output .= '<tbody>' . "n";
                }
                $line = '<tr class="' . $row_class . '">' . "n";
 
                for ( $i = 0; $i < count( $row ); $i++ ) {
                    $elm = ( $th != 'col' && $i == 0 ) || $row_num == 0 ? 'th' : 'td';
                    $line .= '<' . $elm . '>' . $row[$i] . '</' . $elm . ">n";
                }
                $line .= '</tr>' . "n";
                $output .= $line;
                if ( $row_num == 0 ) {
                    $output .= '</thead>' . "n";
                    if ( in_array( strtolower( $args['tfoot'] ), array( '1', 'true' ) ) ) {
                        $output .= '<tfoot>' . "n";
                        $output .= '<tr class="' . $row_class . '">' . "n";
                        $output .= $line;
                        $output .= '</tr>' . "n";
                        $output .= '</tfoot>' . "n";
                    }
                }
                $row_num++;
            }
            $output .= "</tbody>n";
            $output .= '</table>';
        }
    }
    return $output;
}
add_shortcode( 'csv2table', 'table_shortcode' );
 
function Ps_fgetcsv_reg ( &$handle, $charset = 'sjis-win', $length = null, $d = ',', $e = '"' ) {
    $d = preg_quote( $d );
    $e = preg_quote( $e );
    $_line = "";
    $eof = false;
    while ( ( $eof != true ) and ( ! feof( $handle ) ) ) {
        $_line .= ( empty( $length ) ? fgets( $handle ) : fgets( $handle, $length ) );
        $itemcnt = preg_match_all( '/'.$e.'/', $_line, $dummy );
        if ( $itemcnt % 2 == 0 ) $eof = true;
    }
    if ( strtolower( $charset ) != 'utf-8' ) {
        $_line = mb_convert_encoding( $_line, 'UTF-8', $charset );
    }
    $_csv_line = preg_replace( '/(?:rn|[rn])?$/', $d, trim( $_line ) );
    $_csv_pattern = '/('.$e.'[^'.$e.']*(?:'.$e.$e.'[^'.$e.']*)*'.$e.'|[^'.$d.']*)'.$d.'/';
    preg_match_all( $_csv_pattern, $_csv_line, $_csv_matches );
    $_csv_data = $_csv_matches[1];
    for( $_csv_i = 0; $_csv_i < count( $_csv_data ); $_csv_i++ ) {
        $_csv_data[$_csv_i] = preg_replace( '/^'.$e.'(.*)'.$e.'$/s', '$1', $_csv_data[$_csv_i] );
        $_csv_data[$_csv_i] = str_replace( $e.$e, $e, $_csv_data[$_csv_i] );
    }
    return empty( $_line ) ? false : $_csv_data;
}
?>

凄過ぎる!これだけで、CSV ファイルをアップロードして、指示されている を利用すれば完了するはずで・・・下記にサンプルを示すと・・・凄い!できた!!

年末 JTA ランキング
Year Grade Ranking Points Tours
2011.07 高校3年生 217 148 16
2010.12 高校2年生 220 157 15
2009.12 高校1年生 303 109 12
2008.12 中学3年生 646 33 6
2007.12 中学2年生 659 30 4
2006.12 中学1年生 838 17 3

こんなに簡単に作表ができるのは感動以外の何物もない・・・素晴らしい!

合わせて読みたいかも・・・


Twitter でコメントを・・・

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

* Copy This Password *

* Type Or Paste Password Here *