こんにちは、AGESTでエンジニアをしているタカです。
今回の内容は 業務で開発したWordPressプラグインの開発Tipsです。WordPressは全世界におけるCMSシェア1位であり、用いられる言語は主にPHPとなります。個人としてのPHP使用歴は長いのですが、WordPressプラグイン開発は初めて行ったので知識の整理と共有の意味も込めて記事を書いてみました。

本記事におけるバージョン

本記事におけるソースコードのPHPは 8.0.26 、WordPressは 6.1.1 となります。なお、WordPressの最新バージョンのドキュメントについては下記を参照してください。

WordPress Developer Resources | Official WordPress Developer Resources

プラグイン開発の基本ルール

WordPressのプラグイン開発でまず知っておくべきこと、個人としてまず学んだことは下記になります。

  • プラグインのソースの設置場所
  • rootファイルの記述方法
  • コーディングのルール
  • WordPress独自関数(ライブラリ)

順番に解説していきます。

プラグインのソースを設置する場所

WordPressのプラグインは全て {WordPressのroot}/wp-content/plugins/にディレクトリを作り、その配下に置く必要があります。このとき、ディレクトリ名はプラグインの名称と同じものを作成します。ここでは仮に sample というプラグインを作ることにして、ディレクトリを作ってみます。なお、今回のWordPressのrootは /var/www/html/ とします。

cd /var/www/html/
mkdir sample
cd sample/

# 実際にはパーミッションを他のプラグインと併せておきますが、ここでは割愛します

rootファイルの記述方法

次にプラグインのrootとなるファイルを作成します。ファイル名はディレクトリ名と同様にプラグイン名となります。

touch sample.php

ファイルを編集し、下記のように add_action()という WordPressの関数を定義します。

<?php

/*
Plugin Name: sample
Description: サンプルプラグイン。
Version: 1.0
*/
add_action('init', function () {
	// 処理を書く
	
});

この関数は、特定のアクションが行われたときに動作する関数を割り当てるもので、第一引数に指定した initは、プラグインの初期化に使われるアクションです。第二引数は実行される関数を定義しますが、テストや環境変数のことを考えると、プラグインの本処理となるクラスのメソッドや関数を別で定義し、それを呼び出す実装にするのが良いかと思います。また、例のようなコメントを付与することで、WordPress管理画面のプラグイン画面に説明が追加されます。
まずはここまでの関数定義とコメント記述を行い、プラグイン画面に新たにプラグインが表示されているか確認してみましょう。

add_action('rest_api_init', function () {
    register_rest_route('sample/v1', '/samples', [
        'methods' => 'POST',
        'callback' => function () {
					// 処理を書く
        },
    ]);
});

なお、add_action()を複数定義することで、複数のアクションに関する処理を実装できます。上記は、REST APIを新たに定義するadd_action()で、プラグインを有効化することで新たにREST APIのURLを生成できます。なお、この例の場合のAPIのURLは、https://{FQDN}/wp-json/sample/v1/samples になります。

コーディングのルール

WordPressには公式のコーディング規約が存在します。

概ね一般的なコーディング規約であるPSR-2に沿っていますが、個人的にはクラスファイル名のルールやヨーダ記法は少し使いづらいかな?と思うものがありました。いくつか気になるものをピックアップします。

* ファイル名はアルファベットの小文字を使用して、内容を説明する名前にしてください。単語はハイフンで区切ります。
* クラスファイルの名前はクラス名を基にして、前に「class-」を付け、クラス名内部のアンダースコアはハイフンで置き換えます。
* 変数、アクション、関数の名前にはアルファベット小文字を使います。
* camelCase は使いません。単語はアンダースコアで区切ります。(スネークケース)
* ヨーダ記法を用いる

公開されているプラグインのソースはこの規約に沿っているものもありましたが、全てを沿っているとも言い難かったため、あくまで一つの目安として、チーム内やPJでルールを決めて取り入れていくのが望ましいかと思います。(特に公開しないプラグイン)

