WordPressのDB($table_prefix)をURLパラメーターに応じて切り替えたい
WordPressのDB($table_prefix)を特定のURLパラメーターが付いている場合に切り替えて、テーマやページ内容を変える方法をお探しですか?
この記事ではwp-config.phpとfunctions.phpを編集して実現する方法をご紹介します。
目次
切り替えイメージ
A株式会社のサイトからURLパラメーターありでリンクされていて、そこからアクセスされた時にcompany-aテーマに切り替え、それ以外はdefaultテーマでテーブルの接頭辞にwp_を使用している想定でご説明します。
URLパラメーター | テーマとDB($table_prefix) |
---|---|
なし | テーマ:default $table_prefix:wp_ |
?ref=company-a | テーマ:company-a $table_prefix:ca_ |
DB($table_prefix)と記載していますが、実際に切り替えるのはDBそのものではなく、wp-config.phpで設定されている$table_prefixを変えて読み込むDBのテーブルを切り替えます。

テーマの情報はwp_optionsテーブルとca_optionsテーブルに格納されているため、$table_prefixが変わるとテーマも変わります。
設定方法
wp-config.phpと、defaultテーマとcompany-aテーマのfunctions.phpを編集します。
wp-config.php
$table_prefixがある箇所に追記します。
※記載している$table_prefixはサンプルなのでサイトに合わせて書き換えてください。
/**
* WordPress データベーステーブルの接頭辞
*
* それぞれにユニーク (一意) な接頭辞を与えることで一つのデータベースに複数の WordPress を
* インストールすることができます。半角英数字と下線のみを使用してください。
*/
$table_prefix = 'wp_';
$ref = filter_input( INPUT_GET, 'ref' );
// A株式会社の場合
if (
$ref === 'company-a'
|| filter_input( INPUT_COOKIE, 'company_id' ) === 'company-a'
) {
$table_prefix = 'ca_';
}
// A株式会社以外の場合
if (
$ref !== 'company-a'
$ref !== null
&& $ref !== false
) {
$table_prefix = 'wp_';
}
URLに?ref=company-aが付与されている、またはcompany_idという名前のCookieの値がcompany-aの場合に$table_prefixがca_に切り替わります。?ref=がセットされていてcompany-a以外の場合は$table_prefixがwp_に切り替わります。
functions.php(defaultとcompany-a両方)
defaultテーマとcompany-aテーマ両方のfunctions.phpに追記します。
/**
* テーマが読み込まれた時の処理
*/
add_action( 'after_setup_theme', function() {
// 会社情報をCookieに保存
set_cookie_company();
} );
/**
* 会社情報を取得
*
* @return array
*/
function get_company() {
$COMPANY = [
[
'id' => 'company-a',
'ref' => 'company-a',
'name' => 'A株式会社',
],
];
return $COMPANY;
}
/**
* 会社IDを取得
*
* @return string|bool
*/
function get_company_id() {
// 会社情報
$COMPANY = get_company();
// 参照元
$ref = filter_input( INPUT_GET, 'ref' );
// 会社ID
$id = false;
// Cookie名
$cookie_name = 'company_id';
// Cookieに保存されている会社ID
$cookie_company_id = filter_input( INPUT_COOKIE, $cookie_name );
// Cookieに会社IDが保存されていて、かつ会社情報に一致するIDの会社がある場合
if ( $cookie_company_id ) {
foreach ( $COMPANY as $key => $val ) {
if ( $cookie_company_id === $val['id'] ) {
$id = $COMPANY[ $key ]['id'];
break;
}
}
}
// パラメーターで会社が指定されていて、かつ会社情報がある場合
if ( get_company_id_from_params( $ref ) ) {
$id = get_company_id_from_params( $ref );
}
return $id;
}
/**
* 会社情報をCookieに保存
*
* @return string|bool
*/
function set_cookie_company() {
// Cookie名
$cookie_name = 'company_id';
// Cookieに保存されている会社ID
$cookie_company_id = filter_input( INPUT_COOKIE, $cookie_name );
// 会社ID
$id = get_company_id();
if ( $id === false ) {
return false;
}
// 会社IDのCookieの値
$cookie_val = $id;
if ( ! $cookie_company_id || $cookie_company_id !== $cookie_val ) {
setcookie( $cookie_name, $cookie_val, 0, '/' );
}
}
/**
* パラメーターから会社IDを取得
*
* @param array $ref パラメーター
* @return string|bool
*/
function get_company_id_from_params( $ref ) {
if ( empty( $ref ) ) {
return false;
}
// 会社情報
$COMPANY = get_company();
// 会社のキー
$key = array_search( $ref, array_column( $COMPANY, 'ref' ) );
if (
$ref !== null
&& $key !== false
) {
return $COMPANY[ $key ]['id'];
}
return false;
}
functions.php(company-a)
company-aのfunctions.phpに追記します。company-aの$table_prefixに切り替わっている時に、管理画面のトップページにJavaScriptでアラートを表示します。アラートを表示することによって、誤ってdefaultテーマのテーブルの内容を書き換えてしまうことを防止します。
/**
* 管理画面用JavaScript読み込み
*/
add_action( 'admin_footer', function() {
echo "<script>";
echo "(function() {";
echo "if (location.pathname === '/wp-admin/' || location.pathname === '/wp-admin/index.php') {";
echo "alert('A株式会社用の管理画面にアクセスしています。');";
echo "}";
echo "})();";
echo "</script>";
} );
切り替えの流れ
- ?ref=company-aが付与されたURLでアクセスされる
- $table_prefixをca_に切り替える
- 値がcompany-aのcompany_idという名前のCookieを有効期限0(ブラウザーを閉じるまで有効)で保存する
- ?ref=company-aが付与されていないURLのページにアクセスされる
- Cookieが保存されていれば$table_prefixをca_に切り替える
Cookieを使用するのは、URLパラメーターが付与されているURLの内部リンクから別のページに移動した時に切り替え状況を維持するためです。
カスタマイズ方法
サンプルコードの下記の行を書き換えます。
- URLパラメーターの値を変える
config.phpの12、20行目
functions.phpの18行目 - URLパラメーターの名前を変える
config.phpの8行目
functions.phpの18、36、107行目 - Cookieに保存される値を変える
config.phpの13行目
functions.phpの17行目 - Cookieの有効期限を変える
functions.phpの88行目の0 - 管理画面に表示されるアラートの内容を変える
functions.php(company-a)の8行目 - 切り替え対象のURLパラメーターを増やす
config.phpのif文
functions.phpの15~21行目
注意点
- 管理画面にアクセスした時にどちらに切り替わっているか確認しないと、意図せずDBの別のテーブルの内容を書き換えてしまいます。アラートを表示する、登録するユーザーを分けるなどで対策する必要があります。
- Cookieが保存されているとURLパラメーターが付与されていなくても切り替わるため、ページ内容の確認時には一旦ブラウザーを閉じるかシークレットウィンドウなどを使用する必要があります。
tooolsのTech Blogではこれからも役に立つ情報を発信していきますので、定期的に閲覧していただけると幸いです。
参考:PHP: filter_input – Manual
参考:PHP: array_search – Manual
参考:PHP: array_column – Manual
参考:PHP: setcookie – Manual
参考:after_setup_theme – Hook | Developer.WordPress.org
参考:admin_footer – Hook | Developer.WordPress.org