Quantcast
Channel: レンタルサーバーのCPIスタッフブログ
Viewing all 131 articles
Browse latest View live

PHPフレームワーク『Laravel』入門 #6 Artisanオリジナルコマンドの作成と定期実行方法

$
0
0

Artisanオリジナルコマンドの作成と定期実行方法

これまでLaravel のArtisanコマンドを使ってできることをご紹介しました。
Artisanコマンドにはたくさんの機能が備わっていますが、その他にもオリジナルのコマンドを作成することができます。

今回はオリジナルのArtisanコマンドを作成する方法と、作成したコマンドを定期実行するためのLaravelのコマンドスケジューラに登録する方法をご紹介します。
この2つの機能を組み合わせると、毎日決められた時間にある処理を実行するといったバッチ処理を簡単に実装することができます。

また、作成したオリジナルコマンドは他のArtisanコマンドと同様にコンソールからも簡単に実行できますので、自分が作ったプログラムを他の開発者に利用させる際にも便利です。

 

目次

 

  1. Artisan オリジナルコマンドの作成
    1.1 コマンドクラスの生成
    1.2 オリジナルコマンドの実装
    1.3 コマンドの実行
  2. コマンドスケジューラにオリジナルコマンドを登録する
    2.1 スケジュールの登録
    2.2 コマンドスケジューラの有効化
  3. コマンドの実行結果をログファイルに出力する
  4. 最後に

 

1. Artisanオリジナルコマンドの作成

 

Artisanのオリジナルコマンドを作成すれば、自分で実装した任意の処理をコンソールおよびコマンドスケジューラから実行することができます。

今回の記事では、データベース上のUserテーブルに登録されているユーザーの件数を毎分取得するコマンドを作成してみます。

 

1.1 コマンドクラスの生成

まず、オリジナルコマンドの処理を記述するためのコマンドクラスを生成します。
コマンドクラスはArtisan make:commandコマンドを実行することで、はじめから用意されている雛形を元に自動で生成することができます。

# Laravelプロジェクト(PROJECT_NAME)に移動
cd ~/html/laravel/PROJECT_NAME
# オリジナルコマンド用のコマンドクラスを生成する
php-7.1 artisan make:command UserCountCommand

今回はUserテーブルに登録されているユーザーの件数を取得するためのコマンドなので、クラス名はUserCountCommandとしています。
成功すると、コマンドクラスのファイルがapp/Console/Commands/の直下に作成されます。

 

1.2 オリジナルコマンドの実装

1.1で生成したコマンドクラスは何も処理が書かれていない空っぽの状態なので、コマンドの名前任意の処理を記入していきます。
管理ユーザー登録用のUserCountCommandファイルをテキストエディタで開いて編集します。

app/Console/Commands/UserCountCommand.php

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\User;

class UserCountCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'user:count'; 

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
      //標準出力またはログに出力するメッセージ
      $message = '[' . date('Y-m-d h:i:s') . ']UserCount:' . User::count();
      //INFOレベルでメッセージを出力する
      $this->info( $message );
    }
}

まず、Userテーブルに対して操作を行いますので

use App\User;

でUserモデルを読み込んでいます。

次に

rotected $signature = 'user:count';

の部分ですが、変数$signatureにコマンドの名前を設定します。
コマンドの名前は任意ですが、覚えやすいものをつけましょう。

最後に、コマンドが実行されたときの処理をhandle()メソッドの中に記入します。

データベース上にあるUserテーブルの情報を参照するのにUser::countプロシージャを呼び出していますが、これはLaravelのEloquent ORMという機能を使っています。

Eloquent ORMについて今回は説明を省略しますが、SQLを書かずにテーブルの参照・登録・更新・削除ができるとても便利な機能です。

メッセージの出力はechoでもできますが、今回はコマンドクラスに用意された標準出力用のメソッド
$this->info()
を使用します。

コマンドクラスには$this->info()の他にも、エラー出力用の$this->error()や、配列を渡すことで自動的にテーブルレイアウトに整形してくれる$this->table ()などの便利な標準出力用のメソッドが用意されています。

コマンドクラスの作成が終わりましたら、作成したコマンドクラスをLaravelに認識させるために下記コマンドをPROJECT_NAME配下で実施し、オートロードの再構成を行います。

php-7.1 ../composer.phar dump-autoload

Laravelは必要なファイルを自動的に読み込む、Composerのオートロードという仕組みを利用しています。

Laravelで開発を進めていくと、新しいファイルを追加した時などさまざまな場面で「Class <ファイル名> does not exist」というエラーが発生することがあります。
上記のエラーが発生したら、まずオートロードの再構成を行ってみてください。

 

1.3 コマンドの実行

1.2で作成したオリジナルコマンドを、コンソールから実行してみます。

php-7.1 artisan user:count

実行結果は標準出力に出力されます。
成功したら、以下のようなメッセージが緑色の文字で表示されます。

 

2. コマンドスケジューラにオリジナルコマンドを登録する

 

Laravelにはコマンドスケジューラという機能があります。

コマンドスケジューラは、あるコマンドを定期実行(決められた日時に繰り返し実行)させるための機能です。

Linuxサーバーを利用されている場合、サーバーのCronを利用して定期実行を設定する方法がポピュラーですが、LaravelにはCronより便利なコマンドスケジューラの機能がありますので、そちらを使用しましょう。

2.1 スケジュールの登録

まずコマンドスケジューラに、定期実行したいコマンドとそれを実行するスケジュールを登録します。

今回は、1.で作成したオリジナルコマンドを毎分ごとに実行するというスケジュールを追加してみます。

app/Console/Kernel.php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        \App\Console\Commands\UserCountCommand::class
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // user:countコマンドを毎分実行する
        $schedule->command('user:count')->everyMinute();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');
        require base_path('routes/console.php');
    }
}

追加するのは全部で2箇所です。

まず、配列$commandsに1.で作成したコマンドクラスの情報を指定します。
末尾をクラス名::classとするところに注意してください。

次に、scheduleメソッドの中にコマンドを実行したいスケジュールを記入します。
$schedule->command('user:count')の部分でどのコマンドを実行するかを明示して
->everyMinute()の部分で実行する日時を指定しています。

everyMinuteメソッドは毎分実行するという設定ですが、他にもCronと同じような細かい実行タイミングの設定が可能ですので、代表的なものを以下に紹介します。

  • 毎時間実行する
    $schedule->hourly();

  • 毎日12時00分に実行する
    $schedule ->daily();

  • 毎日指定した時間に実行する
    $schedule ->dailyAt('5:15');

  • 毎月指定した日時に実行する
    $schedule ->monthlyOn(25, '23:55');

  • Cronと同じ書き方で指定することもできます
    $schedule ->cron('* * * * * *');

 

2.2 コマンドスケジューラの有効化

2.1でスケジュールの登録を行いましたが、これだけではまだコマンドスケジューラは有効になっていません。
Laravelのコマンドスケジューラは裏でCronの機能を利用していますので、crontabにArtisanのコマンドスケジューラを有効にするための設定を追加する必要があります。

Laravelのコマンドスケジューラを有効化するためには、crontabに以下の設定を追加する必要があります。

* * * * * /usr/local/bin/php-7.1 /usr/home/<ユーザー名>/html/laravel/PROJECT_NAME/artisan schedule:run

共用レンタルサーバー『ACE01』では、直接Cronテーブルを編集することができませんので、下記手順に従い「スクリプト定期実行ツール」を利用します。

「スクリプト定期実行ツール」では定期実行のスケジュールを登録する際に、ファイルを指定しなければなりません。(実行するコマンドを直接書くことができません)

そのために、まずArtisanのコマンドスケジューラを実行するためのコマンドを実行するためのPHPファイル(do_cron.php)を作成します。 

do_cron.php

<?php
exec('/usr/local/bin/php-7.1 /usr/home/<ユーザー名>/html/laravel/PROJECT_NAME/artisan schedule:run');

exec関数はPHPからコマンドラインの外部コマンドを実行することができます。またこの際に、PHPとArtisanについては絶対パスで指定するようにしてください。

ファイルを作成しましたら、サーバーのコントロールパネルにログインして、「スクリプト定期実行ツール」で先ほど作成したファイルを定期実行する設定を行います。

「公開サイト用設定」→「スクリプト定期実行ツール」を選択すると以下のような設定画面が表示されます。

写真を参考にして、次のように設定してください。

  • 「新規登録」は先ほど作成したファイル(do_cron.php)を選択
  • 「PHPのバージョン」は7.1~を選択
  • 「実行スケジュール」は1分毎になるように選択

全ての選択が終わったら「追加する」ボタンをクリックしてください。
これでコマンドスケジューラが有効になり、2.1で登録したスケジュールどおりにコマンドが定期実行されるようになりました。

 

3. コマンドの実行結果をログファイルに出力する

 

ここまでの手順を振り返ると、1.で作成したオリジナルコマンドを2.で定期実行するようになりました。

しかし、今のままでは、コマンドスケジューラで定期実行されるコマンドはバックグラウンドで実行されているため、実行結果を知ることができません。
また、正常に完了したのか、エラーが発生したのかも分かりません。

これでは不便なので、コマンドの実行結果やエラーを記録するログファイルを作ってそのファイルに結果を出力するように設定してみましょう。

Laravelのコマンドスケジューラには、ログファイルを出力するためのメソッドも用意されています。

app/Console/Kernel.php

~省略~
    protected function schedule(Schedule $schedule)
    {
        // user:countコマンドを毎分実行して、ログファイルに出力する
       $schedule->command('user:count')->everyMinute()
->appendOutputTo(storage_path('logs/user_count.log') );
    }
~省略~

ログファイルを出力するには、appendOutputToメソッドを使用します。
appendOutputToメソッドはファイルが既に存在する場合は追記して、存在しない場合は新規作成を行います。
追記ではなく実行ごとに新しいログファイルを作成したい場合はappendOutputToメソッドの代わりにsendOutputToメソッドを使用してください。

storage/logs/にログファイルuser_count.logが作成されます。
毎分ごとにコマンドの実行結果が記述されていることを確認してください。

 

4. 最後に

 

今回の記事では、Artisanのオリジナルコマンド作成とコマンドスケジューラの設定方法についてご紹介いたしました。Webアプリケーションでは定期実行によるバッチ処理を実装することが多いので、Laravelのコマンドスケジューラを使いこなして、開発効率の向上を目指しましょう。


PHPフレームワーク『Laravel』入門 #7 ログイン機能とカスタマイズ方法

$
0
0

ログイン機能とカスタマイズ方法

Laravelにはこれまで紹介した便利なコマンドのほかに、Webアプリケーションを作るのに欠かせない認証・認可に関する機能が最初から用意されています。

その一つが、ユーザー登録を行った利用者だけがWebアプリケーションを閲覧・利用できるようにする「ログイン機能」です。
ログイン機能は、会員制のWebアプリケーションに欠かせません。それ以外にも、管理者ユーザーを作って、一般ユーザーにはできない操作をWeb上でさせたい場合に有用です。

一から作れば1~2日かかってしまうログイン機能ですが、Laravelでは初めから用意されているので最短10分で導入できるのが強みです。

カスタマイズも簡単でとても便利ですので、ぜひ活用してください。

 

目次

 

  1. ログイン機能
    1.1 ログイン機能の有効化
    1.2 ログイン画面
    1.3 ユーザー登録画面
  2. ログイン機能のカスタマイズ
    2.1 ログインフォーム、ユーザー登録フォームの日本語化
    2.2 ユーザーIDでログインできるようにする
    2.3 ユーザー登録画面に項目を追加する
  3. 最後に

 

1. ログイン機能

 

