【WordPress財務データアプリ】DB作成

ブログ

概要

この記事では、WordPressで財務データアプリを作る方法を紹介していきたいと思います。

実際に作成したアプリはこちら(デザインは適当です)

構成

このアプリの簡単な構成は以下になります。
1. 検索ページ:財務データを表示する企業名を検索
2. 詳細ページ:検索した企業の有価証券報告書の主要な財務項目数値を表示、グラフ化
3. DLページ:詳細ページで選択した有価証券報告書をダウンロードし、主要な情報を表示、データのダウンロード機能などを設置

となります。
詳細ページで表示しているデータについては、以下の記事で紹介している方法で、取得したデータを整形して保存したものです。

使い方イメージ

まずは、検索ページで企業名を検索

検索結果から知りたい企業をクリック

企業の基本情報のグラフや表が表示されます。
グラフ

表

グラフで表示する項目や棒グラフか、折れ線グラフかは変更できます。
グラフ変更

表データはCSV出力が可能です。
CSV

さらに詳しく知りたい場合は、「詳細データ」をクリックします。

詳細

データ処理にしばらく時間がかかります。
データ処理

主要データを確認可能です。

EDINETのCSV出力で確認できるすべての項目を検索、CSV出力できます。

注意点

基本的にデータはEDINETから取得しています。データの正確性は確認していませんので、利用は自己判断、自己責任でお願いします。

データ準備

まずは、アプリに必要なデータを準備します。

DLページのデータはすべてアプリ内でEDINETから取得しますが、詳細ページで使用するデータや検索ページで使用するデータはEDINETから取得したデータをWordPressのDBに保存しています。

WordPressのDBに保存するために、保存したいデータをいったんCSVにしています。
このアプリではカラムは以下になっています。

docID,date,secCode,filerName,doc_id,EndDate,利益剰余金,受取利息及び受取配当金,営業利益又は営業損失(△),営業活動によるキャッシュ・フロー,売上総利益又は売上総損失(△),売上高,当期純利益又は当期純損失(△),投資活動によるキャッシュ・フロー,支払利息,株主資本,株価収益率,法人税等,流動負債,流動資産,減価償却費,発行済株式総数,短期借入金,経常利益又は経常損失(△),負債,財務活動によるキャッシュ・フロー,販売費及び一般管理費,資産,長期借入金

データの取得は、以下の記事などで紹介していますが、とりあえずサンプルでやってみたいという場合には、サンプルのCSVも用意したので、そちらを使ってください。

データ取得について

サンプルCSVファイルをダウンロード

データベース作成とデータ登録

データベースの作成とデータ登録はphpMyadminなどを使って手動で行ってもよいですが、今回は、プラグインを作成して行うことにしました。

作成したプラグインは以下からダウンロードもしくは、後で紹介するコードから作成してください。

プラグインzipファイルをダウンロード

プラグインの使い方

まずは、プラグインを追加して、有効化してください。
プラグインの追加

有効化するとプラグインメニューがサイドバーに出てくるので、表示します。

まずは、データテーブルの作成を行いますので、Create Tableをクリックします。
テーブルの作成

次に、テーブルにデータを登録します。
ファイルを選択(先ほどDLしたサンプルのCSVなど)してインポートしてください。
データ登録

インポートしたらphpMyAdminなどでデータの確認を行います。
データの確認

プラグインのコードについて

プラグインでは大きく、テーブル作成とCSVのインポートの2つを行っています。

自分でプラグインを作成する場合は、plugin/にcustom-financial-dataというフォルダを作成して、custom-financial-data.phpに以下のコードをコピペしてください。
全体のコードは以下になります。

<?php
/*
Plugin Name: Custom Financial Data
Description: A plugin to create and manage a finance custom table for storing financial data and import data from a CSV file.
Version: 1.1
Author: ayu
*/

