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のテーブルを切り替えます。

$table_prefixの切り替えイメージ

テーマの情報はwp_optionsテーブルとca_optionsテーブルに格納されているため、$table_prefixが変わるとテーマも変わります。

設定方法

wp-config.phpと、defaultテーマとcompany-aテーマのfunctions.phpを編集します。

wp-config.php

$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>";
} );

切り替えの流れ

  1. ?ref=company-aが付与されたURLでアクセスされる
  2. $table_prefixをca_に切り替える
  3. 値がcompany-aのcompany_idという名前のCookieを有効期限0(ブラウザーを閉じるまで有効)で保存する
  4. ?ref=company-aが付与されていないURLのページにアクセスされる
  5. 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

学校授業の「IT化」で、こんなお悩みありませんか?【e-おうち】
出張/持込/宅配でパソコン修理・設定 24時間365日対応
消費税計算

税率を設定して税込/税抜金額の消費税計算ができます。

文字数カウント

文字数をカウントできます。

和暦西暦変換

和暦と西暦を相互変換できます。

年齢計算

和暦または西暦から年齢を計算できます。

入学年・卒業年計算

履歴書に必要な学校の入学年・卒業年を生年月日から計算できます。

単位変換(換算)

キロ、マイル、グラム、華氏などの様々な単位を相互変換(換算)できます。

カラーコード変換

カラーコード(16進数)とRGB値(10進数)を相互変換できます。

Webタイマー(カウントダウン)

Webタイマー(カウントダウン)です。ストップウォッチ機能もあります。

生活に便利な電話番号一覧

警察や消防などの緊急連絡先や電話番号案内などの電話番号を確認できます。

プロバイダーのカスタマーサポートの電話番号一覧

主なプロバイダーのカスタマーサポートの電話番号を確認できます。

タスク管理(ToDo)

自分のWebブラウザーだけでタスク管理(ToDo)ができます。

エクセル関数

エクセル関数を検索できます。

麻雀の点数計算

麻雀の和了時の点数(符数/翻数/役)を計算することができます。

便利なショートカット一覧

Windows 10やExcelなどで使用できる便利なショートカットを確認できます。

電気料金計算

消費電力、使用時間、使用日数、1kWh単価から電気料金を計算できます。

パスワード生成(作成)

大文字・小文字・数字・記号を含むランダムなパスワードを生成できます。

自分のグローバルIPアドレスを確認

自分がインターネットに接続する時のグローバルIPアドレスを確認できます。

学校授業の「IT化」で、こんなお悩みありませんか?【e-おうち】
出張/持込/宅配でパソコン修理・設定 24時間365日対応
出張/持込/宅配でパソコン修理・設定 24時間365日対応
きょうみくん
このサイトの管理者
名前 きょうみくん
身長 181.1cm
誕生日 1月21日
所属 日本PCサービス株式会社
コメント

パソコン、インターネット、サーモン、ミルクティーが好きです。
猫ではありません。

エクセル家計簿の作り方など、技術的なコラムを書いているTech Blogも運営しています。