Laravelで初めから用意されているログイン機能は、利用者のメールアドレスとパスワードを入力するだけの簡単なものです。
入力したメールアドレスがデータベースのUsersテーブルに存在し、かつパスワードが一致した場合にログイン成功となります。開発者は、ログインに成功したユーザーだけが見られるページや、押せるボタンなどを設置することができます。

これだけでも機能的には十分ですが、もっと使いやすくするためのカスタマイズも可能です。
カスタマイズの方法は後述しますので、まずはデフォルトのままでログイン機能を有効化してみましょう。

 

1.1 ログイン機能の有効化

Laravelのログイン機能を有効化するには、Artisan make:auth コマンドを実行します。

# Laravelプロジェクト(PROJECT_NAME)に移動
cd ~/html/laravel/PROJECT_NAME
# ログイン機能を有効化する
php-7.1 artisan make:auth

Authentication scaffolding generated successfully.

というメッセージが表示されればコマンドは成功です。
驚くべきことに、たったこれだけでログイン機能に必要なファイルがプロジェクトに追加されます。

※データベースにUserテーブルがまだ作成されていない場合はエラーになりますので、先にデータベースのマイグレーションを実行してください。

php-7.1 artisan migrate

生成されたログイン機能関係のクラスをWebアプリケーションに即座に反映させるため、以下のコマンドでキャッシュクリアを実行してください。

php-7.1 artisan clear-compiled
php-7.1 artisan optimize
php-7.1 artisan view:clear

artisan optimizeの実行後に以下のようなエラーメッセージが表示されますが、無視をしても問題ありません。

LogicException  : Unable to prepare route [api/user] for serialization. Uses Closure.

キャッシュクリアの実行後、Webアプリケーションのトップページにアクセスすると、ヘッダー部分に「LOGIN」「REGISTER」というボタンが追加されているのが確認できます。

http://<サーバの公開URL>/laravel/PROJECT_NAME/public/

 width=

 

1.2 ログイン画面

ヘッダー部分に追加された「LOGIN」をクリックすると、ログイン画面が表示されます。

 width=

E-Mail Address:ユーザーのメールアドレス
Password:パスワード
Remember Meにチェックを入れてログインするとログイン情報がブラウザに記録されて、次回以降のログインが省略されます。
Forgot Your Password? は利用者がパスワードを忘れた際にパスワード再設定用リンクをメールで送る機能です。こちらもはじめから用意されていますので、とても便利です。

 

1.3 ユーザー登録画面

ヘッダー部分に追加された「REGISTER」をクリックすると、ユーザー登録画面が表示されます。
利用者はまずこの画面で自分のユーザー情報(認証情報)を登録します。

 width=

Nameは利用者が希望するユーザーIDを入力します。
E-Mail Address は利用者が自身のメールアドレスを入力します。
Password は利用者が希望する、ログインの際に入力するパスワードを入力します。
Confirm Password は誤入力防止用で、再度希望するパスワードを入力します。

Laravelのログイン機能がデフォルトで取り扱うユーザー情報(認証情報)は上記のとおりです。
他に項目を増やしたい場合は、カスタマイズ方法を後述しますのでそちらをご参考ください。

実際にテストユーザーの登録を行ってみます。

 width=

同一のメールアドレスがすでに登録されている場合は、エラーメッセージが表示されます。
テストユーザーを複数作成する際には、ユーザーごとに別のメールアドレスを用いてください。

ユーザーの登録が成功すると、自動的にダッシュボードページに移動します。

 width=

ヘッダーメニューのLogoutをクリックすると、ログアウトされてトップページに戻ります。

 

2. ログイン機能のカスタマイズ

前章ではLaravelのログイン機能について導入方法をご説明しました。
デフォルトの状態でも十分利用できますが、もっと使いやすく、Webアプリケーションの用途に合わせた内容にカスタマイズすることができます。

ここからカスタマイズの例をいくつかご紹介しますので、自分が開発するWebアプリケーションにも導入したいと思うものがあれば、ぜひ手順を参考に導入してみてください。

 

2.1 ログインフォーム、ユーザー登録フォームの日本語化

ログインフォーム、ユーザー登録フォームの項目はすべて英語で書かれています。
このままですとユーザーに不親切ですので、日本語に変更します。

まずログイン画面の入力フォームを日本語に変更します。

resources/views/auth/login.blade.php

extends('layouts.app')

@section('content')<div class="container"><div class="row justify-content-center"><div class="col-md-8"><div class="card"><div class="card-header">{{ __('Login') }}</div><div class="card-body"><form method="POST" action="{{ route('login') }}">
                        @csrf<div class="form-group row"><label for="email" class="col-md-4 col-form-label text-md-right">メールアドレス</label><div class="col-md-6"><input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>

                                @error('email')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div><div class="form-group row"><label for="password" class="col-md-4 col-form-label text-md-right">パスワード</label><div class="col-md-6"><input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                                @error('password')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div><div class="form-group row"><div class="col-md-6 offset-md-4"><div class="form-check"><input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}><label class="form-check-label" for="remember">ログイン情報を保存する</label></div></div></div><div class="form-group row mb-0"><div class="col-md-8 offset-md-4"><button type="submit" class="btn btn-primary">ログイン</button>

                                @if (Route::has('password.request'))<a class="btn btn-link" href="{{ route('password.request') }}">パスワードを忘れましたか?</a>
                                @endif</div></div></form></div></div></div></div></div>
@endsection

次に、ユーザー登録画面の入力フォームを日本語に変更します。

resources/views/auth/register.blade.php

 extends('layouts.app')

@section('content')<div class="container"><div class="row justify-content-center"><div class="col-md-8"><div class="card"><div class="card-header">{{ __('Register') }}</div><div class="card-body"><form method="POST" action="{{ route('register') }}">
                        @csrf<div class="form-group row"><label for="name" class="col-md-4 col-form-label text-md-right">ご希望のユーザーID</label><div class="col-md-6"><input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                                @error('name')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div><div class="form-group row"><label for="email" class="col-md-4 col-form-label text-md-right">メールアドレス</label><div class="col-md-6"><input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">

                                @error('email')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div><div class="form-group row"><label for="password" class="col-md-4 col-form-label text-md-right">パスワード</label><div class="col-md-6"><input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">

                                @error('password')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div><div class="form-group row"><label for="password-confirm" class="col-md-4 col-form-label text-md-right">パスワード(確認のため再度入力してください)</label><div class="col-md-6"><input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password"></div></div><div class="form-group row mb-0"><div class="col-md-6 offset-md-4"><button type="submit" class="btn btn-primary">登録する</button></div></div></form></div></div></div></div></div>
@endsection

 

2.2 ユーザーIDでログインできるようにする

Laravelのログイン機能はデフォルトではメールアドレスとパスワードの組み合わせで認証を行います。
これですとメールアドレスが長い場合に入力が面倒ですので、ユーザーIDとパスワードでログインが可能になるようカスタマイズします。

まずはログイン機能のコントローラーに以下の記述を追加します。

app/Http/ Controllers/Auth/LoginController.php

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

use Illuminate\Http\Request;

class LoginController extends Controller
{
  
    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';
 

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
    public function username()
    {
      return 'name';
    }
}

usernameという関数を追加して、戻り値にログインに利用したいカラムの名前(今回はユーザーIDなのでname)を文字列で指定します。

次に、ログイン画面の画面項目を変更します。

resources/views/auth/login.blade.php

@extends('layouts.app')

@section('content')<div class="container"><div class="row justify-content-center"><div class="col-md-8"><div class="card"><div class="card-header">{{ __('Login') }}</div><div class="card-body"><form method="POST" action="{{ route('login') }}">
                        @csrf<!-- メールアドレスの入力項目をコメントアウトする --><div class="form-group row"><label for="email" class="col-md-4 col-form-label text-md-right">メールアドレス</label><div class="col-md-6"><input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>

                                @error('email')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div>
                        --><!-- 新しくユーザーIDの入力項目を追加する --><div class="form-group row"><label for="name" class="col-md-4 col-form-label text-md-right">ユーザID</label><div class="col-md-6"><input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>

                                @error('name')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div>~略~

ログイン画面の入力フォームのうち、メールアドレスの入力フォームを削除します。(今回は分かりやすいようにコメントアウトしています。)
そのかわりに、ユーザーIDの入力フォーム( input name=“name” )を新たに追加しています。


これでログインに用いる項目がメールアドレスからユーザーIDに変更されます。

 

2.3 ユーザー登録画面に項目を追加する

最後に、ユーザー登録画面に氏名や住所、電話番号などの独自の項目を追加する方法です。

少し複雑ですが、実際のWebアプリケーションでは会員登録を行う際にこれらの情報も登録させることが多いので、ぜひ覚えてご活用ください。

 

2.3.1 Usersテーブルのカラム追加

まず、Usersテーブルに氏名と電話番号のカラムを増やすためのマイグレーションファイルを作成します。

php-7.1 artisan make:migration update_user_table --table=users

database/migrations/日付_update_user_table.php

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class UpdateUserTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
          $table->string('fullname'); // 氏名カラムを追加
          $table->string('phone');  // 電話番号カラムを追加
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {

        });
    }
}

マイグレーションファイルの作成が終わったら、マイグレーションを実行します。

php-7.1 artisan migrate

成功するとデータベース上のUsersテーブルに「fullname」「phone」のカラムが追加されます。

 width=

 

2.3.2 Userモデルの変更

続いて、テーブルの変更にあわせてUserモデルの内容を変更します。

app/User.php

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',’fullname’,’phone’,
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}

フィールドの$fillable配列に新しく追加したカラム名「fullname」「phone」を追加しています。

この変更を忘れると、入力された氏名と電話番号をUsersテーブルに登録する際にエラーになりますのでご注意ください。

 

2.3.3 入力フォームの変更

次に、ユーザー登録画面の入力フォームに氏名と電話番号の項目を追加します。

resources/views/auth/register.blade.php

@extends('layouts.app')

@section('content')<div class="container"><div class="row justify-content-center"><div class="col-md-8"><div class="card"><div class="card-header">{{ __('Register') }}</div><div class="card-body"><form method="POST" action="{{ route('register') }}">
                        @csrf

~略~
                      
                        <div class="form-group row"><label for="fullname" class="col-md-4 col-form-label text-md-right">氏名</label><div class="col-md-6"><input id="fullname" type="text" class="form-control @error('fullname') is-invalid @enderror" name="fullname" value="{{ old('fullname') }}" required >

                                @error('fullname')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div>     <div class="form-group row"><label for="phone" class="col-md-4 col-form-label text-md-right">電話番号</label><div class="col-md-6"><input id="phone" type="text" class="form-control @error('phone') is-invalid @enderror" name="phone" value="{{ old('phone') }}" required>

                                @error('phone')<span class="invalid-feedback" role="alert"><strong>{{ $message }}</strong></span>
                                @enderror</div></div> 
~略~

 

2.3.4 コントローラーの変更

最後に、ユーザー作成用のコントローラーファイルに、新しい項目のバリデーションルール(入力規則)と登録処理を追加します

app/Http/ Controllers/Auth/RegisterController.php

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{
    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],'password' => ['required', 'string', 'min:8', 'confirmed'],'fullname' => ['required', 'string', 'max:255'],'phone' => ['required', 'string', 'max:50'],
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return \App\User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],'email' => $data['email'],'password' => Hash::make($data['password']),'fullname' => $data['fullname'],'phone' => $data['phone'],
        ]);
    }
}

validator関数の戻り値に設定されているValidator::makeは、それぞれの入力項目に対してどのようなチェックを行うかを記述します。

細かいバリデーションルールなどの説明は省略しますが、requiredを設定すると入力が必須になります。逆に何も定義しないと、任意入力の項目になります。

