イノベーション エンジニアブログ


株式会社イノベーションのエンジニアたちの技術系ブログです


このエントリーをはてなブックマークに追加

WordPressでプラグインを作ってみた その1

おはこんばんわ、中村と申します。
普段は自社サービスの開発に携わっております。

皆さんGW目前となり浮き足立っている方も多いのではないでしょうか?



仙台に行ってきます(笑)



今回は先日WordPressで会員機能プラグインを作ってみたお話をしてみようと思います。

その2書きました。

wordpress logo.png

要件

  • WordPressに会員機能を追加する

  • 会員は投稿記事をお気に入りに追加でき、一覧で見れるようにする

  • 会員データは自社サービスのDBへ保存させる

こんな感じ。
(最終的には全ページSSL化とか色々増えちゃいましたが)

自社サービスとの連携が必要なので、単純にプラグインを探してきてなんとかするのは難しく、エンジニアに依頼が来たという訳です。

今回はプラグイン作成〜ルーティング設定までを紹介していきます。

プラグインの構成

├── wp-admin/
├── wp-content/
│   ├── languages/
│   ├── plugins/
│   │   └── inno_membership/ ← ここにDIR作成
│   ├── themes/
│   └── uploads/
└── wp-includes/

wordpressでは上記のようなDIR構成になっていると思いますので、wp-content配下のplugins内に好きなDIRを作成しましょう。

今回は「inno_membership」にしてみました。 こんな感じのDIR構成にしてみます。

./inno_membership/
├── css/
├── js/
├── inno_membership.php ← ここはDIRと同じ名称にしておく
└── templates/
    ├── favorite.php
    ├── login.php
    ├── logout.php
    ├── setting.php
    ├── ...

今回はプラグインを有効にするとページ(固定ページと呼ぶもの)が追加されるようにしたいので、そちらに使うファイルをtemplates内に設置するようにしました。

またプラグインで使うCSSやJSなどもプラグインDIR内に設置することで、既存のテーマに影響しないように一応配慮してあります。

あくまでもプラグインで使うものはプラグインDIRに納めましょう。

inno_membership.phpには以下のような書式でコメントを書いておきましょう。

<?php
/*
Plugin Name: 会員機能
Description: ブログ用に会員機能のプラグインを作ってみる
Version: 0.0.1
Author: Nakamura
*/

この状態で管理画面へログインすると、プラグインとして認識してくれます。
なんだかいい感じ!

wp plugin image.png

んで、ここからが本題。

ルーティング設定

通常は固定ページを作る場合にはWordPressの管理画面から登録を行っていきますが、今回はプラグイン側で制御させます。

以下の2つのURLルールを追加していきます。

  • /member/favorite/ ⇒ ./templates/favorite.php

  • /member/login/ ⇒ ./templates/login.php

まずはルーティングを追加する関数を作成しましょう。
関数名はバッティングしないように「inno_」から始まるようにしてみます。

/*
* rewrite_ruleの追加
*/
function inno_add_rule() {
    add_rewrite_rule( '^member/([^/]+)/?', 'index.php?action=$matches[1]', 'top' );
    flush_rewrite_rules();
}

add_rewrite_rule() でルーティングの追加を行い、flush_rewrite_rules() で初期化を行います。

$action 変数で受け取りテンプレートを切り替えたいのですが、ここで

$action = $_GET['action'];

と記述しても受け取れないので注意!

まずはquery_varsに受け渡しを行う変数名を追加し…

/*
* $actionパラメータを受け取る準備
*/
function inno_add_query_vars( $vars ) {
    $vars[] = 'action';
    return $vars;
}

次にget_query_var()で値を取得する必要があります。(ちなみにハマりました)

/*
* パラメータによりファイルを切り替える
*/
function inno_front_controller() {
    $rule = get_query_var( 'action' );
    switch ( $rule ) {
        case 'favorite':
            include dirname(__FILE__) . '/templates/favorite.php';
            exit;
            break;

        case 'login':
            include dirname(__FILE__) . '/templates/login.php';
            exit;
            break;
    }
}

後はURLを判定し、条件に合えばファイルをincludeして終了させます。

実行タイミング

これらの関数を必要なタイミングで実行するようにします。

とくにflush_rewrite_rules() はルーティングの初期化を行うために処理に時間がかかるそうなので、プラグインが有効になったタイミングで1度だけ実行されるようにしておきます。

//必要な情報の受け渡しが出来るようquery_varsを追加
add_action( 'query_vars', 'inno_add_query_vars' );

//プラグイン側から特定のURLでアクセスできるように設定を追加
add_action( 'template_redirect', 'inno_front_controller' );

//プラグインを有効化した場合にURLルールを追加
register_activation_hook( __FILE__, 'inno_add_rule' );

まとめ

とりあえずここまでのコードをまとめておきます。

<?php
/*
Plugin Name: 会員機能
Description: ブログ用に会員機能のプラグインを作ってみる
Version: 0.0.1
Author: Nakamura
*/

//必要な情報の受け渡しが出来るようquery_varsを追加
add_action( 'query_vars', 'inno_add_query_vars' );

//プラグイン側から固定ページを作成したので、特定のURLでアクセスできるように設定を追加
add_action( 'template_redirect', 'inno_front_controller' );

//プラグインを有効化した場合にURLルールを追加
register_activation_hook( __FILE__, 'inno_add_rule' );


/*
* rewrite_ruleの追加
*/
function inno_add_rule() {
    add_rewrite_rule( '^member/([^/]+)/?', 'index.php?action=$matches[1]', 'top' );
    flush_rewrite_rules();
}

/*
* $actionパラメータを受け取る準備
*/
function inno_add_query_vars( $vars ) {
    $vars[] = 'action';
    return $vars;
}

/*
* パラメータによりファイルを切り替える
*/
function inno_front_controller() {
    $rule = get_query_var( 'action' );
    switch ( $rule ) {
        case 'favorite':
            include dirname(__FILE__) . '/templates/favorite.php';
            exit;
            break;

        case 'login':
            include dirname(__FILE__) . '/templates/login.php';
            exit;
            break;
    }
}

templates配下のファイルには通常のテーマファイルなどと同じように記述すれば、固定ページを作成できます。

今回はここまで!

次回は

今回はあえてclassなど作らず、デザイナーの方々でも分かりやすいようにしてみました。
そのため他の関数名と被らないように「inno_」を接頭語としてつけましたが、次回はこちらをclass化させていこうと思います。

普段はPHPをあまり触らないデザイナーなどにも是非挑戦していただきたいなと。

こちらからは以上です!