オリジナルプラグイン

ワードプレスデータベースのデータのPHPでの取得と編集※プラグインの有効化・無効化の方法。

ワードプレスデータベースのデータの取得と編集の方法をプラグインの有効化・無効化を行うプラグインの制作を通じて解説します。


ワードプレスのデータベースの構造

ワードプレスに限らずですが、MySQLは、表型データになっています。

phpmyadmin で1つのデータベースに入っているテーブルを見てみます。

テーブル名 sprowp2_usermeta からはじまって テーブル名 wp3_users まで合計14個のテーブルが表示されています。

1つのテーブルの中を見てみます。
sprowp2_actionscheduler_actions のテーブルの中身です。

縦方方向がROW(行)と呼ばれ、横方向がCOLUM(桁、カラム)と呼ばれます。
縦横の表になっているのがわかります。


ワードプレスのデータベースの値の取り出し

データベースからの値の取り出し(取得)は、以下のようにします。

0001 /********************************************************/
0002 function set_plugin_yuzu_get_active_plugin($cmd='active_plugins')
0003 /********************************************************/
0004 {
0005  global $table_prefix;
0006  global $wpdb;
0007  $db_name = DB_NAME;  //データベース名の取得
0008  $db_user = DB_USER;  //データベース接続ユーザーの取得
0009  $db_pass = DB_PASSWORD; //データベース接続用パスワードの取得
0010  $db_host = DB_HOST;  //データベースホストの取得
0011  $db_pfix = $table_prefix;  //データベースホストの取得
0012  
0013  $link = mysqli_connect($db_host, $db_user, $db_pass,$db_name);
0014  if (!$link) {
0015   return('');
0016  }
0017  //
0018  // 一部のプラグインを無効化するには、無効化したいプラグイン名(PATH付き)を
0019  // active plugins の n 番目かを検索。そのプラグインの行を消す。
0020  // ["option_value"]=>
0021  // a:6:{
0022  //  i:0;s:57:"all-in-one-wp-migration-4g/all-in-one-wp-migration-4g.php";
0023  //  i:1;s:33:"classic-editor/classic-editor.php";
0024  //  i:2;s:35:"classic-widgets/classic-widgets.php";
0025  //  i:3;s:41:"dashboardmemo_yuzu/dashboardmemo_yuzu.php";
0026  //  i:4;s:39:"wp_migration_yuzu/wp_migration_yuzu.php";
0027  //  i:5;s:39:"wp_uninstall_yuzu/wp_uninstall_yuzu.php";
0028  // }"
0029  //
0030  //
0031  $stack = array();
0032  // データ処理
0033  if($cmd == 'active_plugins'){
0034   $sql = "SELECT ";
0035   $sql.= "* ";
0036   $sql.= "FROM ";
0037   $sql.= $db_pfix."options ";
0038   $sql.= "WHERE ";
0039   $sql.= "option_name = 'active_plugins'";
0040   $sql.= ";";
0041   if( $rows = mysqli_query($link, $sql) ){
0042    foreach($rows as $row){
0043     $value = maybe_unserialize( $row['option_value'] );
0044     if(is_array($value)){
0045      foreach($value as $val){
0046       $stack[] = $val;
0047      }
0048     }
0049    }
0050   }
0051  }
0052  mysqli_close($link);
0053  return($stack);
0054 }


これは、ワードプレスの 有効化されているプラグインの一覧を取得するモジュールです。

ワードプレスのデータベースへの接続

最初にデータベースに接続しています。
0001  global $table_prefix;
0002  global $wpdb;
0003  $db_name = DB_NAME; //データベース名の取得
0004  $db_user = DB_USER; //データベース接続ユーザーの取得
0005  $db_pass = DB_PASSWORD; //データベース接続用パスワードの取得
0006  $db_host = DB_HOST; //データベースホストの取得
0007  $db_pfix = $table_prefix; //データベースホストの取得
0008  
0009  $link = mysqli_connect($db_host, $db_user, $db_pass,$db_name);
0010  if (!$link) {
0011   return('');
0012  }
これは、ワードプレスの中なのでデータベースの情報が defineされています。
ワードプレスの外のモジュールからワードプレスのデータベースの情報を取得する際には、以下のように

0001  require_once($_SERVER['DOCUMENT_ROOT']. '/wp-load.php');

wp-load.phpを読み込むことで使用できるようになります。


