- ベストアンサー
WordPressの独自テーブルへの入力フォーム作成方法
- WordPressのデータベースに独自のテーブル(wp_abc)を作成し、データを入力するフォームを作成する方法を解説します。
- 通常のSQLデータベースへのデータ入力と同様に、WordPressの独自テーブルにデータを入力するには、フォームを作成し、入力されたデータを処理する必要があります。
- フォームの作成にはHTMLのform要素を使用し、データ処理にはPHPのコードを使用します。詳細な手順とコードサンプルを提供します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
クラスオブジェクトを渡す方法はなさそうでした。 すでにご存じかも知れませんが、こちらにいろいろな使い方の情報がありました。 http://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpdb_Class INSERTはこのような書き方ができるようです。 $wpdb->insert($wpdb->abc, ['name' => $name, 'address' => $address], ['%s', '%s']); SQL文を記述するより、簡単で、間違いが減り、安全そうです。 第2引数のデータ配列を簡単に生成できるといいのですが、そこまでの情報はここにはなかったです。 もし、するとしたら、私にはこれぐらいしか発想がありませんが、項目が多い場合は少しは楽になると思います。 $fields = ['name', 'address']; $data = create_data($fields); $wpdb->insert($wpdb->abc, $data); function create_data($fields) { $data = []; foreach ($fields as $field) { $data[$field] = $_POST[$field]; } return $data; } 第3引数は省略しました。 データ型が文字列か数値かに関係することなのですが、省略すると文字列扱いとなり''で括られる仕組みのようです。 MySQLは数値に対して''で括ってもエラーにはならないのでいいかなと思います。 ただし、その値が文字だと「0」としてデータが登録されてしまうので、数値項目は、名前未入力と同様に先にチェックする必要があります。 WordPressに詳しい方からのアドバイスがあるといいのですが、私がPHPとMySQLの知識だけで出しゃばってしまったので、他の人が質問を見てくれなくなっていたらすみません。 先の「WordPress Codex」サイトにはあらゆる情報がありそうなので参考にしつつ、他でも検索しつつ、目的の達成を目指してください。 もちろんOKWAVEも頼りにされて。
その他の回答 (4)
- dell_OK
- ベストアンサー率13% (766/5720)
ちょっとわかりました。 「$wpdb->xdr」はテーブル名になるのですね。 「wp-db.php」の「$tables」に「abc」を追加すると使えました。 私のだと、こんな風にテーブル名を記述できるようになると。 $rows = $wpdb->get_results("SELECT * FROM $wpdb->abc"); $wpdb->query("INSERT INTO $wpdb->abc(name,address) VALUES('$name','$address')"); 想像ですが、INSERTは「$wpdb->query」関数ではなくて、クラスオブジェクトを渡す方法が用意されているような気がしています。 項目が2つ3つだとこれでもいいような気がしますが、項目が増えてきた時とか、画面の項目を一括で転送できるような仕組みが用意されているような気がするので、もしかしたら、と言う期待です。 今日は時間がないので、明日にでも調べてみます。
- dell_OK
- ベストアンサー率13% (766/5720)
insert.phpの追加処理が「$pdo」のままになっていました。 「$wpdb」が正しいです。 $wpdb->query("INSERT INTO wp_abc(name,address) VALUES('$name','$address')");
- dell_OK
- ベストアンサー率13% (766/5720)
思い違いしてました。 私が"insert"を"input"に見間違えたようで、"insert.php"でよかったです。 惑わせてすみませんでした。 1の修正はなしにしておいてください。 「global $wpdb;」についてですが、試しにWordPressをインストールして、どのようなものか確認してみました。 なるほど、便利なところがたくさんありそうです。 質問者様がWordPress標準のもの以外を、どのようなフォルダとファイル構成にしていたり、また、どのようなコード構成にしているわからないので、正確、また、いいアドバイスではないかも知れませんが、少しだけ話しておきます。 まず、先ほどのコードのような作りだけで言うと、「$wpdb」はグローバルにする必要はありません。 自前の関数内で使う場合にだけグローバルで参照してください。 また、自前の接続「connect」関数をまったく同じまま複数のファイルに書くのはよくないので「$wpdb」を利用するのが正解だと思います。 「$wpdb->get_results」関数は結果をクラスオブジェクトの配列で返してくれるので、列はプロパティ「->」のように参照できるし、「$row["name"]」と書くより「$row->name」となってすっきりしていいと思います。 「$wpdb->xdr」は初登場なのでちょっとわかりかねますが、先ほどのコードを私が試したコードにしてみるとこんな感じになりました。 私の環境の都合でもろもろ変更点があります。 ●管理画面(index.php) <?php require __DIR__.'/wp-load.php'; $rows = $wpdb->get_results('SELECT * FROM wp_abc'); ?> <!DOCTYPE html> <html lang="jp"> <head> <meta charset="UTF-8"> <title>管理</title> </head> <body> <!-- 勝手に入力画面へのリンクを追加しました --> <a href="insert.php">追加</a> <?php foreach ($rows as $row) { ?> <table> <tr> <th>名前</th> <td><?php echo $row->name; ?> </td> </tr> <tr> <th>住所</th> <td><?php echo $row->address; ?> </td> </tr> </table> <?php }?> </body> </html> ●入力画面(insert.php) <?php require __DIR__.'/wp-load.php'; $error = $name = ''; if (isset($_POST['submit'])) { $name = $_POST['name']; $address = $_POST['address']; if (!$name) { $error .= '名前が入力されていません。<br>'; } if (!$error) { $pdo->query("INSERT INTO wp_abc(name,address) VALUES('$name','$address')"); header('Location: index.php'); exit(); } } else { $address = ''; } ?> <!DOCTYPE html> <html lang="jp"> <head> <meta charset="UTF-8"> <title>入力</title> </head> <body> <?php if ($error) {?> <span class="error"><?=$error; ?></span> <?php }?> <form action="insert.php" method="post"> <table> <tr> <th>名前</th> <td><INPUT type="text" name="name" value="<?php echo $name; ?>"></td> <th>住所</th> <td><INPUT type="text" name="address" value="<?php echo $address; ?>"></td> </tr> </table> <p><input class="submit" type="submit" name="submit" value="登録"></p> </form> </body> </html>
- dell_OK
- ベストアンサー率13% (766/5720)
input.phpに2つ気になる点があるので直してみて試してみてください。 1.自分自身へ送信する "insert.php"はこの質問のどこにも登場していないし、データ追加のSQL処理が自分自身にあるので、たぶん"input.php"が正しい。 <form action="input.php" method="post"> 2.テーブル名誤り wp_abcが正しい。 $pdo->query("INSERT INTO wp_abc(name,address) VALUES('$name','$address')");
補足
dell_OK様 ご回答ありがとうございました。 何か根本的な間違いがあるようで、そもそもinput.phpのファイルが開けませんでした。(HTTP ERROR 500) これはinsert.phpの時からです。 <?php global $wpdb; $rows = $wpdb->get_results("SELECT * FROM $wpdb->xdr"); foreach ($rows as $row) {?> の部分を global $wpdb; に変更して、後のコードもそれに準じたコードにした方がよいのでしょうか? 方向を変えていろいろと試してみます。 何かアドバイスがありましたら、よろしくお願いします。 (真っ暗闇の中、歩いてるみたいです(´_`。)
お礼
いろいろとアドバイス頂き、ありがとうございました。 こちらの質問の中にコードの誤り(abc=xdr)があったり、またWordPressをダウンロードしていただくというような手間をおかけして申し訳ありませんでした。 今回は一応ここで打ち切らせて頂き、もう少し先に進んでから改めてOKWAVEに質問を投稿します。 また、紹介いただいた「WordPress Codex」も参考にさせて頂きます。 繰り返しになりますが、改めてOKWAVEに質問を投稿しますので、その際はよろしくお願いします!