WordPressプラグインの作成中です。
そして、DBに作成したデータを登録する処理を作成しようとしています。
$wpdb
このオブジェクトを使用してやると、自力でDBコネクションとかトランザクションの管理をしなくて良いです。
そーゆーフレームワークがWordPressです。つまり、WordPressでDBアクセスオブジェクトを用意しているという事です。
そんなわけで、使い方です。
$wpdbの使い方
参考サイト:WordPress Codex(日本語)
ここのページによると、global $wpdb
と宣言してから使用しましょうとあります。
しかし、プラグインで使用するときはイベントで起動するfunctionにて宣言する必要があります。
詳細はこちらのページに記載しました。
実装サンプル
リクエストの送信はJSで非同期に送信します。
// 作成したフォームを出力する
function outputForm() {
if (isCreated == false) {
alert("Please create form ");
}
let dom = document.getElementById("result");
if (dom == null || typeof dom == 'undefined') {
alert("Error");
return;
}
let question = document.getElementById("question").innerText;
let inputs = dom.getElementsByTagName("button");
let ansArray = [];
let htmlClass = document.getElementById("insertPos").value;
let htmlStyle = "";
for (let i = 0; i < inputs.length; i++) {
ansArray.push(inputs[i].innerText);
}
// 送信するデータ(リクエストパラメータ)
let data = createSendData(question, ansArray, htmlClass, htmlStyle);
// DBへデータの登録(汎用的に作成したメソッドなので後ろの引数は全てnullにしている)
// 下のメソッドは次のように書いても良い(JSの場合) => createXHR("POST", stateChangeMethod);
let xhr = createXHR(stateChangeMethod, null, null);
// JSONで送信する
xhr.open("POST", '');
xhr.setRequestHeader("Content-Type", "application/json");
xhr.send(JSON.stringify(data));
}
そして、送信するJSONを作成するのに下のメソッドで作成しました。
function createSendData(question, ansArray, htmlClass, htmlStyle) {
let obj = {};
obj.question = question;
for (let i = 0; i < ansArray.length; i++) {
obj["ans" + i] = ansArray[i];
}
obj.hrml_class = htmlClass;
// 未使用
obj.html_style = "";
return obj;
}
大まかにこのような実装です。
サーバーサイド
phpで実装しているものです。
// JSONリクエストを受け取る
$json = file_get_contents('php://input');
$data = json_decode($json);
// (プラグインフォルダにあるので)WordPressはすでに読み込まれている
$vals = json_decode($json, true);
// JSONプロパティの値を取得する
$insertSQL = "insert into questionary('question', 'answer1', 'answer2', 'answer3', 'answer4', 'answer5', 'hrml_class', 'html_style') values (";
$array = get_object_vars($data);
$keys = array('question', 'ans0', 'ans1', 'ans2', 'ans3', 'ans4', 'hrml_class', 'html_style');
for($count = 0; $count < 8; $count++) {
if (array_key_exists($keys[$count], $array)) {
$dd = $array[$keys[$count]];
} else {
$dd = "";
}
if ($dd != "") {
$insertSQL .= "'" . $dd . "',";
} else {
$insertSQL .= "'',";
}
}
// $insertSQL .= "'" . $vals['htmlClass'] . "','" . $vals['htmlStyle'] . "'";
$insertSQL = substr($insertSQL, 0, -1);
$insertSQL .= ");";
global $wpdb;
$wpdb->query($insertSQL);
wpdbではinsertとかselectなどSQLを組まなくても実行できるようにできていますが、自分はSQLでやったほうが楽だったのでSQLを使用しました。
したがって、使用するメソッドは「query」のみになりました(笑)
wpdbの関数リファレンス
早速エラー!
上のコードで、SQLを実行してもデータが登録できませんでした。
なので下のようなコードでエラーを出力します。
echo $wpdb->last_error;
関数ではないので注意です。
そして出力されたエラーは「SQL間違っているよ」でした。
結局できたのは下のようなコードでした。
// 宣言しないと落ちる
global $wpdb;
// テーブルを作成する(ヒアドキュメントはタブが入流ので)
$sql = <<<EOM
CREATE TABLE IF NOT EXISTS MYSQL.QUESTIONARY(
question_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
question varchar(60),
answer1 varchar(60),
answer2 varchar(60),
answer3 varchar(60),
answer4 varchar(60),
answer5 varchar(60),
hrml_class varchar(15),
html_style varchar(15),
click_count bigint NOT NULL DEFAULT 0);
EOM;
$wpdb->query( $sql );
// Footerの文言削除
add_filter('admin_footer_text', '__return_empty_string');
// 画面作成用のPHPファイルを読み込みます。
require_once(plugin_dir_path( __FILE__ ) . '/manage.php');
}
ポイント
- 登録時にデータを投入しないカラム「click_count」に関して、CREATE TABLE時に「DEFAULT」を定義していないとエラーになる。
- PHPではエラーを意図的に出力する必要がある。
以上のところでした。
// 宣言しないと落ちる
global $wpdb;
// テーブルを作成する(ヒアドキュメントはタブが入流ので)
$sql = <<<EOM
CREATE TABLE IF NOT EXISTS MYSQL.QUESTIONARY(
question_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
question varchar(60),
answer1 varchar(60),
answer2 varchar(60),
answer3 varchar(60),
answer4 varchar(60),
answer5 varchar(60),
hrml_class varchar(15),
html_style varchar(15),
click_count bigint NOT NULL DEFAULT 0);
EOM;
$wpdb->query( $sql );
// Footerの文言削除
add_filter('admin_footer_text', '__return_empty_string');
// 画面作成用のPHPファイルを読み込みます。
require_once(plugin_dir_path( __FILE__ ) . '/manage.php');
}
でわでわ。。。
関連ページ
- WordPress プラグイン作成〜DBを使用する〜
- PHP PDO 〜MySQLにアクセスする〜
- PHP Ajax 〜DBに登録したデータを受信する〜
- Google Maps API PHP連携 〜マップ情報をDBに登録する〜
- PHP Image File 〜iPhoneやAndroidでの画像送受信の問題〜
- AngularJS Routing 〜PHPをWeb APIにする〜
- WordPress PHPカスタム〜根本的に見た目を変える〜
- WordPress PHPカスタム〜根本的に見た目を変える2〜
- Eclipse PHPプラグイン 〜ElipseでWordPress環境を構築〜
- WordPress テスト実装 〜heade-test.phpを表示〜
- AngularJS + PHP 〜WordPressと連携する〜
- AngularJS + PHP 〜AngularJSの実装〜
- AngularJS + PHP 〜AngularJSの実装2〜
- WordPress 処理解析 ~index.phpを眺める~
- WordPress Plugin NewStatPress ~アクセス解析プラグインAPIを使う~
- WordPress 処理解析 ~ログイン処理を調べる~
- WordPressカスタム〜アンケートボタンを追加する(設計)〜
- WordPressカスタム〜プラグインの作成〜
- WordPressカスタム〜ダッシュボードのプラグイン画面作成〜
- WordPressカスタム〜ダッシュボードのプラグイン画面作成2〜
- WordPressカスタム〜ダッシュボードのプラグイン画面作成3〜
- WordPress プラグイン作成〜アンケート作成プラグインを作る〜