LoginSignup
2
2

More than 5 years have passed since last update.

Laravelのメンテナンスモード切替をWordPressにも適用する方法

Last updated at Posted at 2018-07-13

はじめに

Laravel5でのメンテナンスモードの実装方法についてはこちらをご覧ください
https://qiita.com/qwe001/items/0e393040127d66879fad

何が問題か

Laravelで作ったサイトがある。このサイトに、WordPressを新たに導入した。
今回、サイトをメンテナンスモードにする必要が出てきた。

Laravelで作ったページは問題なく切り替えることが出来るが、
WordPressはそういった仕組みを入れていないため、
Laravelでメンテナンスモードに切り替えても、WordPress制作ページはメンテナンスモードにならない。

WordPressにメンテナンスモード用のプラグインを入れてもいいが、切替手順が煩雑になって手間である。

何がしたいか

  • Laravelでメンテナンスモードに切り替えた時、WordPress制作ページも自動的にメンテナンスページにリダイレクトするようにしたい
  • しかし、メンテナンスモード中もWordPress制作ページを編集・確認できるように、WordPress管理者ログイン中はリダイレクトしないようにする
  • また、WordPress管理画面と、そのログインページもリダイレクトしないようにする(管理者ログアウトしたら再ログインできなくなるのを防ぐため)

ディレクトリ構成

{Laravelプロジェクト名}/
├ app/
├ public/
│ ├ js/
│ │ └ common.js
│ ├ css/
│ │ └ common.css
│ ├ images/
│ │ └ title.png
│ ├ {WordPressディレクトリ名}/
│ │ ├ wp-login.php
│ │ ├ wp-admin/
│ │ └ wp-content/
│ │   └ themes/
│ │     └ {テーマ名}/
│ │       ├ index.php
│ │       └ functions.php
│ └ index.php
├ resources/
│ └ views/
│   ├ index.blade.php
│   └ errors/
│     └ 503.blade.php
├ routes/
│ └ web.php
└ storage
  └ framework
    └ (down)

http://www.example.com/ に、Laravelで作ったトップページ(index.blade.php)が、
http://www.example.com/{WordPressディレクトリ名}/wp-login.php に、WordPressのログインページ、
http://www.example.com/{WordPressディレクトリ名}/{WordPress制作ページ名} に、WordPress制作ページがあるイメージ。

下準備

予め、メンテナンス画面のルーティング設定をしておくこと

{Laravelプロジェクト名}/routes/web.php
Route::get('/maintenance', function(){ Abort(503); });

実装

{Laravelプロジェクト名}/public/{WordPressディレクトリ名}/wp-content/themes/{テーマ名}/functions.php
function is_admin_user()
{
    $current_user = wp_get_current_user();

    if(user_can($current_user, 'administrator')){
        return true;
    }

    return false;
}

function redirectToMaintenancePage()
{
    $storage_path = $_SERVER['DOCUMENT_ROOT'] . '/../storage/';
    $file = $storage_path . 'framework/down';

    if(file_exists($file)){
        $protocol = empty($_SERVER['HTTPS']) ? 'http://' : 'https://';
        $page_hostname = $protocol . $_SERVER['HTTP_HOST'];

        $current_url = $page_hostname . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // クエリパラメータを除去。WPログイン画面用

        $maintenance_url = $page_hostname . DIRECTORY_SEPARATOR . 'maintenance'; // メンテナンス画面のURL
        $wp_login_url = wp_login_url();
        $wp_admin_url = admin_url();

        if($current_url === $wp_login_url || $current_url === $wp_admin_url || is_admin_user()){
            //
        }
        else {
            wp_redirect($maintenance_url);
            exit;
        }
    }
}
add_action( 'init', 'redirectToMaintenancePage' );

ロジック

Laravelをメンテナンスモードに切り替えると、「storage/framework/」直下に「down」という名前のファイルが生成される
このファイルがあることを、Laravelはメンテナンスモード切替の判断にしている。

WordPress配下のディレクトリも、このファイルがあればLaravelのメンテナンス画面(503.blade.php)にリダイレクトさせてるというわけ

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2