// テーブル作成関数
function create_financial_data_table() {
    global $wpdb;

    $table_name = $wpdb->prefix . 'financial_data'; // テーブル名(wp_はプレフィックス)

    // SQLクエリを用意
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        docID VARCHAR(255) NOT NULL,
        date DATE NOT NULL,
        secCode VARCHAR(20) NOT NULL,
        filerName VARCHAR(255) NOT NULL,
        EndDate DATE NOT NULL,
        sales DECIMAL(20,2) DEFAULT NULL,
        gross_profit_loss DECIMAL(20,2) DEFAULT NULL,
        operating_income_loss DECIMAL(20,2) DEFAULT NULL,
        ordinary_income_loss DECIMAL(20,2) DEFAULT NULL,
        net_income_loss DECIMAL(20,2) DEFAULT NULL,
        parent_net_income_loss DECIMAL(20,2) DEFAULT NULL,
        operating_cf DECIMAL(20,2) DEFAULT NULL,
        investing_cf DECIMAL(20,2) DEFAULT NULL,
        financing_cf DECIMAL(20,2) DEFAULT NULL,
        assets DECIMAL(20,2) DEFAULT NULL,
        liabilities DECIMAL(20,2) DEFAULT NULL,
        current_assets DECIMAL(20,2) DEFAULT NULL,
        current_liabilities DECIMAL(20,2) DEFAULT NULL,
        net_assets DECIMAL(20,2) DEFAULT NULL,
        shareholders_equity DECIMAL(20,2) DEFAULT NULL,
        retained_earnings DECIMAL(20,2) DEFAULT NULL,
        short_term_debt DECIMAL(20,2) DEFAULT NULL,
        long_term_debt DECIMAL(20,2) DEFAULT NULL,
        corporate_taxes DECIMAL(20,2) DEFAULT NULL,
        sg_and_a DECIMAL(20,2) DEFAULT NULL,
        depreciation DECIMAL(20,2) DEFAULT NULL,
        interest_income_dividends DECIMAL(20,2) DEFAULT NULL,
        interest_expenses DECIMAL(20,2) DEFAULT NULL,
        per DECIMAL(10,2) DEFAULT NULL,
        shares_outstanding BIGINT(20) DEFAULT NULL,
        dividend_per_share DECIMAL(10,2) DEFAULT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY docID_secCode (docID, secCode)
    ) $charset_collate;";

    // テーブル作成のためのSQLクエリを実行
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}

// 管理画面メニューに「テーブル作成」ページを追加
function custom_financial_data_menu() {
    add_menu_page(
        'Custom Financial Data',
        'Custom Financial Data',
        'manage_options',
        'custom-financial-data',
        'custom_financial_data_page'
    );
}
add_action('admin_menu', 'custom_financial_data_menu');

// 管理画面のページ内容
function custom_financial_data_page() {
    if (!current_user_can('manage_options')) {
        return;
    }

    if (isset($_POST['create_table'])) {
        create_financial_data_table();
        echo "<div class='updated'><p>テーブルが正常に作成されました。</p></div>";
    }

    if (isset($_POST['submit']) && !empty($_FILES['csv_file']['tmp_name'])) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'financial_data';

        $file = $_FILES['csv_file']['tmp_name'];
        $handle = fopen($file, "r");

        // 1行目をスキップ(ヘッダー)
        fgetcsv($handle);

        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            // 空の値をNULLに変換
            $data = array_map(function($value) {
                return empty($value) ? NULL : $value;
            }, $data);

            $wpdb->insert(
                $table_name,
                array(
                    'docID' => $data[0],
                    'date' => $data[1],
                    'secCode' => $data[2],
                    'filerName' => $data[3],
                    'EndDate' => $data[4],
                    'sales' => $data[5],
                    'gross_profit_loss' => $data[6],
                    'operating_income_loss' => $data[7],
                    'ordinary_income_loss' => $data[8],
                    'net_income_loss' => $data[9],
                    'parent_net_income_loss' => $data[10],
                    'operating_cf' => $data[11],
                    'investing_cf' => $data[12],
                    'financing_cf' => $data[13],
                    'assets' => $data[14],
                    'liabilities' => $data[15],
                    'current_assets' => $data[16],
                    'current_liabilities' => $data[17],
                    'net_assets' => $data[18],
                    'shareholders_equity' => $data[19],
                    'retained_earnings' => $data[20],
                    'short_term_debt' => $data[21],
                    'long_term_debt' => $data[22],
                    'corporate_taxes' => $data[23],
                    'sg_and_a' => $data[24],
                    'depreciation' => $data[25],
                    'interest_income_dividends' => $data[26],
                    'interest_expenses' => $data[27],
                    'per' => $data[28],
                    'shares_outstanding' => $data[29],
                    'dividend_per_share' => $data[30]
                ),
                array(
                    '%s', '%s', '%s', '%s', '%s',
                    '%f', '%f', '%f', '%f', '%f',
                    '%f', '%f', '%f', '%f', '%f',
                    '%f', '%f', '%f', '%f', '%f',
                    '%f', '%f', '%f', '%f', '%f',
                    '%f', '%f', '%f', '%f'
                )
            );
        }

        fclose($handle);

        echo "<div class='updated'><p>データが正常にインポートされました。</p></div>";
    }
    ?>

    <div class="wrap">
        <h2>Custom Financial Data</h2>
        <form method="post">
            <input type="submit" name="create_table" class="button-primary" value="Create Table">
        </form>
        <h2>Import Financial Data from CSV</h2>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="csv_file" required>
            <input type="submit" name="submit" class="button-primary" value="Import CSV">
        </form>
    </div>
    <?php
}

