WordPressプラグインを拡張可能にする方法
公開: 2022-03-10プラグインを使用して、それが少し違うことをしたいと思ったことはありますか? おそらく、プラグインの設定ページの範囲を超えたユニークなものが必要でした。
私は個人的にこれに遭遇しました、そして私はあなたもそうしているに違いありません。 あなたがWordPressプラグイン開発者である場合、おそらくあなたのユーザーの何人かはあなたのプラグインを使用している間にこれに遭遇しました。
典型的なシナリオは次のとおりです。1つの小さな重要なことを除いて、必要なすべてを実行するプラグインがついに見つかりました。 その小さなことを有効にする設定やオプションはないので、ドキュメントを閲覧すると、それについて何もできないことがわかります。 WordPressプラグインのサポートフォーラムで機能をリクエストしますが、サイコロはリクエストしません。 最後に、それをアンインストールして検索を続行します。
あなたがこのプラグインの開発者だったと想像してみてください。 ユーザーが特定の機能を要求した場合はどうしますか?
理想的なのはそれを実装することです。 ただし、この機能が非常に特殊なユースケース向けである場合、それを追加することは実用的ではありません。 ユーザーの0.1%しか使用できないプラグイン設定があるのは良くありません。
大多数のユーザーに影響を与える機能のみを実装する必要があります。 実際には、ユーザーの80%が機能の20%を使用しています(80/20ルール)。 したがって、新しい機能が強く要求されていること、およびユーザーの80%がそれを実装する前にその恩恵を受けることを確認してください。 要求されるすべての機能の設定を作成した場合、プラグインは複雑になり、肥大化することになります。誰もそれを望んでいません。
最善の策は、プラグインをコードごとに拡張可能にして、他の人が自分のニーズに合わせてプラグインを拡張または変更できるようにすることです。
この記事では、プラグインを拡張可能にすることがなぜ良い考えであるかについて学びます。 また、これを行う方法を学んだヒントをいくつか紹介します。
プラグインを拡張可能にするものは何ですか?
一言で言えば、拡張可能なプラグインは、オブジェクト指向プログラミングのSOLID原則の「O」部分、つまりオープン/クローズ原則に準拠していることを意味します。
オープン/クローズの原則に慣れていない場合は、基本的に、他の人が何かを変更するためにコードを編集する必要がないことを意味します。
この原則をWordPressプラグインに適用すると、他の人がその動作を変更できるようにするプロビジョニングがプラグインに含まれている場合、プラグインは拡張可能であることを意味します。 これは、WordPressがWordPressのさまざまな領域に「フック」できるようにする方法と同じですが、プラグインのレベルです。
プラグインの典型的な例
そうでないサンプルプラグインから始めて、拡張可能なプラグインを作成する方法を見てみましょう。
最新の3つの投稿のタイトルを表示するサイドバーウィジェットを生成するプラグインがあるとします。 プラグインの中心にあるのは、これら3つの投稿のタイトルをリストタグでラップするだけの関数です。
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); $posts = get_posts( $args ); $output = '
- ';
foreach($ posts as $ post){
$ output。= '
- '。 $ post-> post_title。 ' '; } $ output。= '
このコードは機能し、仕事を成し遂げますが、それは完全に拡張可能ではありません。
なんで? 関数は独自の方法で設定されるため、コードを直接変更せずに動作を変更する方法はありません。
ユーザーが3つ以上の投稿を表示したい場合、または投稿のタイトルへのリンクを含めたい場合はどうなりますか? 上記のコードでそれを行う方法はありません。 ユーザーはプラグインの動作に固執し、プラグインを変更することはできません。
100の設定を含めることは答えではありません
上記のプラグインを拡張して、ユーザーがプラグインをカスタマイズできるようにする方法はいくつかあります。
そのような方法の1つは、設定に多くのオプションを追加することですが、それでも、ユーザーがプラグインに求める可能性のすべてを満たしていない可能性があります。
ユーザーが次のいずれかを実行したい場合はどうなりますか(シナリオは後で再検討します)。
- 特定のカテゴリのWooCommerce製品または投稿を表示します。
- 単純なリストとしてではなく、別のプラグインによって提供されるカルーセルにアイテムを表示します。
- カスタムデータベースクエリを実行してから、リスト内のそれらのクエリの投稿を使用します。
ウィジェットに100の設定を追加すると、上記のユースケースをカバーできるようになります。 しかし、これらのシナリオの1つが変更され、ユーザーが現在在庫のあるWooCommerce製品のみを表示したい場合はどうでしょうか。 これに対応するには、ウィジェットにさらに多くの設定が必要になります。 間もなく、膨大な数の設定があります。
また、設定の膨大なリストを備えたプラグインは、必ずしもユーザーフレンドリーではありません。 可能であれば、このルートから離れてください。
では、この問題をどのように解決するのでしょうか。 プラグインを拡張可能にします。
独自のフックを追加して拡張可能にする
上記のプラグインのコードを調べると、main関数が実行するいくつかの操作がわかります。
-
get_posts
を使用して投稿を取得します。 - 投稿タイトルのリストを生成します。
- 生成されたリストを返します。
他の人がこのプラグインの動作を変更する場合、彼らの作業にはほとんどの場合、これら3つの操作が含まれます。 プラグインを拡張可能にするには、これらの周りにフックを追加して、他の開発者が利用できるようにする必要があります。
一般に、これらはプラグインにフックを追加するのに適した領域です。
- 主要なプロセスの周辺および内部で、
- 出力HTMLを作成する場合、
- 投稿またはデータベースクエリを変更するため、
- 関数から値を返す前。
拡張可能なプラグインの典型的な例
これらの経験則に従って、プラグインを拡張可能にするために次のフィルターを追加できます。
-
get_posts
の引数を変更するためのmyplugin_get_posts_args
を追加します。 -
get_posts
の結果をオーバーライドするためにmyplugin_get_posts
を追加します。 - リストエントリの生成をカスタマイズするための
myplugin_list_item
を追加します。 - 返された生成されたリストをオーバーライドするための
myplugin_get_some_post_titles
を追加します。
すべてのフックが追加されたコードを次に示します。
function get_some_post_titles() { $args = array( 'posts_per_page' => 3, ); // Let other people modify the arguments. $posts = get_posts( apply_filters( 'myplugin_get_posts_args', $args ) ); // Let other people modify the post array, which will be used for display. $posts = apply_filters( 'myplugin_get_posts', $posts, $args ); $output = '
- ';
foreach($ posts as $ post){
//他の人にリストエントリを変更させます。
$ output。= '
- '。 apply_filters( 'myplugin_list_item'、$ post-> post_title、$ post)。 ' '; } $ output。= '
上記のコードはGitHubアーカイブでも入手できます。
ここにたくさんのフックを追加しています。サンプルコードは非常にシンプルで小さいため、実用的ではないように思われるかもしれませんが、それは私のポイントを示しています。4つのフックを追加するだけで、他の開発者はプラグインの動作をさまざまな方法でカスタマイズできます。
フックの名前空間とコンテキスト
先に進む前に、実装したフックに関する2つの重要な点に注意してください。
-
myplugin_
でフックの名前空間を作成しています。
これにより、フックの名前が他のプラグインのフックと競合しないようになります。 同じ名前の別のフックが呼び出されると、望ましくない影響が生じる可能性があるため、これは良い習慣です。 - また、コンテキストのすべてのフックで
$args
への参照を渡します。
これを行うのは、他の人がこのフィルターを使用してコードフローの何かを変更した場合に、その$args
パラメーターを参照として使用して、フックが呼び出された理由を把握し、それに応じて調整を実行できるようにするためです。
私たちのフックの効果
前に話したユニークなシナリオを覚えていますか? それらを再検討して、フックがどのようにそれらを可能にしたかを見てみましょう。
- ユーザーが特定のカテゴリのWooCommerce製品または投稿を表示したい場合は、フィルター
myplugin_get_posts_args
を使用して、プラグインが投稿をクエリするときの独自の引数を追加するか、myplugin_get_posts
を使用して投稿を独自のリストで完全にオーバーライドできます。 - ユーザーが単純なリストとしてではなく、別のプラグインによって提供されるカルーセルにアイテムを表示したい場合は、関数の出力全体を
myplugin_get_some_post_titles
でオーバーライドし、代わりにそこからカルーセルを出力できます。 - ユーザーがカスタムデータベースクエリを実行して、そのクエリの投稿をリストで使用する場合は、最初のシナリオと同様に、
myplugin_get_posts
を使用して独自のデータベースクエリを使用し、投稿配列を変更できます。
ずっといい!
フィルタの使用方法の簡単な例
開発者は、 add_filter
を使用して、上記のフィルターにフックできます(または、アクションにadd_action
を使用します)。
上記の最初のシナリオでは、開発者は次のようにして、作成したmyplugin_get_posts_args
フィルターを使用してWooCommerce製品を表示できます。
add_filter( 'myplugin_get_posts_args', 'show_only_woocommerce_products' ); function show_only_woocommerce_products( $args ) { $args['post_type'] = 'product'; return $args; }
アクションフックも使用できます
apply_filters
を使用する以外に、 do_action
を使用してコードを拡張可能にすることもできます。 2つの違いは、前者では他の人が変数を変更できるのに対し、後者では他の人がコードのさまざまな部分で追加機能を実行できることです。
アクションを使用する場合、基本的にプラグインのフローを他の開発者に公開し、他の開発者が連携して他のことを実行できるようにします。
この例では(ショートコードのみを表示しているため)役に立たない場合がありますが、他の例では役立つでしょう。 たとえば、拡張可能なバックアッププラグインがあれば、Dropboxなどのサードパーティサービスにもバックアップファイルをアップロードするプラグインを作成できます。
"素晴らしい! しかし、なぜプラグインを拡張可能にすることに気を配る必要があるのでしょうか?」
さて、あなたがまだそのアイデアで売られていないのなら、他の人があなたのプラグインの振る舞いを変更することを許可することがなぜ良いアイデアであるかについてのいくつかの考えがここにあります。
それはより多くのカスタマイズの可能性へのプラグインを開きます
ニーズは人それぞれです。 そして、プラグインがそれらすべてを満足させない可能性が高く、またそれらを予測することもできません。 プラグインを開いてプラグインの動作の重要な領域を変更できるようにすると、不思議に思うかもしれません。
それは人々がプラグインのコードに触れることなく変更を導入することを可能にします
他の開発者は、プラグインのファイルを直接変更する必要はありません。 プラグインのファイルを直接変更することは一般的に悪い習慣であるため、これは大きなメリットです。 プラグインが更新されると、すべての変更が消去されます。
他の人が使用できるように独自のフックを追加すると、プラグインの変更を外部の場所、たとえば別のプラグインに配置できます。 このようにすると、元のプラグインはまったく変更されず、何も壊すことなく自由に更新でき、他のプラグインのすべての変更はそのまま残ります。
結論
拡張可能なプラグインは本当に素晴らしく、多くのカスタマイズの可能性の余地を与えてくれます。 プラグインを拡張可能にすると、ユーザーや他の開発者はプラグインを気に入ってくれるでしょう。
WooCommerce、Easy Digital Downloads、ACFなどのプラグインをご覧ください。 これらのプラグインは拡張可能であり、WordPressのプラグインディレクトリにある他の多くのプラグインがそれらに機能を追加しているため、簡単にわかります。 また、プラグインのさまざまな側面を変更するさまざまなアクションフックとフィルターフックも提供します。 上で列挙した経験則は、それらの研究で出てきました。
プラグインを拡張可能にするためのいくつかのポイントを次に示します。
- オープン/クローズドの原則に従ってください。 他の人は何かを変更するためにあなたのコードを編集する必要はありません。
プラグインを拡張可能にするには、次の場所にフックを追加します。
- 主要なプロセスの周囲および内部で、
- 出力HTMLを作成するとき、
- 投稿またはデータベースクエリを変更するため、
- 関数から値を返す前。
- 名前の競合を防ぐために、フックの名前をプラグインの名前で名前空間化します。
- フックに関連する他の変数を渡してみてください。そうすれば、他の人がフックで何が起こっているのかを知ることができます。
- 他の人がそれらを知ることができるように、プラグインのフックを文書化することを忘れないでください。
参考文献
プラグインの拡張について詳しく知りたい場合は、次のリソースをご覧ください。
- WordPressプラグインを拡張可能にする方法、GitHub
この記事のすべてのサンプルコード。 - 「WordPressフックを使い始めるのに役立つヒント」、Thomas Maier、Smashing Magazine
- 「WordPressプラグインの作成方法」、Smashing Magazine、Daniel Pataki
- 「フック」、プラグインハンドブック、WordPress.org