プラグイン作成時のデータベース構築とCSVインポート

1Reading Time

オリジナルプラグインを作成する場合、そのプラグインで使用するデータベースのテーブルが必要な場合があります。そのためのプログラムを備忘録として記録しておきます。

1.プラグインの作成と有効化した時の処理

プラグインの宣言と、メニューへの追加、そしてプラグインを有効化した時にテーブルを作成する処理です。

<?php

/*
Plugin Name: Custom Plugin
Author: 
Plugin URI: 
Description: カスタムプラグイン
Version: 0.1
Author URI:
*/

/* テーブルを作成する関数 */
function plugin_table(){

   global $wpdb;
   $charset_collate = $wpdb->get_charset_collate();

   /* テーブル名 */
   $tablename = $wpdb->prefix . "testplugin";

   $sql = "CREATE TABLE $tablename (
     id mediumint(11) NOT NULL AUTO_INCREMENT,
     name varchar(80) NOT NULL,
     username varchar(80) NOT NULL,
     email varchar(80) NOT NULL,
     age smallint(3) NOT NULL,
     PRIMARY KEY (id)
   ) $charset_collate;";

   /* プラグイン用のテーブルを作成する際には dbDelta() 関数を利用が推奨 */
   require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

}

/* プラグインが有効化するときのフック用関数 */
register_activation_hook( __FILE__, 'plugin_table' );

/* メニューの追加 */
function test_menu(){
    add_menu_page('テストプラグイン', '管理', 'activate_plugins', 'test_menu', 'test_list_page', '', 4);
} 
/* アクションフックでメニュー登録 */
add_action('admin_menu', 'test_menu');

function test_list_page(){
   include "displaylist.php";
}

2.CSVデータインポート処理

displaylist.phpで、CSVデータインポート機能を持ったページを表示させます。

<?php

    echo '<div><h3>CSVインポート処理</h3>';
    echo '<form method="post" action="' . $_SERVER['REQUEST_URI'] . '" enctype="multipart/form-data">';
    echo '<input type="file" name="upload_csv_file" id="upload_csv_file" value="upload_csv_file">';
    echo '<button type="submit" onClick="return confirm(\'価格データ(CSV)をアップロードします。\nよろしいですか?\');">CSVデータベースアップロード</button>';
    echo '</form>';
    echo '</div>';

<?php
global $wpdb;

// テーブル名
$tablename = $wpdb->prefix."customplugin";

// CSVファイルインポート処理
if(isset($_POST['butimport'])){

  // File extension
  $extension = pathinfo($_FILES['import_file']['name'], PATHINFO_EXTENSION);

  // ファイルが選択されているかつCSVファイルか
  if(!empty($_FILES['import_file']['name']) && $extension == 'csv'){

    $totalInserted = 0;

    // Open file in read mode
    $csvData = fopen($_FILES['import_file']['tmp_name'], 'r');

    fgetcsv($csvData); // 1行目を削除

    // 1行ずつ読込
    while(($csvData = fgetcsv($csvFile)) !== FALSE){

      // 文字コードチェック関数
      $encode_base = checkEncodeOfFile($csvData);

      // 文字コードをUTF8に変換 
      mb_convert_variables("UTF-8", $encode_base, $csvData);

      // 列の行数を取得
      $dataLen = count($csvData);

      // 4列ではない行はスキップ
      if( !($dataLen == 4) ) continue;

      // 値を変数に
      $name = trim($csvData[0]);
      $username = trim($csvData[1]);
      $email = trim($csvData[2]);
      $age = trim($csvData[3]);

      // すでにレコードがあるか重複チェック
      $cntSQL = "SELECT count(*) as count FROM {$tablename} where username='".$username."'";
      $record = $wpdb->get_results($cntSQL, OBJECT);

      if($record[0]->count==0){

        // 変数が空かどうかを確認します
        if(!empty($name) && !empty($username) && !empty($email) && !empty($age) ) {

          // レコードを挿入
          $wpdb->insert($tablename, array(
            'name' =>$name,
            'username' =>$username,
            'email' =>$email,
            'age' => $age
          ));

          if($wpdb->insert_id > 0){
            $totalInserted++;
          }
        }

      }

    }
    echo "<p style='color: green;'>登録行数 :  ".$totalInserted."</p>";


  }else{
    echo "<p style='color: red;'>Invalid Extension</p>";
  }

}

// 文字コードチェック関数
function checkEncodeOfFile($str){
	// 文字コード一覧
	$charArys = array('sjis', 'sjis-win', 'euc-jp', 'ASCII', 'jis', 'utf-8');
	foreach ($charArys as $charset){
		if ( $str == mb_convert_encoding($str, $charset, $charset) ){
			return $charset;
		}
	}
	return $charset;
}

参考URL

https://www.webopixel.net/wordpress/637.html

プラグインでデータベーステーブルを作る

Import CSV file to MySQL from custom plugin in WordPress