create関数のUser::createでUsersテーブルへの登録を行っています。
ここに氏名と電話番号の代入処理を追加してください。

 

2.3.5 ユーザー情報の登録、確認

以上でユーザー登録フォームの項目追加カスタマイズの手順は完了です。

それでは、実際に登録をしてみます。

 width=

登録が完了したらダッシュボード画面に新しく追加した氏名と電話番号を表示して、正しく登録ができているか確認してみましょう。

resources/views/home.blade.php

@extends('layouts.app')

@section('content')<div class="container"><div class="row justify-content-center"><div class="col-md-8"><div class="card"><div class="card-header">Dashboard</div><div class="card-body">
                    @if (session('status'))<div class="alert alert-success" role="alert">
                            {{ session('status') }}</div>
                    @endif<h2>ようこそ、{{ Auth::user()->fullname }}さん!</h2><h3>連絡先:<a href="tel:{{ Auth::user()->phone }}">{{ Auth::user()->phone }}</a></h3></div></div></div></div></div>
@endsection

ログイン中のユーザーの情報はAuth::userで呼び出すことができます。

 width=

画像のように、氏名と電話番号が表示されていればカスタマイズ成功です。

 

3. 最後に

今回はLaravelの認証・認可機能のうちログイン機能についてご紹介しました。

Webアプリケーションを作成するうえで、ログイン機能は欠かせないものですので、ぜひLaravelのログイン機能を使いこなして開発のスピードアップを実現させてください。

カスタマイズの方法は今回ご紹介したもの以外にもたくさんありますので、自分が作りたいWebアプリケーションに最適なカスタマイズ方法を探してみてください。

【2019/9/5リリース】 8年ぶりの新共用サーバー「シェアードプラン SV-Basic」を語る!

$
0
0

2011年のシェアードプランACE01のリリースから8年。
CPIが満を持して共用サーバー新プラン「シェアードプラン SV-Basic」をリリースしました。

 

