wordpressからデータベースへ保存と書き込みをする方法

wordpressでデータベースとやりとりするには、wordpressに内包されているwpdbというクラスを使います。このクラスはインスタンス化されていますので、利用するにはグローバル変数として$wpdbを設定し、宣言する必要があります。このクラスに内包される関数(メソッド)には、「get_var」「get_row」「get_col」「get_results」「insert」「replace」「update」「delete」「query」「prepare」「get_col_info」「flush」といったものがあります。

wordpressのwpdbクラスメソッド

以下のメソッドはアロー演算子につなげて使います。

get_var

wordpressのデータベースから変数を一つだけ返しますが、マッチしなければNullを返します。結果が記憶されるため、再利用することが可能です。

get_row

wordpressのデータベースから行全体を、オブジェクトか連想配列、インデックス配列として返します。マッチしなければNullを返します。複数あれば指定された行のみとなります。

get_col

wordpressのデータベースから列を一次元配列で取り出せます。複数あれば指定された列のみ取り出せます。マッチしなければNullを出力。

get_results

wordpressのデータベースから複数行の結果全体を配列として返します。配列の型にはオブジェクト、連想配列、インデックス配列のどれか一つを設定できます。後述するプラグインではこのメソッドを使ってデータベース内から情報を取り出しています。また、ヒットしないか、データベースにエラーが生じたときは、空の配列を返します。

insertinsert

wordpressのデータベースのテーブルへ行を追加します。

replace

wordpressのデータベースのテーブルの行に指定した行があれば置換します。それが存在しなければ新規にテーブルを入れます。

update

ワードプレスのデータベースのテーブル内の行を更新。

delete

ワードプレスのデータベースのテーブルの行を削除します。

query

WordPressのデータベースに対して任意のSQLクエリが実行できます

prepare

SQLのエスケープをし、やりとりされるデータをSQLインジェクション攻撃から守ります。

get_col_info

最後に行われた結果の列に対するデータを取り出せます。列を指定しますが、指定していない時は結果に含まれる列の全情報を配列として取得できます。

flush

SQLの結果のキャッシュを削除します。

wordpressからデータベースへ書込むプラグイン

このデータベースに情報を保存するプラグインは、有効化するとデータベースにテーブルを作成し、削除するとデータベース内のテーブルとオプション設定も一緒に削除します。いわゆる残骸処理をしています。

また、このプラグインはワードプレスの管理画面からデータベースへデータを保存し、テーブル内のデータを出力するだけの単純なプログラムです。保存したデータを取り出して何かをするには、このプラグインに新たなコードを追記するか、これとは別のプラグインを作成する必要があります。

その場合、get_resultsが役立つかも知れません。このメソッドはワードプレスのデータベース内から情報を配列として丸ごと取り出せるからです。

<?php
/*
Plugin Name: AA_DataBase
*/
class Management {
function __construct() {
add_action('network_admin_menu',[$this, 'ManagementScreen']);
add_action('admin_menu', [$this, 'ManagementScreen']);
}
public function ManagementScreen() {
add_menu_page('AADB','AADB', 'level_8', __FILE__, [$this, 'Management_menu'], '', 101);
}
public function Management_menu() {
global $wpdb;
$table="";
// データベース管理メニューをクリックした際に表示されるコンテンツ
$nt2=$nt=preg_replace('/\/$/', '', network_home_url('','https'));
$nt=$nt.$_SERVER['REQUEST_URI'];
$MaintenanceOBJ =new DataBase_wordpress;
$this->TableName = $wpdb->prefix ."AA_DataBase";
$row_record_all = $wpdb->get_results("SELECT name,wptxt FROM $this->TableName", ARRAY_A);
$esc="htmlspecialchars";
if(empty($_POST['slug'])){$_POST['slug']="";}
if(empty($_POST['wtxt'])){$_POST['wtxt']="";}
$row_record_all=array_reverse($row_record_all);
foreach($row_record_all as $key => $val){
$td="";
foreach($val as $key2=>$val2){
$td .='<td>'.$key2.'</td><td>'.$val2.'</td>';
}
$table .='<tr>'.$td.'</tr>';
}
echo <<< EOM
<div style="text-align:center;margin-top:100px;">
<form action="{$nt}" method="post">
name<input type="text" size="10" name="slug" value="{$esc($_POST['slug'])}" /> wptxt<input type="text" size="40" name="wtxt" value="{$esc($_POST['wtxt'])}" /> <input type="submit" value="変更と追加" /></form>
<table style="margin:0 auto;width:500px;">{$table}</table>
</form>
</div>
EOM;
}
}
new Management;
new DataBase_wordpress;
class DataBase_wordpress {
function __construct(){
global $wpdb,$slug;
$this->TableName = $wpdb->prefix ."AA_DataBase";
register_uninstall_hook (__FILE__,['DataBase_wordpress','plugin_delete']);
if($wpdb->get_var("SHOW TABLES LIKE '$this->TableName'") !== $this->TableName) {
register_activation_hook (__FILE__,[$this,'Activation']);
}else{
$this->AlreadyActivated_wordpress();
}
update_option( 'AADB', '1.0' );
}
public function Activation(){
global $wpdb;
$sql = "CREATE TABLE " . $this->TableName . " (
name int NOT NULL,
wptxt text NOT NULL,
UNIQUE (name)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
$wpdb->insert( $this->TableName,['name' => '1', 'wptxt' => 'off',]);
}
public function AlreadyActivated_wordpress() {
global $wpdb;
$slug=$wp_text="";
if(!empty($_POST['slug'])){$slug=$_POST['slug']=preg_replace('/[\"\']/', '', $_POST['slug']);}
if(!empty($_POST['wtxt'])){$wp_text=$_POST['wtxt']=preg_replace('/[\"\']/', '', $_POST['wtxt']);}
$this->TableName = $wpdb->prefix ."AA_DataBase";
$id_slug = $wpdb->get_var($wpdb->prepare("SELECT name FROM ". $this->TableName ." WHERE name = %s", $slug));
$row_record = $wpdb->get_row("SELECT name,wptxt FROM $this->TableName WHERE name = $slug");
if(empty($_POST['wtxt'])){if(!empty($row_record->wptxt)){$wp_text = $row_record->wptxt;}}
if($slug >= 1 && !empty($wp_text)){
if ($id_slug) {
$wpdb->update( $this->TableName,['wptxt' => $wp_text,],['name' => $slug]);
} else {
$sql = "CREATE TABLE " . $this->TableName . " (
// PRIMARY KEYの前に半角スペースを二つ入れる
name int PRIMARY KEY NOT NULL,
wptxt text NOT NULL
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
$wpdb->insert( $this->TableName,['name' => $slug, 'wptxt' => $wp_text,]);
}
}
}
public function plugin_delete(){
global $wpdb;
delete_option('AADB');
$sql = "DROP TABLE ".$wpdb->prefix ."AA_DataBase";
$wpdb->query($sql);
}
}
?>

まとめ

ワープレとデータベースを対話させるプラグイン、いかがでしたでしょうか。ワープレを普通に使っているとあまり意識しないと思いますが、基本的にはこういったやりとりをワープレは自動でやっています。しかしそれは、あくまで自動であるため、利用者が直接弄ることはほとんどありません。ただ、こういったやり方を覚えると、ワープレを活用する幅がかなり拡大することと思います。