// データ挿入と取得関数
function insert_financial_data($data) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'financial_data';

    $wpdb->insert(
        $table_name,
        array(
            'docID' => $data['docID'],
            'date' => $data['date'],
            'secCode' => $data['secCode'],
            'filerName' => $data['filerName'],
            'EndDate' => $data['EndDate'],
            'sales' => $data['売上高'],
            'gross_profit_loss' => $data['売上総利益又は売上総損失(△)'],
            'operating_income_loss' => $data['営業利益又は営業損失(△)'],
            'ordinary_income_loss' => $data['経常利益又は経常損失(△)'],
            'net_income_loss' => $data['当期純利益又は当期純損失(△)'],
            'parent_net_income_loss' => $data['親会社株主に帰属する当期純利益又は親会社株主に帰属する当期純損失(△)'],
            'operating_cf' => $data['営業活動によるキャッシュ・フロー'],
            'investing_cf' => $data['投資活動によるキャッシュ・フロー'],
            'financing_cf' => $data['財務活動によるキャッシュ・フロー'],
            'assets' => $data['資産'],
            'liabilities' => $data['負債'],
            'current_assets' => $data['流動資産'],
            'current_liabilities' => $data['流動負債'],
            'net_assets' => $data['純資産'],
            'shareholders_equity' => $data['株主資本'],
            'retained_earnings' => $data['利益剰余金'],
            'short_term_debt' => $data['短期借入金'],
            'long_term_debt' => $data['長期借入金'],
            'corporate_taxes' => $data['法人税等'],
            'sg_and_a' => $data['販売費及び一般管理費'],
            'depreciation' => $data['減価償却費'],
            'interest_income_dividends' => $data['受取利息及び受取配当金'],
            'interest_expenses' => $data['支払利息'],
            'per' => $data['株価収益率'],
            'shares_outstanding' => $data['発行済株式総数'],
            'dividend_per_share' => $data['1株当たり配当額']
        ),
        array(
            '%s', '%s', '%s', '%s', '%s',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f', '%f',
            '%f', '%f', '%f', '%f'
        )
    );
}

function get_financial_data($secCode) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'financial_data';

    $query = $wpdb->prepare("SELECT * FROM $table_name WHERE secCode = %s", $secCode);
    return $wpdb->get_results($query);
}
?>

コードの詳細は以下になります。

1. プラグインの基本情報

最初にプラグインのメタデータを定義します。

/*
Plugin Name: Custom Financial Data
Description: A plugin to create and manage a finance custom table for storing financial data and import data from a CSV file.
Version: 1.1
Author: ayu
*/
  • Plugin NameDescriptionVersionAuthorは、WordPressの管理画面でプラグインを識別するための情報です。

2. テーブル作成関数

カスタムテーブルを作成するための関数です。

function create_financial_data_table() {
    global $wpdb;

    $table_name = $wpdb->prefix . 'financial_data'; // テーブル名(wp_はプレフィックス)

    // SQLクエリを用意
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        docID VARCHAR(255) NOT NULL,
        date DATE NOT NULL,
        secCode VARCHAR(20) NOT NULL,
        ...
        dividend_per_share DECIMAL(10,2) DEFAULT NULL,
        PRIMARY KEY (id),
        UNIQUE KEY docID_secCode (docID, secCode)
    ) $charset_collate;";

    // テーブル作成のためのSQLクエリを実行
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
  • global $wpdb; は、WordPressのデータベースアクセスを提供するグローバルオブジェクト $wpdb を使用するために宣言します。
  • $table_name は、作成するテーブルの名前を定義します。$wpdb->prefix は、WordPressのインストールで設定されたテーブルのプレフィックス(通常は wp_)です。
  • $charset_collate は、データベーステーブルの文字セットと照合順序を設定します。
  • $sql 変数に CREATE TABLE SQLコマンドを定義し、テーブルの各カラム(列)のデータ型や属性を設定します。
  • dbDelta($sql); は、テーブルを作成または更新するためのWordPress関数です。