WordPress関数(ライブラリ)の理解

最後に、WordPressの関数のうち、頻出と思われるものを解説します。なお、基本的には最新ドキュメントも読んだ上で使用してください。メールアドレスからユーザー情報を取得する

$email = "メールアドレス";
$user = get_user_by('email', $email);

例えばログインフォームなどから得たメールアドレスのユーザーが登録済の場合、$userに様々な情報を持ったWP_Userオブジェクトが返却されます。第一引数は、emailではなく、id (ユーザーID)などを指定することで、別の手段でWP_Userオブジェクトを得ることもできます。ユーザーを新規登録する

$user_id = wp_create_user("ユーザー名", "パスワード", $email);

// エラー判定
if (is_wp_error($user_id)) throw new \\Exception($user_id->get_error_message());

任意のユーザー名、パスワードを指定してWordPressの新規ユーザーを作成できます。メールアドレスは任意指定です。なお、作成が成功するとユーザーID、失敗するとWP_Errorオブジェクトが返ってくるので、エラー判定として is_wp_error()関数を用いて、もしWP_Errorオブジェクトだったら何か処理を行います。この関数のように、戻り値の型が1種類では無い場合があるので、例外処理やエラー発生時の処理を行う必要があるかをドキュメントやWordPressのソースを見ておきましょう。
ログインさせる、ログアウトさせる

// ログイン
$user = wp_set_current_user("ユーザーID");

wp_set_auth_cookie($user_id, true, true);
do_action('wp_login', $user->user_login, $user);

// ログインしているかどうか調べる
if (is_user_logged_in()) {
	// ログアウト
	wp_logout();
}

WordPressのログインはsessionとCookieを用いて管理しており、ログイン処理はそれらに値をセットする処理を行います。ユーザーIDは、WP_Userオブジェクトが持つ id プロパティを用いるか、 wp_create_user()の戻り値を用いることが多いかと思います。ログアウトは逆にsessionとCookieを削除する処理を行います。
メタデータに保存する、取得する


// 保存
update_user_meta($user_id, "カラム名", "データ");

// 取得
get_user_meta($user_id, "カラム名", true);

wp_usermetaテーブルというユーザーに紐づく任意のデータを保存・取得する処理です。カラム名はテーブルの meta_key、データはその値を指します。戻り値は、第三引数がtrueの場合はメタデータの値が、falseの場合は配列が返却されます。
任意のテーブルからデータを取得する

global $wpdb;
$query = "データを取得するSQL";
$results = $wpdb->get_results($query, ARRAY_A);

任意のテーブルのデータはグローバルオブジェクト変数 $wpdb を使用して取得します。wpdbクラスのインスタンスには、上記のようなデータ取得のメソッドが定義されています。

おわりに

今回の内容は以上となります。記事中に載せた通り、ドキュメントやGitHub上のWordPress関数のソースを読み込んで理解を深める時間がそれなりに必要でしたので、開発する際は意識して読んで不具合を防いでいきましょう。次回は、別の関数の解説や、環境構築、UnitTestなどについても解説していきたいと思います。

<おすすめ記事・メディア>

・ECサイトを構築したら物流サービスも必要ですよね? EC事業者の物流アウトソーシングならオープンロジがおすすめです オープンロジ

SHARE

  • facebook
  • twitter

SQRIPTER

AGEST Engineers

AGEST

記事一覧

AGESTのエンジニアが情報発信してます!

株式会社AGEST

  • 新規登録/ログイン
  • 株式会社AGEST
#TAGS人気のタグ
RANKINGアクセスランキング
NEWS最新のニュース

Sqriptsはシステム開発における品質(Quality)を中心に、エンジニアが”理解しやすい”Scriptに変換して情報発信するメディアです

  • 新規登録/ログイン
  • 株式会社AGEST