ワードプレスのデータベースのテーブル内のデータの取得

ワードプレスのデータベースのテーブル内のデータの取得は、SQLと呼ばれる言語で行います。

データの取得のSQLの書式
SELECT * FROM データベーステーブル名 WHERE ROW名(行名) = ‘ROW名(行名)‘;
これで1つのテーブルの中の行を取り出すことができます。
サンプルでいえば、
0001   $sql = "SELECT ";
0002   $sql.= "* ";
0003   $sql.= "FROM ";
0004   $sql.= $db_pfix."options ";
0005   $sql.= "WHERE ";
0006   $sql.= "option_name = 'active_plugins'";
0007   $sql.= ";";
0008   if( $rows = mysqli_query($link, $sql) ){ // ← SQLの実行 結果を $rows で受け取っている

4行目で該当するワードプレスの「テーブルプレフィックス」を指定しています。
アクティブなプラグインは、(テーブルプレフィックス)+’options’ というテーブルの中の option_name という行の中の active_plugins という列(カラム)に配列データで入っています。


配列は、シリアライズしてありますので、取り出してアンシリアライズして配列に戻します。

シリアライズの構造
例えば、

$ary = array(“a”,”bc”,”abc”);

の時、この $ary という配列をシリアライズすると

a:3:{ ←配列は全部で3個だよ
i:0;  ←配列1個目のデータだよ
s:1:  ←文字型で1文字あるよ
“a”;  ←中身は、a だよ
i:1;  ←配列2個目のデータだよ
s:2:  ←文字型で2文字あるよ
“bc”;  ←中身は、bc だよ
i:2;  ←配列3個目のデータだよ
s:3:  ←文字型で3文字あるよ
“abc”;  ←中身は、abc だよ
}

これが1行になっています。
a:3:{i:0;s:1;”a”;i:1;s2:”bc”;i:2;s:3:”abc”}

これをアンシリアライズすると
array(“a”,”bc”,”abc”);

つまり、

$ary[0] = “a”;
$ary[1] = “bc”;
$ary[2] = “abc”;

となります。

シリアライズコマンドは、
$a = serialize(配列);

アンシリアライズは、
$b = maybe_unserialize( $a );

$a は文字列、$b は、配列になります。

ワードプレスのデータベースの行の取り出し

テーブルから該当する行を取り出しました。

この部分ですね。
0001 if( $rows = mysqli_query($link, $sql) ){

$rows に該当する行が配列で取り出されています。
※プレフィックス+options の中の option_name が active_plugins の行は1つしかないんですけどね

それを順次取り出して(順次といっても1行しかないんですけどね)、該当する列(カラム)の値を取り出しています。
0001    foreach($rows as $row){
0002     $value = maybe_unserialize( $row['option_value'] ); // ← option_value という行を取り出している。
0003     if(is_array($value)){ // ← option_value は行。そして行の中には列が複数個入っているはずなので「配列ですよね?」と確認している。
0004      foreach($value as $val){ // ← 複数個入っている列を順番に取り出して $stack に入れている
0005       $stack[] = $val;
0006      }
0007     }
0008    }


以下の構造を配列になおすと(アンシリアライズ)
0001  // [“option_value”]=>
0002  // a:6:{
0003  //  i:0;s:57:”all-in-one-wp-migration-4g/all-in-one-wp-migration-4g.php”;
0004  //  i:1;s:33:”classic-editor/classic-editor.php”;
0005  //  i:2;s:35:”classic-widgets/classic-widgets.php”;
0006  //  i:3;s:41:”dashboardmemo_yuzu/dashboardmemo_yuzu.php”;
0007  //  i:4;s:39:”wp_migration_yuzu/wp_migration_yuzu.php”;
0008  //  i:5;s:39:”wp_uninstall_yuzu/wp_uninstall_yuzu.php”;
0009  // }”

以下のような2次元配列になります。
$array[“option_value”][0] = “all-in-one-wp-migration-4g/all-in-one-wp-migration-4g.php”;
$array[“option_value”][1] = “classic-editor/classic-editor.php”;
$array[“option_value”][2] = “classic-widgets/classic-widgets.php”;
$array[“option_value”][3] = “dashboardmemo_yuzu/dashboardmemo_yuzu.php”;
$array[“option_value”][4] = “wp_migration_yuzu/wp_migration_yuzu.php”;
$array[“option_value”][5] = “wp_uninstall_yuzu/wp_uninstall_yuzu.php”;


プラグインの有効化・無効化設定

プラグインを有効化・無効化させるためには、有効化・無効化のチェックボックスとプラグイン名を表示します。

プラグインリストの取得

プラグインフォルダーの中のプラグイン名をとりだし、active_plugins の中にあるか確認します。
actie_plugins の中にあれば、有効化されている。なければ、無効化されていることになります。

以下は、プラグインリストを取り出すモジュールです。
0001 /********************************************************/
0002 function set_plugin_yuzu_get_plugin_list()
0003 /********************************************************/
0004 {
0005  //
0006  // --- Wp Plugin 以外で使うとき ---
0007  // require_once($_SERVER['DOCUMENT_ROOT']. '/wp-load.php');
0008  // require_once($_SERVER['DOCUMENT_ROOT']. '/wp-includes/default-constants.php');
0009  // include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
0010  //---------------------------------
0011  // $plugins の中身
0012  // ["set_plugin/set_plugin.php"]=> ← この部分が $pathになる。active-plugins に登録してある $path は、これにあたる
0013  //  array(15) {
0014  //   ["Name"]=>
0015  //   string(31) "ゆずまるのPLUGIN ひな形"
0016  //   ["PluginURI"]=>
0017  //   string(0) ""
0018  //   ["Version"]=>
0019  //   string(7) "2.40531"
0020  //   ["Description"]=>
0021  //   string(51) "set_plugin_yuzu を XXXX_yuzu に置換して使う"
0022  //   ["Author"]=>
0023  //   string(8) "yuzumaru"
0024  //   ["AuthorURI"]=>
0025  //   string(0) ""
0026  //   ["TextDomain"]=>
0027  //   string(10) "set_plugin"
0028  //   ["DomainPath"]=>
0029  //   string(0) ""
0030  //   ["Network"]=>
0031  //   bool(false)
0032  //   ["RequiresWP"]=>
0033  //   string(0) ""
0034  //   ["RequiresPHP"]=>
0035  //   string(0) ""
0036  //   ["UpdateURI"]=>
0037  //   string(0) ""
0038  //   ["RequiresPlugins"]=>
0039  //   string(0) ""
0040  //   ["Title"]=>
0041  //   string(31) "ゆずまるのPLUGIN ひな形"
0042  //   ["AuthorName"]=>
0043  //   string(8) "yuzumaru"
0044  //   }
0045  //---------------------------------
0046  // $plugin の中身
0047  // array(15) {
0048  //  ["Name"]   =>"ゆずまるのPLUGIN ひな形"
0049  //  ["PluginURI"]  =>""
0050  //  ["Version"]   =>"2.40531"
0051  //  ["Description"]  =>"set_plugin_yuzu を XXXX_yuzu に置換して使う"
0052  //  ["Author"]   =>"yuzumaru"
0053  //  ["AuthorURI"]  =>""
0054  //  ["TextDomain"]  =>"set_plugin"
0055  //  ["DomainPath"]  =>""
0056  //  ["Network"]   =>bool(false)
0057  //  ["RequiresWP"]  =>""
0058  //  ["RequiresPHP"]  =>""
0059  //  ["UpdateURI"]  =>""
0060  //  ["RequiresPlugins"] =>""
0061  //  ["Title"]   =>"ゆずまるのPLUGIN ひな形"
0062  //  ["AuthorName"]  =>"yuzumaru"
0063  // }
0064  //
0065  $active_plugins = set_plugin_yuzu_get_active_plugin();
0066  //
0067  $stack = array();
0068  $plugins = get_plugins();
0069  if (!empty($plugins)) {
0070   $rows = '';
0071   foreach ($plugins as $path => $plugin){
0072    // pulugin path は、アクティブか?
0073    if( in_array($path,$active_plugins) ){ // べた書き
0074    //if (is_plugin_active( $path )) { // wordpress 内関数
0075     $stack[] = $plugin['Name'].'<>'.$path.'<>checked<>';
0076    }else{
0077     $stack[] = $plugin['Name'].'<>'.$path.'<><>';
0078    }
0079   }
0080  }
0081 return($stack);
0082 }

プラグイン名、パス名、有効・無効を配列にして返しています。

この配列を表示させて有効・無効を設定してもらって「更新」してもらったら、有効化を指定されたプラグインの path を配列にして、データベースの (テーブルプレフィックス)+’options’ の ‘active_plugins’ にシリアライズして書き込めばいいわけです。

表示は置いといて、有効化するプラグインパスの配列をデータベースへの書き込むモジュールです。
0001 /********************************************************/
0002 function set_plugin_yuzu_put_active_plugin($plugins=array())
0003 /********************************************************/
0004 {
0005  global $table_prefix;
0006  global $wpdb;
0007  $db_name = DB_NAME; //データベース名の取得
0008  $db_user = DB_USER; //データベース接続ユーザーの取得
0009  $db_pass = DB_PASSWORD; //データベース接続用パスワードの取得
0010  $db_host = DB_HOST; //データベースホストの取得
0011  $db_pfix = $table_prefix; //データベーステーブルプレフィックス
0012  
0013  // ---------------
0014  // データベース接続
0015  // ---------------
0016  $link = mysqli_connect($db_host, $db_user, $db_pass,$db_name);
0017  if (!$link) {
0018   return('');
0019  }
0020  // ---------
0021  // データ処理
0022  // ---------
0023  //
0024  // $plugins は、plugin path の入った配列
0025  //
0026  //  "all-in-one-wp-migration-4g/all-in-one-wp-migration-4g.php";
0027  //  "classic-editor/classic-editor.php";
0028  //  "classic-widgets/classic-widgets.php";
0029  //  "dashboardmemo_yuzu/dashboardmemo_yuzu.php";
0030  //  "wp_migration_yuzu/wp_migration_yuzu.php";
0031  //  "wp_uninstall_yuzu/wp_uninstall_yuzu.php";
0032  //
0033  // 配列は基本 配列をシリアライズして保存
0034  //
0035  $value = serialize( $plugins );
0036  //
0037  // データベースへ書き込む
0038  //
0039  // +-----------+--------------+---------------+----------+
0040  // | option_id | option_name | option_value | autoload |
0041  // +-----------+--------------+---------------+----------+
0042  // | nnnnnnnnn | actve_plugin | a:1:{s:7:"…" | no |
0043  // +-----------+--------------+---------------+----------+
0044  // | nnnnnnnnn | admin_mail | xxxxx@xxx.com | no |
0045  // +-----------+--------------+---------------+----------+
0046  //
0047  // 更新 UPDATE 書式
0048  // UPDATE table_name SET カラム名='値' WHERE カラム名='書き込むカラム名'
0049  //
0050  $sql = "UPDATE ";
0051  $sql.= $table_prefix."options ";
0052  $sql.= "SET ";
0053  $sql.= "option_value = '".$value."' ";
0054  $sql.= "WHERE ";
0055  $sql.= "option_name = 'active_plugins' ";
0056  $sql.= ";";
0057  
0058  $stat = mysqli_query($link, $sql);
0059  mysqli_close($link);
0060  
0061  return($stack);
0062 }

データベースへの書き込み(UPDATE)SQL

データベースへ値を書き込む書式

UPDATE table_name SET カラム名=’値’ WHERE カラム名=’書き込む行名’;

アクティブプラグインは、テーブル名、(テーブルプレフィックス)+’options’ の active_plugins 行 の option_value という列に書き込みます。
なので
UPDATE (テーブルプレフィックス)+’options’ SET option_value=’値’ WHERE option_name=’active_plugins’;

WHEREで行を絞り込むというところを忘れずに。
絞り込まないと全部の行の option_value を同じ値で書き換えてしまいます。
(これがデータベースの怖いところ。)

配列は、シリアライズして書き込み。普通の文字列、数値は、そのまま書き込みます。


ワードプレスデータベースのデータのPHPでの取得と編集※プラグインの有効化・無効化のやり方 まとめ

php でデータベースを扱うには、 SQL文で行います。

読み込みは、SELECT。
書き込みは、UPDATE。
※すでに行や列がある場合。存在していないときは INSERT で行または列を挿入して、そこへ UPDATEします。

一連のソースファイルは、こちらからダウンロードしてください。
set_plugin
※プラグインのオンオフなので自分自身を無効化すると管理画面にもどってこれなくなり再ログインしないといけなくなるので注意してください。

この書き込みがあなたの一助になれば幸いです。
スポンサードリンク

関連記事一覧