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 プラグイン作成〜アンケート作成プラグインを作る〜