サービスサイト(https://www.cpi.ad.jp/shared/)は公開したものの、まだまだ語り足りないクラウドホスティング事業本部 サービス営業部の二人が「SV-Basic」についてご紹介します!
一体なぜ?その実力は?どこがよくなったの?などなど、SV-Basicの全貌に迫り、みなさまの疑問に全力でお応えします!

 クラウドホスティング事業本部 サービス営業部 鎌田、下池
クラウドホスティング事業本部 サービス営業部 ゼネラルマネージャー 鎌田 大介(右)
クラウドホスティング事業本部 サービス営業部 マーケティング担当 下池 壮介(左)

 

「SV-Basic」とは?

下池
まずは、私から「SV-Basic」のサービス内容を簡単に説明します。
「SV-Basic」は、安全性、安定性にこだわった共用レンタルサーバーです。

 

これまでのACE01と異なり、ディスク容量やマルチドメインの無制限での提供は行いません。 そのコストパフォーマンスの高さをご評価いただいてきましたが、10万件のサーバー利用を見直した結果、より安定性の高いサービスへのご期待が大きいと判断し、変更に踏み切りました。

 

ウェブ、メール、コントロールパネルのシステム分離を進め、それぞれ上限を設けることで、従来よりもさらに他の利用者の影響を受けない安定性を重視したサービスへと発展させています。

 

また、システムの分離によりセキュリティ対策を適切に実施しやすくなり、安全性を継続的に高めやすくしています。

 

特に「SSLサーバー証明書」については、多くのご要望にお応えし、1枚分の無料提供に踏み切っています。しかも、ビジネスでの確実性にこだわり、無料提供する証明書も国内ベンダーの提供するサービスを採用しています。長らくお待たせいたしました!

 

他にも、セキュリティや高速表示への対応など、トレンドに合わせたサービス強化を行っています。
一例として、  
・TLS1.3に対応し、暗号化強度も最高水準へ  
・HTTP/2に対応し、ウェブサイト高速表示を可能に  
・専門業者のセキュリティ診断など、厳しい基準をクリア
などです。

 

もちろんACE01でご好評をいただいた「SmartRelease」は健在。これまで10世代までだったデータベースのバックアップも30世代に増強するなど、さらに使い勝手を高めています。

 

そして、もう一つの大きな変化として、十数年ぶりにコントロールパネルを刷新し、知識がなくても操作しやすいサービスへと進化させました。ぜひ実環境を見てほしいですね。





好評だった「ACE01」から「SV-Basic」へ。
スペックより「見えない」サービスの本質にメスを入れた骨太なサービスを目指す。

 

私たちは、ウェブサイトやメールを単なる『コンテンツ』『機能』とはとらえていません。ウェブサイトはお客様の大切な事業資産であり、それを支えているのだという意識を強く持っています。

またメールにしても、お客様のビジネス・コミュニケーションに欠かせない事業インフラであると考えています。メールが1つ止まるだけでも重大な機会損失となり、お客様の事業に支障を与えてしまうことになりかねません。

お客様のビジネスを守り、その発展を支えるために、サービスを安定的に稼働させ、快適にご利用いただけるようにするのが、私たちの役割であると認識しています。

クラウドホスティング事業本部 本部長 西村 謙一

 

鎌田
これは、私たちCPIが日々実現を目指しているところです。
ACE01をリリース以後、おなじ思いでサービスを磨いてきましたが、サービス内容が実際の利用方法と合わない部分が多いのも事実。
営業と言う立場からすると、無制限と言うコンセプトは非常にわかりやすいのですが、お客様の事業機会の発展に対する解決策としては、どうしても不十分と言う思いもありました。

 

下池
たしかに。
お客様やパートナー様とお話しさせていただいても多くの場合、ウェブ、メールが「いつも安定している」点を、もっとも評価いただいてきました。ITを使用しない企業がほぼいない今、ウェブ、メールはお客様の事業の重要な機能を担っていますし、これらによる成果が大きいお客様ほど、より事業としての重要度が高くなっています。
そういった意味でも、一つ一つのサーバー環境に対してこだわりが必要になりますよね。

 

鎌田
「見えない」サービスの本質にメスを入れることにこだわるからこそ、CPIはいつも安定したサービスと言っていただいていると思います。CPIを、お客様の事業成長を支えられるサーバーとしてさらに発展させていくには、このタイミングで思い切ってコンセプトを一新する必要があったというわけです。

 

下池
コンセプトと言えば、安定性以外にもう一つ、「安全性」も重要ですね。
安定しているだけでは、お客様の事業資産を守るには不十分です。目立たなくはありますが、効率的にセキュリティ対策を実施できるサーバー構成など、細やかな配慮が効くサービスになっています。

 

鎌田
CPIのサービスのいいところは、「運用時に手間のかからない手離れの良さ」だと考えています。つまりお客様の事業機会を邪魔せずにきっちりと下支えするということ。
常に安全で安定、さらに快適であれば、運用時の手間はほぼなくなります。お客様の事業インフラとして、心配されることのないサービスとして、長くお付き合いいただけると信じています。

 

危険だとわかっているウェブサイトを信用する人はいない。

下池
それでは、まずは、「安全性」について、詳しく話しをしましょう。
先ほど説明した通り、SSLサーバー証明書を無料化しました。
セキュリティ対策と言うよりは、常時SSL化の普及を急ぐブラウザへの対策という側面が強いですね。

ブラウザ上での警告の厳しさは、数年前まででは考えられないほどになっています。

例えば、

鎌田
こうなると、誰もこの先にアクセスしませんね。さすがに怖い。
アドレスバーに警告が出るだけでも不信に感じるユーザーも多いでしょう。
危険だとわかるウェブサイトが信用されないし、今後はより厳しい目で見られます。
機会損失を考えると、SSLは必須です。

 

下池
この一年でさらに普及が進んでいるはずですが、昨年公表された調査では 20%程度の普及率です。まだ、70%~80%のウェブサイトが未対応です。中にはすでに機会損失が起こっているウェブサイトもありそうです。
(※出典:一般社団法人 日本情報経済社会推進協会 「常時SSL/TLS化調査レポート|企業サイト対応状況」

 

鎌田
ぜひSV-Basicで対策してほしいですね。

 

システム全体を見直し、安全性を高め続ける仕組みを提供 

下池
SSL以外にも、安全性への取り組みを追加しています。
まず、「セキュリティアップデート」についてです。
今回、システムを本番環境とコントロールパネルへと完全に分離しました。その結果、ウェブサーバー、メールサーバー、コントロールパネル用サーバーなど、それぞれに適したタイミング、対応方法でアップデートしやすくなりました。

 

鎌田
もともとウェブサーバーとメールサーバーは、別のサーバー環境で提供しています。一般的なサ―ビスと比較すると検証に必要な期間も短く、お客様の環境への対策をより適切な時期に行えます。

 

下池
ACE01に引き続き、SV-Basicでも「WAF(ウェブアプリケーションファイアウォール)」を標準提供しています。
JPCERT/CCやIPA(情報処理推進機構)の調査結果でも、情報セキュリティでのインシデントは減少していませんし、ウェブやメールを通した攻撃も続いています。
特に外部に公開しているウェブサイト上のCMS(コンテンツマネジメントシステム)などは狙われやすく、脆弱性対策が不十分であれば、ウェブサイト乗っ取られ被害者どころか、いつのまにか加害者になってしまう可能性もあります。

 

▼インシデント報告対応レポート(JPCERT/CC「インシデント報告対応レポート」

 

 

▼情報セキュリティ10大脅威(出典:情報処理推進機構「情報セキュリティ10大脅威 2019」

鎌田
CPIで採用するWAF(株式会社ジェイピー・セキュア 「SiteGuard ServerEdition」)の場合、そういった不正なアクセスをシグネチャー判別し、アクセスさせないようにします。シグネチャーの更新もCPIにて行いますので、ぜひ活用して脆弱性から大事な事業資産を守っていただきたいですね。

 

下池
そういう観点では、フルリニューアルしたコントロールパネルに対しても対策を施しています。 今回、操作性の改善だけではなく、システムについても作り変えました。新たに設計したものなので、システムテストの専門業者に対してセキュリティ診断を依頼し、「OWASPアプリケーションセキュリティ検証標準(ASVS)」を満たしています。

 

鎌田
当然、社内のエンジニアによる検証もきっちりしていますし、KDDIグループ企業としてのセキュリティ基準もクリアしています。
WAFがお客様のコンテンツを守るためとすれば、こちらはレンタルサーバーのサービスそのものを守るためと言えます。
ビジネス向けとして、自信をもっておすすめできますね。

 

世界はボーダレス。いつ、どんな時でも「使える」サービスであるために。

下池
続いて、「安定性」へのこだわりも紹介させてください。

 

いまや、スマートフォンで気軽にウェブサイトにアクセスできるようになりました。ビジネスもグローバル化が進み、世界中どこからでもアクセスがあります。
24時間365日ウェブサイトにアクセスでき、メールの送受信ができる、、、ところまではレンタルサーバーでは当たり前です。
しかし、安定しているかどうかは別です。Googleの調査では、ウェブサイトの表示が1秒以上かかると実行していたタスクに興味を失うそうです。

そうなると、常に安定した表示速度が必要ですね。一瞬が速いことも求められますが、不安定にならないことが重要です。
(出典:Google「Find out how you stack up to new industry benchmarks for mobile page speed (英語)」

 

「SV-Basic」でこだわったのは、まさにこれです。
不安定になりやすい状況を作らないことを徹底しています。
先ほどから何度かご紹介したシステムの分離も、安定性を高めるための施策の一つです。 しかも、一般的なレンタルサーバーで提供されるマルチドメインとは異なり、マルチドメインの追加ごとにウェブサーバー、メールサーバーを追加します。
これまでも同じ提供方式でしたが、あまり説明していなかったので、ご存じない方が多いんです。

 

鎌田
さらにアピールしたいのが「ウェブサイト単位で収容数を決めている」という点です。
一般的なレンタルサーバーの場合、サーバー環境をベースに物理的なサーバー上に収容する契約数を決めますが、CPIの場合は、ウェブサーバーの数=ウェブサイトの数ですので、ウェブサイトの数をコントロールして、安定化させています。
影響を受けにくく、無茶な使い方にもあたりにくい。これが安定稼働の秘訣なんです。

 

下池
そうですね。
同環境にマルチドメインを無制限に追加できる場合、同じサーバーに入るお客様の影響を大きく受ける場合があります。また、当然同じウェブサーバーですので、複数のウェブサイトが同居すると、その分、同時にアクセスされたり、データベースに接続する確率が高まります。
SV-Basicのようにウェブサイトあたりで確保でき、比較的影響が小さくできるのは大きなメリットと考えています。

 

また、ウェブサーバーで説明しましたが、同じような配分をメールでも行っています。 メールも安心してご利用いただきたいですね。

 

鎌田
いつもどんな時もつながる社会だからこそ、大切な「事業資産」であるウェブ、メールの活用を進めるためには、「任せきれる」くらいに安定することが価値と言えるはずです。
さらに紹介しておきたいのは、CPIの運用マネージャーの言葉です。

 

「運用に求められるのはなによりシステムの安定性。そうすると、受け身の、守備的な考え方で施策を思い浮かべがちです。数年前までは障害が発生してからいかに早期に解決するかという観点で対応していました。しかし、そもそも障害自体を発生させないようにすべきなのではないか? そのために、固定観念を破り、どんどん新しいものを取り入れてチャレンジすべきではないか? と発想を転換したのです。それが私たちの考える “攻めの運用”です」

 

下池
いままでも「障害が少ない、安定している、問題が起きない」という評価を多くいただいてきましたが、こういう考え方が背景にあるからなのですね。

 

鎌田
サービススペックや機能表では紹介できない点こそ、サービスの真髄と言えると思います。あまりに長くなるので今回は深くご紹介しませんが、別の機会にぜひお伝えさせていただきたいです。

 

意識せずに使い分けられるか?
役割分担に合わせて使えるか?
現場に沿った細やかな気づかいを磨く。

下池
ここまで「安定性」「安全性」について語ってきましたが、最後に一新したコントロールパネルについて触れさせてください。

 

鎌田
十数年の歴史あるコントロールパネルが、ついに…。

 

下池
これがSV-Basicで生まれ変わったコントロールパネルです!







ちなみに、これがACE01までのコントロールパネルです。



鎌田
操作性も大幅に進化しています。
しかも、これまでのコントロールパネルよりも改修しやすいよう開発しなおしていますので、今後お客様からいただくご意見を基に、さらにユーザビリティを改善していく計画です。

 

下池
見た目や操作性だけではなく、コントロールパネルを利用するシーンに合わせて、 担当者様ご自身も使いやすく、他の担当部門にも任せやすいように設計している点もグッドポイントです。

 

例えば、
「ウェブはマーケティング担当者が、メールは人事部門で管理している」
「ウェブは制作会社に運用を任せたい、メールは総務部門での管理に任せたい」 と言った場合にコントロールパネルが一つしかない、ウェブもメールも設定できてしまう、のでは、使いにくい、CPIではどうですか?というご質問をいただく機会があります。

 

SV-Basicでは、
・ウェブ/メールを統合し、一括管理できるアカウント
・ウェブだけのアカウント
・メールだけのアカウント
を用意しています。

 

鎌田
ACE01の時からご評価いただくポイントですね。
不必要な機能が使えないほうが安心ですし、実際に問題が起こった場合も影響が限定的になるので、安全でもあります。実際の現場で重宝されていると伺っていますので、ぜひ試してみていただきたいですね。

 

最後に

下池
「SV-Basic」の魅力をまだまだ語り足りないところではありますが、今回、このくらいで。 鎌田さん、いかがですか?

 

鎌田
そうですね。では最後に一つだけ。

 

専門知識に詳しくなければ活用できないサービスではなく、知識がなくても、技術を意識することなく、高い安全性、安定性を手にしていただけるサービスであり続けたいと考えています。
だからこそ、今回のサービスでは大きくコンセプトを変更し、安全性や安定性にこだわり、運用時の手離れがいいサービスへと進化させました。

 

あなたの事業の発展に必要なサーバーは、SV-Basicかもしれません。

 

下池
ありがとうございます。
ここでは紹介しきれなかった特長点やサービスの機能、仕様をサービスサイトでご紹介中です。
「シェアードプラン SV-Basic」が気になった方は、ぜひサービスサイトをご確認ください!

WordPress『マルチサイト』#1 複数サイトを一括管理する便利な機能を紹介

$
0
0

WordPress『マルチサイト』#1 複数サイトを一括管理する便利な機能を紹介

WordPressのマルチサイト機能を導入すれば、複数のWebサイトを1個のWordPressで管理することができます。
マルチサイト機能は、企業のコーポレートサイトと採用情報サイトといった親子関係のあるWebサイトや、同じレイアウトで複数のエリア・ジャンルごとのブログをサブディレクトリで作る場合などにたいへん役に立ちます。

マルチサイト機能は、共用レンタルサーバー『ACE01』にインストールしたWordPressでも利用することができます。

今回の記事では、マルチサイト機能を使ってできることと、マルチサイトのメリットをご紹介いたします。

 

目次

 

  1. マルチサイト機能について
  2. マルチサイトの構成
  3. マルチサイトのメリット
    3.1 新しい WordPressを設置する手間が省略できる
    3.2 複数のWebサイトで共通のテーマを利用できる
    3.3 ログインユーザーを一括で登録・管理できる
    3.4 プラグインを一括で追加・管理できる
    3.5 他のWebサイトの投稿を簡単に出力できる
  4. 最後に

 

1. マルチサイト機能について

WordPressでWebサイトを作成していると、同じデザインのWebサイトを複数運営したいというケースがあると思われます。
例えば、イベント情報を紹介するブログを、東京のイベント情報サイトと、大阪のイベント情報サイトを別々のURLで運営したいといったケースです。

マルチサイトを使用しない構成

この場合、サーバーに東京用のWordPressと大阪用のWordPressを別々に設置して、それぞれのWordPressに同じテーマを入れれば実現することができます。

ただしその方法ですと、Webサイトのデザインを変更したくなった場合に、両方のサイトテーマを修正する必要があります。また、両方のWebサイトに全く同じ内容のページを作りたい場合に、それぞれの管理画面にログインして、それぞれ記事を作る必要があります。

Webサイトが2つや3つの場合はまだそこまで大変ではありませんが、47都道府県分のブログを管理するとなった時に行き詰まってしまいます。

このような事態を解決するために、WordPressにはマルチサイトという機能が標準で用意されています。
マルチサイト機能を使えば、1個のWordPressで複数のWebサイトを管理することができます。

 

2. マルチサイトの構成

 

サーバーに設置するWordPressは1個でOKです。WordPressのマルチサイト機能を有効化すると、複数のWebサイトを1個の管理画面で投稿・操作できるようになり、それぞれのWebサイトに対応する保存領域がデータベースに作成されます。

マルチサイトを使用した構成

それぞれのWebサイトで、異なるテーマを使用することも同じテーマを使用することも可能です。

同じテーマを使用している場合、参照するファイルも同じなので、1回の修正で一気に全てのWebサイトのデザインを変更することができます。

データベースは共通ですが保存領域(テーブル)が違うのでそれぞれのWebサイトの投稿が混ざりあうことはありません。
ただしデータベースは同じなので、別サイトの投稿情報を簡単に取得する方法もあります。

次の画像はマルチサイトを有効化したWordPressの管理画面です。
これまでの管理画面と一部メニューが変わっていたり、ヘッダーバーのメニューが増えていたりします。

左側メニューの「サイト」をクリックすると、Webサイトの新規追加やこのWordPressに登録されているマルチサイトの一覧、サイトのURLなどが確認できます。

それ以外は通常の管理画面とほとんど変わりません。

管理画面の操作方法については、次回以降に説明いたします。

 

3. マルチサイトのメリット

 

ここからは、マルチサイトを導入するメリットについて詳しく説明いたします。

 

3.1 新しい WordPressを設置する手間が省略できる

まず当然ですが、インストールするWordPressが1個でいいので、WordPressの新規設置・初期設定にかかる手間が省略できます。
WordPressのバージョンの更新も1回で全てのWebサイトに反映されますので、とても楽です。

 

3.2 複数のWebサイトで共通のテーマを利用できる

マルチサイト機能を利用した時に最もメリットを感じるのが、すべてのWebサイトで共通のテーマを利用できることです。
テンプレートファイルを編集したり、デザインやレイアウトなどを頻繁にカスタマイズする方は特にその効果を実感できると思います。
同じようなデザインのWebサイトを量産する際には、ぜひマルチサイト機能を試してみてください。

ただし、配布されているテーマによってはマルチサイト機能に対応していないものもありますので、導入の前にテーマの配布ページやドキュメントの注意書きを読むなどして事前に確認をしてください。

 

3.3 ログインユーザーを一括で登録・管理できる

複数人でブログの投稿・編集やWebサイトの管理を行う際に便利さを実感できる機能です。

サイトネットワーク画面(サイト全般に関する設定を行う画面)でユーザー名とメールアドレスを登録すると、全てのWebサイトでそのユーザーのアカウントが追加されます。

追加されたアカウントはWebサイトごとにユーザーのロール(役割)を設定できますので、
「Aさんはサイト1のみ投稿可能」
「Bさんはサイト1の管理者かつサイト2では投稿のみ可能」

といった複雑な設定を行うことも可能です。

ユーザーアカウントの管理はマルチサイト機能の中でも少し複雑なので、慣れるまでは少し苦労するかもしれませんが、すべてのWebサイトにユーザーを登録していくよりはるかに楽なので、ぜひ覚えて使いこなしてください。

 

3.4 プラグインを一括で追加・管理できる

サイトネットワーク画面で、使いそうなプラグインをあらかじめインストールしておくことで、すべてのWebサイトでプラグインが利用できるようになります。
また、各サイトでどのプラグインを有効化するのか選択することも可能です。

1つ1つのWebサイトにプラグインをインストールする手間が省けるだけでなく、すべてのWebサイトでプラグインのバージョンを揃えることができるので互換的にも便利です。

ただし、テーマと同様にマルチサイト機能に対応していないものもありますので、プラグインをインストールする前に必ずマルチサイトに対応しているか確認をしてください。

 

3.5 他のWebサイトの投稿を簡単に出力できる

switch_to_blog()関数を使えば、あるWebサイトに投稿された記事や固定ページを別のWebサイトでも出力することができます。
同じサーバーのデータベース上に存在する情報なので、REST APIなどを使って参照・出力するより簡単です。

サイトB、サイトC、サイトDに投稿された記事をサイトAで一覧表示するなど、親子関係があるサイトを作る際に特に便利な機能です。

 

4. 最後に

今回はWordPressのマルチサイト機能について、構成のイメージと導入するメリットをお伝えいたしました。

マルチサイト機能が役に立つケースは限られていますが、同一のサーバー上で複数のWordPressサイトを管理する機会があれば、ぜひ試してみてください。 

WordPress『マルチサイト』#2 複数サイトを一括管理する機能の導入方法

$
0
0

WordPress『マルチサイト』#2 複数サイトを一括管理する機能の導入方法

前回の記事で、複数のWebサイトを1つのWordPressで管理するマルチサイト機能でできることと、マルチサイトのメリットについてお伝えいたしました。

今回は、共用レンタルサーバー『ACE01』でWordPressのマルチサイト機能を有効にする方法と、WordPressに新しいWebサイトを追加する方法についてご説明いたします。

 

目次

 

  1. サイトネットワークの有効化
    1.1 メニュー「サイトネットワークの設置」の追加
    1.2 サイトネットワークの作成
    1.3 設定ファイルの変更
  2. 新しいWebサイトを追加する
  3. テーマのインストール~Webサイトごとにテーマを変更する
  4. 最後に

 

1. サイトネットワークの有効化

 

WordPressのマルチサイト機能を利用するためには、サイトネットワークの有効化を行う必要があります。

サイトネットワークというのは複数のWebサイトを束ねるものです。

サイトネットワークを有効化すると、これまでのサイトの管理画面に加えて、サイトネットワークの管理画面を表示・操作することができるようになります。

サイトネットワークの管理画面では、WordPressにWebサイトを追加したり、複数のWebサイトに横断的な設定を行ったりすることができます。

サイトネットワークを有効化する手順は少し複雑ですが、慣れれば5分ほどで完了できますのでぜひ覚えてみてください。

 

1.1 メニュー「サイトネットワークの設置」の追加

まず、インストール済みのWordPressの設定ファイルを変更して、サイトネットワークの管理画面に表示するようにします。

今回編集するファイル(wp-config.php, .htaccess)は、WordPressを動かすのに重要なファイルですので、ミスがあって動かなくなった時に復旧ができるよう、あらかじめバックアップをとっておいてください。

まず、wp-config.phpの、
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */
というコメントの直前に以下の1行を追加します。

wp-config.php

~略~
define('WP_DEBUG', false);
define('WP_ALLOW_MULTISITE', true);
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */
~略~

wp-config.phpを変更したら、WordPressの管理画面にログインしてください。
左側のメニュー「ツール」の中に「サイトネットワークの設置」というメニューが追加されていますので、クリックしてください。

サイトネットワークの設置

 

1.2 サイトネットワークの作成

クリックすると「WordPressサイトネットワークの作成」という画面が開きます。
※この画面を開いた時にプラグインが有効になっていると警告が出ますので、「プラグイン」メニューで全てのプラグインを停止状態にしてください。

WordPressサイトネットワークの作成

サイトネットワーク名は、今回は「サイトネットワーク1」とします。分かりやすい名前をつけてください。
サイトネットワーク管理者のメールアドレスは、あなたのメールアドレスを入力してください。

入力が終わったら「インストール」ボタンをクリックしてください。

 

1.3 設定ファイルの変更

サイトネットワークの作成が完了しましたら、自動的に「サイトネットワークを有効化中」という画面に移動しますので、指示された内容のとおり設定ファイルを変更してください。
変更する内容は各環境によって異なりますので以下はその一例です。

wp-config.php

~略~
define('WP_DEBUG', false);
define('WP_ALLOW_MULTISITE', true);
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', '●●●●●●●●●●.secure.ne.jp');
define('PATH_CURRENT_SITE', '/wp/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */
~略~

.htaccess

# BEGIN WordPress<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp/
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
</IfModule>
# END WordPress

設定ファイルの変更が終わりましたら、一度管理画面からログアウトして再度ログインしてください。
ダッシュボード上部のメニューバーに「参加サイト」が追加されていたら、サイトネットワークの有効化は完了です。

設定ファイルの変更

 

2. 新しいWebサイトを追加する

 

WordPressのマルチサイト機能を利用して、Webサイトを新規追加してみましょう。

Webサイトの追加や削除はサイトネットワークの管理画面から行いますので、まずサイトネットワークの管理画面に移動します。管理画面の上部にあるメニューバーの「参加サイト」にカーソルを当てると、一番上に「サイトネットワーク管理」というメニューが表示されますので、そこをクリックしてください。

サイトネットワークの管理画面に移動すると、左のメニューバーに「サイト」というメニューがあります。そこをクリックするとWebサイトの一覧画面が表示されます。
現在はデフォルトのWebサイトのURLが1つだけが表示されています。

左上の「新規追加」ボタンをクリックすると、「サイトを追加」というフォーム画面が表示されますので、ここに追加したいWebサイトの情報を入力していきます。

サイトを新規追加

サイトアドレス(URL)には、追加するWebサイトのサブディレクトリを考えて入力してください。
サイトアドレスは後で変更するのがとても難しいので、よく考えて設定してください。

サイトのタイトルは追加するWebサイトのタイトルです。こちらは後で簡単に変更ができます。

管理者メールアドレスは現在ログイン中のユーザーのメールアドレスを入力してください。

全て入力し終わったら、「サイトを追加」ボタンをクリックしてください。

サイトの一覧画面

さきほどのWebサイトの一覧画面に、追加したWebサイトのURLが表示されていれば完了です。

 

3. テーマのインストール~Webサイトごとにテーマを変更する

 

マルチサイトのメリットの一つに、サイトネットワークの管理画面でインストールしたテーマやプラグインを各Webサイトで使用できるというものがあります。

今回は2つのWebサイトの違いを際立たせるため、2. で新しく追加したWebサイトのテーマを変更してみましょう。

まず、サイトネットワークの管理画面から「テーマ」->「新規追加」を選択して、お好きなテーマを追加してください。テーマの追加方法は普段のWordPressと同じです。

サイトネットワークでの有効化まで終わったら、新しく追加したWebサイト(/site2)の管理画面に移動します。
上部メニューバーの「管理サイト」にカーソルを当てると、「サイトネットワーク管理」の下に2で登録したサイトタイトルが表示されますので、そこをクリックしてください。

普段のWordPressと同じように「外観」->「テーマ」を選択すると、サイトネットワークでインストールしたテーマが表示されていますので、それを有効化してください。

テーマを変更していない1つ目のWebサイトのトップページ

テーマを変更していない1つ目のWebサイトのトップページ

http://<ドメイン名>/wp/

 

テーマを変更した2つ目のWebサイトのトップページ

テーマを変更した2つ目のWebサイトのトップページ

http://<ドメイン名>/wp/site2/

 

ご覧のとおり、各サイトの管理画面で行ったテーマの変更は、そのサイトのみに反映されています。

 

4. 最後に

 

今回はWordPressのマルチサイト機能について、サイトネットワークの有効化と初期設定、サイトネットワーク管理画面の見方、そしてWebサイトの追加方法をご説明いたしました。

マルチサイトには1つのWordPressで複数のWebサイトを管理できる以外にも色々な機能があります。
とても奥が深いので、この機能を使ってどのようなことができるのか、ぜひ調べて使いこなしてみてください。

WordPress『WP-CLI』#1 コマンドラインを使ってできること

$
0
0

WordPress『WP-CLI』#1 コマンドラインを使ってできること

WordPressにテーマやプラグインを追加したい、本体のバージョンの更新をしたい、ブログの記事を書きたい。そういった場合には、管理画面にログインして操作を行うのが一般的です。

しかし、管理するWordPressの数が多い場合、一つ一つのサイトの管理画面にログインして、本体やテーマ、プラグインを更新して…とやっていると、けっこう時間がかかってしまいます。

あるいはWordPressを新しく設置するたびに、毎回同じテーマやプラグインをインストールして、有効化して…といった手順が面倒くさいと思ったことはありませんでしょうか?

こういったお悩みを解決するために、WordPressの操作がコマンドラインから実行することができる『WP-CLI』というライブラリがあります。

WordPressの操作をコマンドラインから実行できれば、スクリプトを組んで色々な操作を自動化することもできます。
今回は、WordPressの新規設置や各種更新作業の助けになり、アイデア次第で様々な場面に活用できる、WP-CLIについてご説明いたします。

 

目次

 

  1. WordPress本体の更新
  2. テーマのインストール・変更
  3. プラグインのインストール・有効化
  4. ブログ記事の投稿・変更・削除
  5. タグの作成、ブログ記事にタグを追加する
  6. 最後に

 

1. WordPress本体の更新

 

WordPressはセキュリティ対策や機能追加などで、バージョンのアップデートが頻繁に行われます。

WordPress本体の更新は管理画面にログインして行いますが、大量のWordPressを管理している場合は、バージョンが新しくなるたびに全てのサイトにログインして更新の作業を行わなければなりません。これはとても面倒なので、ついついバージョンを更新しないまま使い続けることも多いと思われます。

そこでWP-CLIのcore updateコマンドを実行すると、管理画面にログインする必要もなく、コマンドラインから簡単にWordPress本体のバージョンを更新することができます。

php-7.1 wp-cli.phar core update

コマンドは手動で実行するだけではなく、スクリプトを作成して定期実行することもできます。
作成したスクリプトを定期実行すれば、毎更新をチェックして自動でアップデートするといったことが可能です。

以下はWordPress本体更新用のスクリプトの作成例と定期実行の設定方法です。

update_wordpress.php(新規作成)

<?php
exec('/usr/local/bin/php-7.1 /usr/home/ai1020kw9c/html/wp/wp-cli.phar core update');

共用レンタルサーバー『ACE01』の場合は、ウェブコントロールパネルの「公開サイト用設定」->「スクリプト定期実行ツール」で定期実行の設定ができます。

作成したスクリプトを選択して、例えば実行スケジュールを「毎日」「5時00分」に設定すると、毎日午前5時にWP-CLIのcore updateコマンドが実行され、バージョンのアップデートがある場合はWordPress本体の更新が行われます。

スクリプト定期実行ツール

 

2. テーマのインストール・変更

 

次に、WP-CLIを使ってWordPressテーマのインストールを行う方法をご紹介します。

テーマのインストールはtheme installコマンドを実行します。

php-7.1 wp-cli.phar theme install <テーマのスラッグ>

 

テーマのスラッグは、テーマの公開ページのURLから調べることができます。

テーマの公開ページのURL

 

コマンドを実行すると、テーマのダウンロードとWordPressへのインストールが開始されます。

コマンド実行画面

次に、インストールしたテーマをWebサイトに適用するには、theme activateコマンドを実行します。

php-7.1 wp-cli.phar theme activate <テーマのスラッグ>

theme list コマンドを実行すると、WordPressにインストールされているテーマの一覧とバージョンを表示することができます。

php-7.1 wp-cli.phar theme list

コマンド実行画面

update の列を確認して、テーマの新しいバージョンがリリースされている場合は、テーマのバージョンを更新したほうがいいです。
theme update コマンドを実行すると、指定したテーマが最新バージョンに更新されます。

php-7.1 wp-cli.phar theme update <テーマのスラッグ>

 

3. プラグインのインストール・有効化

 

続いてはコマンドラインからWordPressにプラグインをインストールする方法です。

プラグインのインストールはplugin installコマンドを実行します。

php-7.1 wp-cli.phar plugin install <プラグインのスラッグ>

 

プラグインのスラッグは、プラグインの公開ページのURLから調べることができます。

プラグインの公開ページURL

 

インストールしたプラグインを有効にするには、plugin activateコマンドを実行します。

php-7.1 wp-cli.phar plugin activate <プラグインのスラッグ>

コマンドは手動で実行するだけでなく、スクリプトを作成して実行することもできます。
WordPressを新しく設置した際に毎回入れるプラグインをまとめてインストール(有効化)するスクリプトを作って使い回せば、今後の初期設定が非常に楽になります。

wordpress_plugin_install.php(新規作成)

<?php
exec('/usr/local/bin/php-7.1 /usr/home/ai1020kw9c/html/wp/wp-cli.phar plugin install custom-post-type-ui');
exec('/usr/local/bin/php-7.1 /usr/home/ai1020kw9c/html/wp/wp-cli.phar plugin install tablepress');
exec('/usr/local/bin/php-7.1 /usr/home/ai1020kw9c/html/wp/wp-cli.phar plugin install wordpress-seo');

作成が終わったらスクリプトを実行すると、まとめてプラグインがインストールされます。

php-7.1 wordpress_plugin_install.php

plugin list コマンドを実行すると、WordPressにインストールされているプラグインの一覧とバージョンを表示することができます。

php-7.1 wp-cli.phar plugin list

コマンド実行画面

update の部分を確認して、プラグインの新しいバージョンがリリースされている場合は、plugin update コマンドでプラグインを最新のバージョンに更新できます。

php-7.1 wp-cli.phar plugin update <プラグインのスラッグ>

プラグインのスラッグのかわりに、オプション「--all」を付けると、全てのプラグインの更新が行われます。

php-7.1 wp-cli.phar plugin update --all

 

4. ブログ記事の投稿・変更・削除

 

WP-CLIはWordPressの設定変更だけでなく、コマンドラインからブログ記事を投稿したり、内容を変更したりすることもできます。

普通にブログを運営するだけでしたらなかなか使わない機能ですが、「他のWebサイトやファイルから情報を集めて自動投稿を行うスクリプトを作りたい」など、投稿を自動化したい場合にはとても役に立ちます。

まず、ブログ記事を投稿するにはpost createコマンドを実行します。

php-7.1 wp-cli.phar post create --post_title=<ブログのタイトル> --post_content=<ブログの本文> --post_status=publish

--post_titleにはブログのタイトルを、--post_contentにはブログの本文を記入します。
--post_statusはブログの投稿ステータスで、publishを指定すると公開状態で投稿されます。
下書きで公開したい場合は、--post_status=draftを指定してください。

ブログ記事の内容を変更するには post updateコマンドを実行します。

php-7.1 wp-cli.phar post update <投稿ID> --post_title=<ブログのタイトル> --post_content=<ブログの本文>

post createコマンドの時と違って、変更したいブログの投稿IDを指定するところに気をつけてください。

投稿IDはpost createを実行した時に表示されるほか、WordPressの管理画面でも以下のURLで確認することができます。

管理画面から投稿IDをURLで確認

ブログ記事を削除するには post deleteコマンドを実行します。

php-7.1 wp-cli.phar post delete <投稿ID>

post updateと同じように、削除したいブログの投稿IDを指定するところに気をつけてください。
削除したブログ記事はゴミ箱に移動されます。

 

5. タグの作成、ブログ記事にタグを追加する

 

WP-CLIでブログ記事を作成しましたので、次はタグを作成してその記事に設定してみましょう。

タグの作成はterm create コマンドを実行します。

php-7.1 wp-cli.phar term create post_tag <タグ名> --slug=<タグのスラッグ>

作成したタグをブログに設定するために、 post term addコマンドを実行します。

php-7.1 wp-cli.phar post term add <投稿ID > post_tag <タグのスラッグ>

タグを追加するブログ記事の投稿IDと追加するタグのスラッグをそれぞれ入力します。

“post_tag”の部分を“category”に変更すると、カテゴリを作成・追加することができます。

 

6. 最後に

 

今回はWP-CLIを使ってできることについて、いくつかご紹介しました。特にテーマ・プラグインのインストールは、一度スクリプトを作って使い回せばWordPressを新規設置する際の設定にかかる時間が短縮できます。

ユーザーの登録・削除やデータベースのダンプなど、今回紹介した他にもWP-CLIを使ってできることはたくさんあります。管理するWordPressの数が増えれば増えるほど役に立つWP-CLIをぜひマスターして使いこなしてください。

WordPress『WP-CLI』#2 インストール方法と使い方

$
0
0

WordPress『WP-CLI』#2 インストール方法と使い方

前回はWordPressをコマンドラインで操作できるライブラリ『WP-CLI』でできること(本体の更新、プラグイン・テーマのインストールと変更、ブログ記事の投稿など)をいろいろご紹介しました。

今回は共用レンタルサーバー『ACE01』に設置されたWordPressを実際に操作できるように、WP-CLIをインストールする方法についてご説明いたします。

インストール方法には、curlコマンドを使って直接ダウンロードする方法と、『ACE01』のファイルマネージャ機能でWP-CLIの実行ファイルを転送する方法の2種類がありますので、お好みの方法をお選びください。

 

目次

 

  1. curlコマンドを使ったインストール方法
  2. ファイルマネージャ機能を使ったインストール方法
  3. WP-CLIの動作確認
  4. WP-CLIの更新方法
  5. 最後に

 

1. curlコマンドを使ったインストール方法

 

curlコマンドは多くのUnix OSに標準搭載されているデータ転送のためのコマンドです。
curlコマンドは共用レンタルサーバー『ACE01』のコマンドラインからも実行できます。

インターネット上に公開されているWP-CLIの実行ファイルを、WordPressのインストールディレクトリにcurlコマンドを使って直接ダウンロードする方法を説明いたします。

 

まずTera Term等のターミナルでサーバーにSSH接続して、WordPressのインストールに移動します。

cd ~/html/<WordPressのインストールディレクトリ>/

次に、インターネット上に公開されているWP-CLIの実行ファイルのURLを指定してcurlコマンドを実行します。

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

ダウンロードが完了しましたら、WordPressのインストールディレクトリにwp-cli.pharというファイルが追加されます。lsコマンドで追加されているか確認してみましょう。

ls -l

これでWP-CLIのインストールは完了です。

 

2. ファイルマネージャ機能を使ったインストール方法

 

次に、共用レンタルサーバー『ACE01』のウェブコントロールパネルからファイルマネージャ機能を使ってWP-CLIをインストールする方法をご説明します。コマンドの操作が不慣れな方や視覚的に操作したい方はこちらの方法を試してみてください。

まずは自分のPCにWP-CLIの実行ファイルをダウンロードします。

以下のURLをウェブブラウザのアドレスバーに入力してアクセスすると、ダウンロードが始まります。
https://raw.github.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

ダウンロードが終わりましたら、ウェブコントロールパネルにログインして、
「公開サイト用設定」->「FTP/ファイル管理」->「セキュア・ファイルマネージャ」
の順にクリックしてください。

ファイルマネージャのログイン画面が表示されますので、以下の情報を参考にご自身のログイン情報を入力してください。

ファイルマネージャのログイン画面

お客様のドメイン名ウェブコントロールパネルの「お客様情報」->「プログラムのパスとサーバーの情報」を開いて表示される「公開ドメイン名」(~.ne.jp)
FTPアカウントFTPアカウントの設定」で作成したFTPアカウント名
※未作成の場合は事前に作成してください。
パスワード
「FTPアカウントの設定」の際に入力したパスワード

各情報を入力してログインボタンをクリックすると、ファイルマネージャ画面に移動します。

 

ファイルマネージャ画面1

ファイルマネージャ画面2

ファイルをアップロードするディレクトリを選択します。
画面のリンクをクリックして、WordPressのインストールディレクトリに移動してください。

 

ファイルマネージャ画面3

WordPressのインストールディレクトリまで移動しましたら、現在のディレクトリに表示されているパスがWordPressのインストールディレクトリのパスになっていることを確認してください。

次にファイルをアップロードします。画面の下の方に▼Localという箇所がありますので、そこのFile 01:「ファイルを選択」ボタンをクリックして、先ほどダウンロードしたWP-CLIの実行ファイル(wp-cli.phar)を選択します。

アップロードボタンをクリックすると、ファイルが共用レンタルサーバー『ACE01』のWordPressインストールディレクトリに転送されます。

 

3. WP-CLIの動作確認

 

1.または2.の手順で正しくWP-CLIのインストールが行われたかどうか、wp --infoコマンドを実行して確認します。

cd ~/html/<WordPressのインストールディレクトリ>/
php-7.1 wp-cli.phar --info

以下のように、PHPのバージョンやWP-CLIのバージョンなどが表示されましたら動作確認成功です。

WP-CLIのインストール完了

これでWP-CLIのインストールは完了です。

 

4. WP-CLIの更新方法

 

3. のwp --infoコマンドの実行結果でも確認できるように、WP-CLIの現在のバージョンは2.3.0です。

WP-CLIのバージョンが更新されたときは、wp cli updateコマンドを実行することで最新のバージョンにアップデートすることができます。

php-7.1 wp-cli.phar cli update

WP-CLIはWordPressの本体と違って、頻繁にバージョンが更新されることはありませんが、一度インストールした後は、コマンドを実行するだけで簡単にアップデートができます。

前回の記事で紹介したWordPress本体の更新やテーマ・プラグインの更新については、WP-CLIのバージョンを最新にしないと、過去のWP-CLIがリリースされた時点の最新までにしか更新できません。

ですので、WordPress本体の更新やテーマ・プラグインの更新を行う前に、WP-CLIも忘れずに最新バージョンに更新してください。

 

5. 最後に

 

今回はWP-CLIのインストールと使い方についてご説明しました。

WP-CLIのインストールはとても簡単ですので、ぜひご自身のWordPressにもインストールして、使いこなしてみてください。

WordPress『WP REST API』#1 ブログを他のサイトに埋め込む方法

$
0
0

はじめに

 

複数のWebサイトを運用していて、WordPressで投稿したブログの内容(タイトルやアイキャッチ、公開日など)を別のWebサイトにも表示させたいと思ったことはありませんか?
同じサーバー上でしたら読み込むのは簡単ですが、別のサーバー上にあるWordPressの投稿を参照するのは難しいです。

そこで今回は、WordPressに標準搭載されている『WP REST API』を使ってブログの内容を他のWebサイトに表示させる方法をご紹介します。
PHPを使わずJavaScriptとHTMLだけで実装できますので、表示させたい側のWebサイトのサーバーがPHPに対応していない場合も安心です。

 

目次

 

  1. 『WP REST API』について
  2. 『WP REST API』で最新のブログ一覧を取得する
  3. 他のWebサイトに最新のブログ一覧を表示させる
  4. 最後に

 

1. 『WP REST API』について

 

『WP REST API』は、WordPress上の特定のURL(エンドポイント)にアクセスすることで、WordPressに登録された様々な情報を参照(または更新)できる仕組みです。
元々は自分でインストールしないと使えないライブラリでしたが、WordPress4.7から標準搭載されるようになりました。

セキュリティ関係のプラグインを有効にしていると『WP REST API』が利用できない設定になっている可能性がありますので、今回の作業を始める前に一旦プラグインを無効にするか、プラグインの設定でWP REST APIの利用を許可するように変更してください。

『WP REST API』にはあらかじめたくさんのエンドポイントが用意されています。
今回はその中で、投稿を取得するエンドポイントを利用しましょう。

 

2. 『WP REST API』で最新のブログ一覧を取得する

 

本章では、実際に『WP REST API』でどのようなデータが取得できるのか、Webブラウザ上からエンドポイントにアクセスして試しに取得してみます。

投稿の情報を取得するエンドポイントは/wp-json/wp/v2/posts です。
このURLに「公開日」「公開状態」「投稿者」「カテゴリ・タグ」「取得する件数」「ソート順」などのリクエストパラメータを付与してアクセスすることで、目当ての記事の情報を取得することができます。

WordPressでテンプレートファイルを作成するのに慣れている方は、get_posts()と同じとイメージしていただければ理解しやすいと思います。

 

Webブラウザを開いて、アドレスバーに以下のURLを入力してください。

<WordPressのトップページ>/wp-json/wp/v2/posts?_embed

 

Webブラウザに以下の写真のように文字がたくさん表示されたら成功です。
これはブログの内容を「JSON」という形式にフォーマットしたもので、タイトルや本文、アイキャッチなどの情報が含まれています。

 

 

3. 他のWebサイトに最新のブログ一覧を表示させる

 

2.でブログの情報が取得できることが分かりましたので、この情報をJavaScriptで解析してブログ記事の一覧HTMLを生成する仕組みを作っていきます。
jQueryを使いますので、以下のサイトからjQueryのコアパッケージをCDNで読み込むためのタグをHTMLファイルに貼り付けしてください。

https://code.jquery.com/

 

 

リンクをクリックすると、<script>タグがポップアップで表示されます。

表示されたタグを、一覧を出力するHTMLファイルの<head>または<body>に貼り付けしてください。

右側の青いボタンをクリックするとタグがコピーされるので便利です。

 

まずブログ記事を表示させるページのHTMLファイルに、どの部分に記事を表示させるのか指定するためにid付きの<div>を追加してください。

 <div id="wordpress_blog"></div>

 

次に、『WP REST API』のエンドポイントにアクセスするための実装をJavaScriptに追加します。

<script>

$(function(){
  $.ajax({
      type: 'GET',
      url: '<WordPressのトップページ> /wp-json/wp/v2/posts?_embed',
      dataType: 'json'
  }).done(function(json){
    //TODO ここにHTMLを追加するための記述を書く
    alert( JSON.stringify( json ) );
  }).fail(function(json){
    console.error('WordPressのブログ記事取得に失敗しました。')
  });
});
</script>

 

jQueryのajaxメソッドを使って『WP REST API』のエンドポイントにアクセスしています。
type(アクセス方法)を「GET」にすることと、dataType(実行結果のデータ形式)を「json」に指定するの忘れないようにしてください。

アクセスに成功したらdoneの、失敗したらfailの引数に指定された関数がコールバックで実行されます。

上記のソースコードは、まずエンドポイントにアクセスできるかどうか試したいので、doneの内部で実行結果をアラートで表示するように実装しています。

変更を保存してWebブラウザで該当のページにアクセスしてください。
以下のようにアラートが表示されて、実行結果のJSON文字列が表示されればエンドポイントへのアクセスは成功です。

 

 

成功しましたら、今度は実行結果をもとにブログの情報を埋め込んでいくHTMLを作成します。
先ほどのスクリプトでTODOにしていたところを、以下のように変更してください。

 

<script>
$(function(){
  $.ajax({
      type: 'GET',
      url: 'http://<WordPressのトップページ>/wp-json/wp/v2/posts?_embed',
      dataType: 'json'
  }).done(function(json){
    var html = '';
    //記事の件数分イテレートする
    $.each(json, function( i, row ) {
 
      //ブログのタイトル
      var title = row.title.rendered;
      //ブログのURL
      var link = row.link;
      //ブログの本文
      var excerpt = row.excerpt.rendered;
      //サムネイル画像のURL
      var thumbnail
      if( row['_embedded']['wp:featuredmedia'] ) {
         thumbnail = row['_embedded']['wp:featuredmedia'][0]['media_details']['sizes']['full']['source_url']
      }
      html += '<article class="wp-article">';
      html += '<div class="eyecatch"><img src="' + thumbnail + '"></div>';
      html += '<h3><a href="' + link + '">' + title + '</a></h3>';
      html += '<p>' + excerpt + '</p>';
      html += '</article>';
    });
    //整形した記事の情報をページに追加する
    $('#wordpress_blog').append(html)
  }).fail(function(json){
      console.error('WordPressのブログ記事取得に失敗しました。')
  });
});
</script>

 

変更を保存して、再度Webブラウザで該当のページにアクセスしてください。
WordPressに投稿したブログの記事が該当のページに埋め込まれて表示されます。

 

最後にスタイルシートで見た目を整えて、完成です。

div#wordpress_blog {
    width: 100%;
    position: relative;
}
div#wordpress_blog > article.wp-article {
    width: 31%;
    margin-right: 3%;
    display: inline-block;
    vertical-align: top;
}
div#wordpress_blog > article.wp-article:nth-child( 3n ) {
    margin-right: 0;
}
div.eyecatch {
    border: 1px solid #000000;
    margin-bottom: 20px;
}
div.eyecatch > img {
    width: 100%;
    vertical-align: top;
    height: auto;
}

 

ブログの最新投稿5件を埋め込んだHTML

 

記事取得元のブログ(WordPress・トップページ)

 

 

4. 最後に

 

今回の記事では、『WP REST API』を使って他のWebサイトにWordPressのブログ記事を埋め込む方法を説明しました。

『WP REST API』には他にも色々な機能を持つエンドポイントが初めから用意されていますし、自分でエンドポイントを作ることもできます。ぜひ使いこなして、WordPressと他のWebサイトやアプリケーションの連携を試してみてはいかでしょうか?


WordPress『WP REST API』#2でオリジナルのエンドポイントを作成する

$
0
0

はじめに

前回の記事では、WordPressに標準搭載されている『WP REST API』の使用方法と、『WP REST API』のpostエンドポイントを使ってブログの内容を取得する方法についてご紹介しました。

今回は『WP REST API』に用意されているカスタムエンドポイント機能を使って、より使いやすいオリジナルのエンドポイントを追加して、思いどおりの情報を取得する方法をご紹介いたします。

エンドポイントの追加を行ってみることで、『WP REST API』がWordPressの内部でどのような動きをしているのかより深く理解することができます。

 

目次

  1. カスタムエンドポイント機能について
  2. エンドポイントを追加する
  3. 追加したエンドポイントにアクセスする
  4. 最後に

 

1. カスタムエンドポイント機能について

『WP REST API』はさまざまなエンドポイントがはじめから用意されていますが、それらのエンドポイントだけでは欲しい情報が得られないことがあります。
そういった場合に、オリジナルのエンドポイントを追加して、どのテーブルからどういう値を取得するかなどの処理を自由に実装できるカスタムエンドポイント機能が用意されています。

WordPressと他のシステムを連携させるために『WP REST API』が用いられることが多いですが、そのような場合にカスタムエンドポイント機能でエンドポイントを自作すれば、連携先のシステムのデータ形式に合わせて実行結果を自由に整形できるのでとても便利です。

また、カスタムエンドポイント機能が役に立つのはデータを参照する場合だけではありません。
『WP REST API』を通して複雑な処理(~~の場合は登録、~~の場合は削除など)を行いたい場合に、オリジナルのエンドポイントを作れば1度の呼び出しで全ての処理が完結します

 

次章では実際に「ユーザーの一覧とそのユーザーが投稿した記事の一覧を取得する」という機能のエンドポイントをWordPressに追加してみます。

 

2. エンドポイントを追加する

オリジナルのエンドポイントを作成するために、WordPressで現在適用しているテーマのfunctions.phpに追加するエンドポイントのURLの定義」「実行する処理」を追加していきます。

 

2.1 エンドポイントのURLを定義する

まずエンドポイントを実行するためのURLを定義します。
ここで定義するのは、(投稿を取得するエンドポイントの場合)/wp-json/wp/v2/postsの「/wp/v2/posts」にあたる部分です。

 

以下の内容を追加してください。

 

functions.php

/* ================================ *
   WP REST APIのオリジナルエンドポイント追加
 * ================================ */
  function add_rest_original_endpoint(){
    
    //エンドポイントを登録
    register_rest_route( 'wp/custom', '/posts_by_users', array('methods' => 'GET',
        //エンドポイントにアクセスした際に実行される関数
        'callback' => 'get_posts_by_users',
    ));
  }
  add_action('rest_api_init', 'add_rest_original_endpoint');

 

register_rest_route関数の第一引数「wp/custom」と第二引数「/posts_by_users」がエンドポイントのURLになります。

今回作成するエンドポイントのURLは
<WordPressのトップページ>/wp-json/wp/custom/posts_by_users
となります。

register_rest_route関数の第三引数に指定した配列の属性'callback'に、エンドポイントにアクセスした際に実行される関数名(get_posts_by_user)を文字列で指定します。

 

2.2 処理を実装する

 

2.1でコールバック先に指定したget_posts_by_user関数を作成して、処理の内容を実装していきます。
処理の内容は2.1と同じくfunctions.phpに追加していきます。
 
functions.php

function get_posts_by_users() {
  $args = array(
    orderby => 'ID',
    order => 'ASC',
    //ユーザー20人分のデータを上限とする
    number => 20,
  );
  //ユーザーの一覧を取得する
  $users = get_users( $args );
  
  $result = array();  
  if( $users ) {
    //ユーザーの件数分処理
    foreach( $users as $user ) {
      $postargs = array(
        author => $user->ID,
        numberpost => -1
      );
      //ユーザーが投稿したブログを全件取得する
      $post_list = get_posts($postargs);
      
      $post_results = array();
      //取得したブログの件数分処理
      foreach( $post_list as $tmppost ){
        //戻り値用にタイトルとURLだけを抜き出す
        array_push( $post_results, array(
          title => $tmppost->post_title,
          url => get_permalink( $tmppost->ID )
        ));
      }
      //データを戻り値用配列に追加する
      array_push( $result, array(
        //ユーザーID
        user_id => $user->ID,
        //ユーザーのニックネーム
        user_name => $user->display_name,
        //ユーザーの投稿したブログ情報一覧
        posts => $post_results
      ));
    }
  }
  return $result;
}

 

get_users関数でユーザー(上限20人)の情報を取得した後、それらのユーザーが投稿したブログをget_posts関数で取得するという処理です。

get_users関数やget_posts関数の実行結果には今回のAPIに不要な情報まで含まれますので、必要な情報(ユーザーID、ユーザー名、投稿したブログのタイトル、ブログのURL)だけを抜き出して戻り値$resultに設定しています

APIの実行結果として受け取れるのはJSONというデータ形式の文字列ですが、今回作成したget_posts_by_users関数の戻り値はPHPのオブジェクト(配列)をそのままreturnしてください。
※自動的にJSON文字列に変換されますので、json_encode関数を使って変換する必要はありません。

 

3. 追加したエンドポイントにアクセスする

 

まずは、2.で追加したオリジナルのエンドポイントにWebブラウザでアクセスしてみましょう。

<WordPressのトップページ> /wp-json/wp/custom/posts_by_users

 

JSON文字列で、ユーザーの情報とブログの情報が取得できていることを確認してください。

取得できていない場合は、URLが間違っていないか、2.の実装が間違っていないかを確認してください。

 

確認できたら、つぎはJavaScriptを利用して、オリジナルのエンドポイントからデータ取得し、ユーザーごとの投稿一覧をWebブラウザの画面に表示してみましょう。

<script>
$(function(){
  $.ajax({
      type: 'GET',
      url: 'http://acedemo2018026.secure.ne.jp/wp/wp-json/wp/custom/posts_by_users',
      dataType: 'json'
  }).done(function(json){
    var html = '';
    //ユーザーの件数分イテレートする
    $.each(json, function( i, row ) {
      html += '<article class="wp-article">';
      //ユーザー名
      var name = row.user_name
      html += '<h3>' + name + 'の投稿一覧</h3>';
      var posts = row.posts;
      if( posts.length > 0 ) {
        for( i = 0; i < posts.length; i++ ) {
          html += '<p><a href="' + posts[i].url + '">' + ( i + 1 ) + ':' + posts[i].title + '</a></p>';
        }
      } else {
         html += '<p>投稿はありませんでした</p>';
      }
      html += '</article>';
    });
    $('#wordpress_blog').append(html)

  }).fail(function(json){
    console.error('WordPressのブログ記事取得に失敗しました。')
  });
});</script>

 

$.ajaxのurlに2.で追加したオリジナルのエンドポイントのURLを指定します。
あとは実行結果に合わせてHTMLを組み立てていくだけです。

 

4. 最後に

 

今回は『WP REST API』のカスタムエンドポイント機能を使ってオリジナルのエンドポイントを追加する方法をご紹介いたしました。


『WP REST API』のエンドポイントは(カスタムエンドポイントを含めて)リクエストパラメータを指定することも可能です。例えば、指定したユーザーID(またはユーザー名)に一致するユーザーの投稿情報を取得する、といった処理を実装することも可能です。

リクエストパラメータとカスタムエンドポイントを組み合わせれば、さらに自由度の高いエンドポイントの処理を実装することができますので、ぜひ調べて使いこなしてみてください。

【WordPress】WordPress『MW WP Form』 入力欄の複合条件でエラーを表示する方法

$
0
0

はじめに

WordPressでサイトにお問い合わせやお申し込みのフォームを設置するときによく使われるプラグインに『MW WP Form』があります。

『MW WP Form』は送信前確認の画面を表示する機能や管理者にメールを送る機能などが標準で備わっている、とても便利なプラグインです。
リファレンスが日本語で書かれているため利用者が多く、国内では『Contact Form 7』の次にメジャーなプラグインです。

このように便利な『MW WP Form』ですが、複数の入力項目を組み合わせて入力チェックを行う機能が備わっていないのが欠点です。
複雑なフォームを作る場合に複合条件での入力チェックができないのは困りますよね。
そこで今回は、テーマのfunctions.phpファイルにバリデーションルールを書き加えるだけで『MW WP Form』で複合条件での入力チェックが実現できる方法についてご説明いたします。

 

 

目次

  1. 複合条件での入力チェックとは
  2. フォームの作成と一般的な入力チェックの設定
  3. バリデーションルールの追加
  4. 最後に

 

1. 複合条件での入力チェックとは

 

入力チェックとは、フォームの入力項目(テキストボックス、セレクトボックス、ラジオボタンなど)に対して値が入っているか、入力した形式が正しいか、文字の長さが適切かなどを送信前にチェックして、誤りがあればエラーメッセージを出力して再入力を促す機能です。
そして、ある項目の入力(選択)内容に合わせて別の項目のチェックルールが変わるのが複合条件での入力チェックです。

複合条件での入力チェックが必要になるのは、例えば以下のようなケースです。

・ 連絡先を入力するフォームで、「お電話」が選択された場合は<電話番号>が入力必須で、「メール」が選択された場合は<電話番号>は必須ではない。

 

『MW WP Form』は標準でさまざまなバリデーションルールが用意されていて、管理画面で入力項目ごとにどのルールを適用するか選択するだけで入力チェックの機能を実装することができます。
ただし、複数の入力項目をまたがったチェックは管理画面から設定することができませんので、オリジナルのバリデーションルールをPHPファイルに追加する必要があります。

 

2. フォームの作成と一般的な入力チェックの設定

 

まずWordPressの管理画面でフォームを作成します。
今回はフォームの作成の仕方については省略して、入力チェックの設定方法からご説明いたします。

 

このフォームの<お名前><連絡方法><メールアドレス>が入力必須項目で、<電話番号>は<連絡方法>が「お電話」の場合のみ入力必須項目にしたいとします。

まずは<お名前><連絡先><メールアドレス>の必須チェックの設定を行います。

上記の画像は<メールアドレス>に対して入力必須のチェックとメールアドレスの形式チェックを設定しています。
「バリデーションを適用する項目」に入力項目のname属性の値を入力して、バリデーションルールのチェックボックスを選ぶだけで、とても簡単です。
 

ラジオボタンの場合は「必須項目(チェックボックス)」を選択してください。

これで複合条件以外の入力チェックの準備ができました。

 

3. バリデーションルールの追加

 

3.1 フォームIDの確認

 ここからはテーマのfunctions.phpを編集して、2.で作成した入力フォームに新しいバリデーションルールを追加します。

その前に、2.で作成したフォームのIDを取得する必要があります。
IDは編集画面の「フォーム識別子」に記載されていますので、追加作業を始める前に確認してください。

 

3.2 functions.phpの編集

 テーマファイルのfunctions.phpにオリジナルのバリデーションルール my_required_phoneを作成します。

作成したバリデーションルールを『MW WP Form』のフィルターフックに追加(add_filter)することで、入力チェックの実行時に合わせて実行されます

 

functions.php

function my_required_phone( $validation, $data ) {
  $method = $data['method'];
  if( isset( $method ) && $method === 'お電話' ) {
    $validation->set_rule( 'phone', 'noEmpty', array( 'message' => '連絡方法に「お電話」を選択した場合、電話番号は必須です。') );
  }
  return $Validation;
}

add_filter( 'mwform_validation_mw-wp-form-9940', 'my_required_phone', 10, 2 );

$dataの中に入力された値が配列で入ってきますので、追加する入力チェックに使う値を取得します。
今回の場合は<連絡方法>のチェックした項目をもとに入力チェックを追加しますので、<連絡方法>のname属性(=”method”)を指定して値を取り出します。

新しいバリデーションルールの追加は$validation->set_ruleで行います。
$validationには管理画面で設定した標準のバリデーションルールがすでに格納されていますので、それにset_ruleでオリジナルのバリデーションルールを追加します。

set_ruleの第一引数にはチェックを行う入力項目のname属性を、第二引数にはルールを文字列で指定してください。ルールは『MW WP Form』の公式マニュアルに一覧が掲載されていますので、そちらをご覧ください。

https://plugins.2inc.org/mw-wp-form/manual/validation-rule/

set_ruleの第三引数には表示するエラーメッセージを指定します。

 

最後に作成したオリジナルのバリデーションルール my_required_phoneをフィルターフックに追加します。
追加するフィルターはmwform_validation_mw-wp-formですが、ここで気をつけなければいけないのは、フィルター名の最後に3.1で確認したフォームのIDを足す必要があるということです。

つまり、フォームのIDが「9940」ならフィルター名はmwform_validation_mw-wp-form-9940となります。

すべての追加が終わりましたら、functions.phpを保存して画面上から複合条件での入力チェックが正しく機能しているか確認してみましょう。

 

4. 最後に

 今回は『MW WP Form』を使って複数の入力項目をまたがったチェックを実装する方法をご紹介いたしました。オリジナルのバリデーションルールの追加は『MW WP Form』のカスタマイズの中でもPHPファイルを編集する必要があるため少しとっつきにくいですが、需要は多いのでぜひ覚えて使いこなしてみてください。

【WordPress】『MYSQL』クーロンを使用して定期的にバックアップをとる方法(初期設定)

$
0
0

はじめに

WordPressを利用する際には、必ずセキュリティに気をつけなければいけません。

セキュリティ対策においては、攻撃者の侵入を防ぐことも重要ですが、それと同じくらい重要なのが攻撃を受けたサイトをいち早く元の状態に復旧させるためのバックアップ体制が整っているかということです。

データベースのバックアップを定期的に取っておけば、悪意ある第三者にWebサイトを改ざんしたとしても、改ざん前の内容をすぐに復元することができます

今回は共用レンタルサーバー『ACE01』の「スクリプト定期実行ツール」機能を使って、WordPressで利用しているデータベースをバックアップする方法をご紹介します。

 

目次

  1. データベースのバックアップ
  2. 「スクリプト定期実行ツール」の設定
  3. データベースを復元する
  4. 最後に

 

1. データベースのバックアップ

 

データベースのバックアップを作成するためのスクリプトを準備します。

共用レンタルサーバー『ACE01』ではMySQLとPostgreSQLが標準でインストールされていますが、今回はWordPress推奨のMySQLデータベースを利用している場合の手順になります。

 

 

1.1     データベース名・ログイン情報の取得

 

まずWordPressで利用しているデータベースの名前と、データベースにログインするユーザー名・パスワードを事前に調べておきます。

分からない場合は、WordPressインストールディレクトリ直下のwp-config.phpをテキストエディタで開いて、以下の場所を確認してください。

 

wp-config.php

/** WordPress のためのデータベース名 */

define('DB_NAME', 'ai●●●●kw9c_wordpress');

 

/** MySQL データベースのユーザー名 */

define('DB_USER', 'ai●●●●kw9c');

 

/** MySQL データベースのパスワード */

define('DB_PASSWORD', '●●●●●●●●●');

それぞれ、「DB_NAME」がデータベースの名前、「DB_USER」がユーザー名、「DB_PASSWORD」がユーザーのパスワードにあたります。

 

1.2     スクリプトの作成

 

まず、ホームディレクトリにバックアップファイルを格納するためのディレクトリ(db_backup)をあらかじめ作成します。

mkdir ~/db_backup

上記コマンドの「~/」はホームディレクトリを意味するため、コマンドの実行はどこで行っても構いません。上記コマンドを実行後にホームディレクトリに「db_backup」が作成されているか確認してください。

 

次にWordPressインストールディレクトリ直下に定期バックアップを行うためのPHPスクリプトを新規作成します。

 wp-teiki-backup.php(新規作成)

<?php
//バックアップファイル名
$file_name = 'teiki-backup_' . date('YmdHis') .'.sql';
exec('/usr/local/bin/mysqldump -h 127.0.0.1 –u [ユーザー名] –p[パスワード] [データベース名] > /usr/home/<サーバーID>/db_backup/' . $file_name );

 

バックアップが成功するかどうか、スクリプトを実行して確認してみましょう。

cd ~/html/<WordPressのインストールディレクトリ>

php-7.1 wp-teiki-backup.php

 

バックアップに成功すると、先ほど作成した格納用ディレクトリにバックアップファイルが追加されます。

cd ~/db_backup

ls -l

~~出力結果~~

-rw-r--r--  1 ai●●●●kw9c  cst  185855 Oct  3 14:50 teiki-backup_20191003054951.sql

 

2. 「スクリプト定期実行ツール」の設定

 

1.で作成したスクリプトを、共用レンタルサーバー『ACE01』の「スクリプト定期実行ツール」機能を使って定期実行するよう設定します。

ウェブコントロールパネルにログインして、「公開サイト用設定」→「スクリプト定期実行ツール」を選択します。

写真を参考にして、次のように設定してください

・「新規登録」は先ほど作成したファイル(wp-teiki-backup.php)を選択。
・「PHPのバージョン」は7.1を選択。
・「実行スケジュール」はバックアップを行う日時を選択。
 (例:毎週日曜午前3時50分)

すべて設定が終わったら、「追加する」ボタンをクリックしてください。

 

3. データベースを復元する

 

ここまでバックアップファイルを作成する方法をご紹介しましたが、今度はバックアップしたファイルを利用して、データベースを復元する方法をご紹介します。

 

以下のコマンドを実行してください。

cd ~/db_backup

mysql -h 127.0.0.1 --user=[ユーザー名] --password=[パスワード] [データベース名] < teiki-backup_2019●●●●●●●●●●.sql

 

ユーザー名、パスワード、データベース名は1.1で取得したものと同じです。
コマンドの最後にバックアップファイル名を指定してください。

 

復元を行いますと、現在のWordPressの内容がバックアップを取得した時点の内容に戻ります。
一度復元を行いますと、復元前(現在)のWordPressの内容は完全に失われますので、コマンドは慎重に実行してください。

 

4. 最後に

 

今回はデータベースのバックアップを取得する方法と、スクリプトを作成して定期実行する方法についてご紹介いたしました。

定期実行の設定次第で毎日・毎時間バックアップを取得することも可能ですが、こまめにバックアップファイルを作成すればするほどサーバーのストレージ(ディスク)使用量が増えて空き容量が減っていきますので、週1~2回程度をおすすめします。

このように手動で行うのが面倒なバックアップの作業も、定期実行スクリプトを使えば簡単に自動実行の設定ができます。ぜひ一度試してみてはいかがでしょうか?

Viewing all 131 articles
Browse latest View live