ワードプレスで作った決済機能付き会員サイトで、決済後に会員ステータスを変更して権限レベルを上げるプログラムを考えました。
機能概要
・登録時は購読者で登録
・月額費用の決済が完了した会員の権限をアップして編集者や投稿者に
<?//DB情報
$dsn='mysql:host=ホスト名;dbname=データベース名;charset=utf8';
$user='ユーザー名';
$password='パスワード';
//ログインユーザー情報取得
$userinfo = wp_get_current_user();
$user_id = $userinfo->ID;//ログインしているユーザーIDを取得
try{
$pdo = new PDO($dsn,$user,$password,[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);//dbに接続する
$sql1 = "SELECT `umeta_id` FROM `wp_usermeta` WHERE (`user_id`= ? AND `meta_key`LIKE 'wp_capabilities')";//wp_capabilitiesと同位置レコードのumeta_idを取得
$stmt = $pdo->prepare($sql1);
$stmt->bindValue(1,$user_id);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e){
echo '接続失敗'. $e->getMessage();
exit();
};
foreach ($result as $row);
$umeta_id =$row['umeta_id'];
$umeta_id1 = $row['umeta_id'] + 1;
try{
//$wp_capabilities = 'a:1:{s:11:"contributor";s:1:"1";}';//寄稿者
$wp_capabilities = 'a:1:{s:6:"author";b:1;}';//投稿者
//$wp_capabilities = 'a:1:{s:6:"editor";b:1;}';//編集者
$pdo = new PDO($dsn,$user,$password,[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);//dbに接続する
$sql2 = "UPDATE `tomoki0607_wp2`. `wp_usermeta` SET `meta_value` = ? WHERE `wp_usermeta`.`umeta_id` = ?;";//編集者に変更
$stmt2 = $pdo->prepare($sql2);
$stmt2->bindValue(1,$wp_capabilities);
$stmt2->bindValue(2,$umeta_id);
$stmt2->execute();
$sql3 = "UPDATE `tomoki0607_wp2`.`wp_usermeta` SET `meta_value` = '4' WHERE `wp_usermeta`.`umeta_id` = ?;";//編集者IDに変更
$stmt3 = $pdo->prepare($sql3);
$stmt3->bindValue(1,$umeta_id1);
$stmt3->execute();
} catch(PDOException $e){
echo '接続失敗'. $e->getMessage();
exit();
};
?>
部分解説①
try{
$pdo = new PDO($dsn,$user,$password,[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);//dbに接続する
$sql1 = "SELECT `umeta_id` FROM `wp_usermeta` WHERE (`user_id`= ? AND `meta_key`LIKE 'wp_capabilities')";//wp_capabilitiesと同位置レコードのumeta_idを取得
$stmt = $pdo->prepare($sql1);
$stmt->bindValue(1,$user_id);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e){
echo '接続失敗'. $e->getMessage();
exit();
};
ワードプレスのDBの構造上、権限を変更するにはwp_usermetaテーブル内の値を変更する必要があります。
具体的にはwp_capabilitiesとwp_user_levelの同位置レコード、meta_valueの値をそれぞれ変更すると権限の変更が完了。
ということでまずはumeta_idを取得する必要があります。
※umeta_idを取得できればどんなSQL文でもOK
部分解説②
foreach ($result as $row);
$umeta_id =$row['umeta_id'];
$umeta_id1 = $row['umeta_id'] + 1;
endforeach;
wp_capabilitiesと同位置レコードのumeta_idは既に取得しました。
$umeta_idに格納。
+1することで、wp_user_levelと同位置レコードのumeta_idになります。
+1したものを$umeta_id1に格納。
部分解説③
//$wp_capabilities = 'a:1:{s:11:"contributor";s:1:"1";}';//寄稿者
$wp_capabilities = 'a:1:{s:6:"author";b:1;}';//投稿者
//$wp_capabilities = 'a:1:{s:6:"editor";b:1;}';//編集者
$pdo = new PDO($dsn,$user,$password,[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);//dbに接続する
$sql2 = "UPDATE `tomoki0607_wp2`. `wp_usermeta` SET `meta_value` = ? WHERE `wp_usermeta`.`umeta_id` = ?;";//編集者に変更
$stmt2 = $pdo->prepare($sql2);
$stmt2->bindValue(1,$wp_capabilities);
$stmt2->bindValue(2,$umeta_id);
$stmt2->execute();
取得したumeta_idと同位置レコードのmeta_valueを変更。
具体的にはwp_capabilitiesと同位置レコードのmeta_valueです。
a:1:{s:10:"subscriber";b:1;} → 'a:1:{s:6:"author";b:1;}'
部分解説④
$sql3 = "UPDATE `tomoki0607_wp2`.`wp_usermeta` SET `meta_value` = '4' WHERE `wp_usermeta`.`umeta_id` = ?;";//編集者IDに変更
$stmt3 = $pdo->prepare($sql3);
$stmt3->bindValue(1,$umeta_id1);
$stmt3->execute();
取得したumeta_idに+1した位置レコードのmeta_valueを変更。
具体的にはwp_user_levelと同位置レコードのmeta_valueです。
以上のように編集者権限の変更はwp_capabilitiesとwp_user_levelを変更することで完了します。