3. 管理画面メニューに「テーブル作成」ページを追加

管理画面にカスタムメニューを追加するための関数です。

function custom_financial_data_menu() {
    add_menu_page(
        'Custom Financial Data',
        'Custom Financial Data',
        'manage_options',
        'custom-financial-data',
        'custom_financial_data_page'
    );
}
add_action('admin_menu', 'custom_financial_data_menu');
  • add_menu_page() は、WordPressの管理画面に新しいメニュー項目を追加します。
  • 最初の引数 'Custom Financial Data' はページタイトルです。
  • 次の 'Custom Financial Data' はメニュータイトルです。
  • 'manage_options' は、このページを表示するために必要なユーザー権限です。
  • 'custom-financial-data' は、このページのスラッグ(URLの一部)です。
  • 'custom_financial_data_page' は、メニューアイテムをクリックしたときに呼び出される関数です。

4. 管理画面のページ内容

管理画面のページの内容を定義します。

function custom_financial_data_page() {
    if (!current_user_can('manage_options')) {
        return;
    }

    if (isset($_POST['create_table'])) {
        create_financial_data_table();
        echo "<div class='updated'><p>テーブルが正常に作成されました。</p></div>";
    }

    if (isset($_POST['submit']) && !empty($_FILES['csv_file']['tmp_name'])) {
        global $wpdb;
        $table_name = $wpdb->prefix . 'financial_data';

        $file = $_FILES['csv_file']['tmp_name'];
        $handle = fopen($file, "r");

        // 1行目をスキップ(ヘッダー)
        fgetcsv($handle);

        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            // 空の値をNULLに変換
            $data = array_map(function($value) {
                return empty($value) ? NULL : $value;
            }, $data);

            $wpdb->insert(
                $table_name,
                array(
                    'docID' => $data[0],
                    'date' => $data[1],
                    ...
                    'dividend_per_share' => $data[30]
                ),
                array(
                    '%s', '%s', '%s', '%s', '%s',
                    '%f', '%f', '%f', '%f', '%f',
                    ...
                    '%f', '%f'
                )
            );
        }

        fclose($handle);

        echo "<div class='updated'><p>データが正常にインポートされました。</p></div>";
    }
    ?>
    <div class="wrap">
        <h2>Custom Financial Data</h2>
        <form method="post">
            <input type="submit" name="create_table" class="button-primary" value="Create Table">
        </form>
        <h2>Import Financial Data from CSV</h2>
        <form method="post" enctype="multipart/form-data">
            <input type="file" name="csv_file" required>
            <input type="submit" name="submit" class="button-primary" value="Import CSV">
        </form>
    </div>
    <?php
}
  • current_user_can('manage_options') は、現在のユーザーが指定された権限を持っているか確認します。
  • $_POST['create_table'] が送信された場合、create_financial_data_table() 関数を呼び出してテーブルを作成します。
  • CSVファイルをインポートするためのコードも含まれており、$_FILES 配列を使用してアップロードされたファイルを処理します。fgetcsv() を使ってCSVの各行を読み取り、データをデータベースに挿入します。
  • <form> タグでHTMLフォームを作成し、テーブルの作成とCSVインポートのボタンを提供します。

5. データ挿入と取得関数

データベースにデータを挿入したり、取得するための関数です。

function insert_financial_data($data) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'financial_data';

    $wpdb->insert(
        $table_name,
        array(
            'docID' => $data['docID'],
            'date' => $data['date'],
            ...
            'dividend_per_share' => $data['1株当たり配当額']
        ),
        array(
            '%s', '%s', '%s', '%s', '%s',
            '%f', '%f', '%f', '%f', '%f',
            ...
            '%f', '%f'
        )
    );
}

function get_financial_data($secCode) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'financial_data';

    $query = $wpdb->prepare("SELECT * FROM $table_name WHERE secCode = %s", $secCode);
    return $wpdb->get_results($query);
}
  • insert_financial_data($data) は、指定されたデータをテーブルに挿入します。$wpdb->insert() を使用して挿入し、データ型の指定も行います(%s は文字列、%f は浮動小数点数)。
  • get_financial_data($secCode) は、指定された secCode に基づいてデータを取得します。$wpdb->prepare() は、SQLインジェクションを防ぐために使用される安全なSQLクエリを作成します。

ここまでで、データベースの作成とデータ登録ができました。
次回は、固定ページを使って、アプリ画面の作成をしていきます。

コメント

タイトルとURLをコピーしました