【WordPress】 is_user_logged_in() で構築するずぼらレビュー環境

【WordPress】 is_user_logged_in() で構築するずぼらレビュー環境

横浜へ転居して約 8 ヶ月が過ぎました。まだまだ生活用品が足りない中、いち早く『仮面ライダー555 Blu-ray BOX』全 3 巻を買い揃えた kagata です。次は『仮面ライダー龍騎 Blu-ray BOX』…は買わずに、電気炊飯器を買ってパックごはん生活からおさらばしたいです。

さて、今回は WordPress の話題です。先日、こんな相談を受けました。

  • WordPress で構築された Web サイトのデザインをリニューアルしたい。
  • テーマだけ改修すればすみそう。機能面の改修や、投稿データの編集は必要ない。
  • ところが、クライアントがレビューするための環境がない!
  • レビュー環境を構築する時間もないかも!

そこで、ずぼらなわたしは本番環境に直接手を加えてレビューしてもらうことを画策しました。とはいえ、制作途中のものが世の中に公開されてはもちろんいけません。そんな時に役立つのが、WordPress に用意されている関数 is_user_logged_in() です。

…なんていうと、「そんなことのための関数じゃねえよ」「レビュー環境作れよ」と厳しいつっこみが入りそうでこわいのですが…。

関数 is_user_logged_in()

関数 is_user_logged_in() は、閲覧中のユーザーが WordPress にログインしているか判別して条件分岐するための関数です。

Google やなんかで検索してみると、「WordPress で会員制サイトを作るには」みたいなシーンでよく紹介されているのがわかります。会員制サイト構築、クールですね…。でも個人的には、今回紹介するような泥くさい場面で使ってばかりです…。

基本編:テンプレートの一部を改修する場合

メインビジュアルが差し替わるとか、ナビゲーションの構成が変わるとか、テンプレートの一部を改修するような場合は次のようにします。

<?php if ( is_user_logged_in() ) : ?>
<p class="new">新しいデザインです。クライアントご担当者様各位、ご確認のほどよろしくお願いいたします。</p>
<?php else : ?>
<p class="origin">元のデザインです。現在公開中です。</p>
<?php endif; ?>

p.new の箇所が新しいテンプレート、p.origin の箇所が元のテンプレートの内容です。この状態で、お客様には WordPress にログインしてから画面をご確認いただくようお願いします。すると、公開されている内容はそのままに、お客様には新しいデザインをレビューしていただけます。ずぼらレビュー環境のできあがりです。

応用編:テーマごと切り替える場合

デザインを大きく変更したい、パーツごとに上のような方法で差し替えていてはきりがないという場合、ログイン状態によってテーマごと切り替えてしまうこともできます。

次のような PHP ファイルを作り、プラグインとしてインストール・有効化してみましょう。管理画面上での設定に関係なく、ログインしたユーザーにはコンストラクタの引数に与えた名前のテーマが表示されるはずです。

// ログインしたユーザーに見せる(レビューする)テーマの名前を引数に指定
new Theme_Review( 'newtheme' );

class Theme_Review {
    protected $_theme_name;

    public function __construct( $theme_name ) {
        $this->_theme_name = $theme_name;
        add_action( 'plugins_loaded', array( $this, 'filter' ) );
    }

    public function filter() {
        $callback = array( $this, 'change_theme' );
        add_filter( 'stylesheet', $callback );
        add_filter( 'template', $callback );
    }

    public function change_theme( $default_theme_name ) {
        if ( ! is_admin() && is_user_logged_in() ) {
            return $this->_theme_name;
        } else {
            return $default_theme_name;
        }
    }
}

動作原理は Theme_Review::filter() のとおりです。フィルターフック 'stylesheet' と 'template' に処理をはさむことで、所望のテンプレートが適用されるようになります。

注意する点としては、Theme_Review::change_theme() で関数 is_admin() を使って、管理画面では何もしないようにする条件分岐があります。これをしないと、管理画面でテーマを選択する際にもこのプラグインで設定したテーマが常に選択された状態になってしまいます。

実は車輪の再発明でした

ということで、先述の相談に対しては簡単なプラグインを作ってお渡ししていったん解決…したのですが、ほどなくして同じようなことをするプラグインが実はすでに出回っていることがわかったのでしたorz

ログインしているかだけでなく、ユーザーの権限によってもテーマを出しわけることができるようです。こっちのほうがいいですね。

結局、わたしのプラグイン開発は骨折り損に終わったわけですが、まあテーマ切り替え系プラグインの動作原理がわかったということで、収穫はあったということにしておきましょう…。

まとめ

  • WordPress の関数 is_user_logged_in() を使うと本番環境で新デザインのレビューができる(推奨はしませんが!)
  • デザインの一部を改修するだけなら、テンプレートファイル内で条件分岐させる
  • サイト全体のデザインを改修するなら、フィルターフック 'stylesheet' と 'template' を使ってテーマごと切り替える
  • 自分でプラグインを開発する前に、先行事例のサーベイくらいしようね
  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