ログインユーザーに別のテーマを適用させる方法と言えば、「Theme Test Drive」というプラグインを使用するのが良く知られてるかと思います。
このプラグインを使用すると、ユーザーの権限毎にテーマを切り替える事が可能になります。
しかし、「権限毎じゃなく、ユーザー毎にテーマを切り替えたい」と思う場面にたまに遭遇します。
例えば、クライアント側が管理者権限のあるアカウントを使用していて、
テストテーマをまずはこちら側だけで確認したい、なんて時があります。
その場合「Theme Test Drive」では思ったようにできません。
今回もその必要が出てきたので、プラグインに頼らず何とか自分でできないものかと思いました。
「Theme Test Drive」の中身を覗いてヒントを貰い、
意外と簡単に実装できましたので、ここに書いておきたいと思います。
独自のプラグインファイルを作成
独自のプラグインファイルを作成して、実装していきます。
何故functions.phpじゃなくプラグインなのかと言いますと、
functions.phpでは読み込むタイミングが遅く、テーマの切り替えが上手く反映されないからです。
そもそもそのfunctions.phpを読み込んでる時点でそのテーマフォルダを参照しているので、当然おかしな事になりますよね。
WordPressの「plugins」フォルダの中(デフォルトでは/(WordPressフォルダ)/wp-content/plugins/)に、適当なファイル名でPHPファイルを作成します。
ここでは例として、「my_theme_change.php」としています。
そのファイルに、下記のコードを記述して、保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php /* Plugin Name: My Theme Change */ function my_theme_change($template) { $user = wp_get_current_user(); if($user->ID === 2) { テスト用のユーザーIDを指定 return 'test_theme'; //テスト用テーマのフォルダ名 } else { return $template; } } add_filter('template', 'my_theme_change'); add_filter('stylesheet', 'my_theme_change'); |
上記コードでは例として、
プラグイン名は「My Theme Change」
テスト用テーマを確認するユーザーアカウントのIDは2、
テスト用テーマのフォルダ名がtest_theme
として記述しています。
現在ログインしているユーザーのIDが2であれば’test_theme’を表示、そうでなければ普通に管理画面の「外観 > テーマ」で選択しているテーマを表示する、
という内容です。
あとは、管理画面でプラグインを有効化すれば完了です。
プラグインを有効化、確認
管理画面の「プラグイン」を開くと、「My Theme Change」というプラグインが追加されていると思います。
これを有効化して、テスト用のユーザーアカウントでログインしてサイトを開くと、テスト用テーマで表示されていると思います。
応用
単純に条件分岐をしてテーマを切り替えているだけですので、色々な応用ができそうです。
例えば「Theme Test Drive」のように権限で判定したい場合は下記のように記述すれば良さそうです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function my_theme_change($template) { if(is_user_logged_in()) { $user = wp_get_current_user(); if($user->roles[0] == 'administrator') { return 'test_theme'; } else { return $template; } } } add_filter('template', 'my_theme_change'); add_filter('stylesheet', 'my_theme_change'); |
別の端末でさくっと確認したい場合、いちいちログインするのは面倒くさいです。
なので、URLの後ろにパラメータを追加して表示を切り替える方法もできるかと思います。
下記のコードを記述して、example.com/xxx/?my_theme=test_theme にアクセスすれば、テスト用テーマが表示されるようになります。
1 2 3 4 5 6 7 8 9 10 |
function my_theme_change($template) { if($_GET['my_theme'] === 'test_theme') { return 'test_theme'; } else { return $template; } } add_filter('template', 'my_theme_change'); add_filter('stylesheet', 'my_theme_change'); |
このように、色々と応用できそうです。
とりあえず’template’と’stylesheet’というフィルターフックに条件分岐した結果を渡せばいいという事ですね。