ホームページ > CMS チュートリアル > &#&プレス > WordPress用のAdvanced OOP:REST APIエンドポイントのカスタマイズ

WordPress用のAdvanced OOP:REST APIエンドポイントのカスタマイズ

William Shakespeare
リリース: 2025-02-09 13:12:14
オリジナル
540 人が閲覧しました

Advanced OOP for WordPress: Customizing REST API Endpoints

(この記事はもともとTorque Magazineによって公開され、許可を得て転載しました。) 近年、著者は、トルクマガジンでオブジェクト指向のPHPおよびWordPress REST APIに関する多くの記事を書きました。これには、依存関係管理と自動荷重、および単体テストのために作曲家を使用することも含まれます。すべての記事の中心的なポイントは、WordPress開発に確立されたソフトウェア開発のベストプラクティスを適用することにより、より良いプラグインを作成できます。

これは、これらの概念を実用的で機能的な例に統合する一連の記事の最初のものです。 WordPressプラグインを作成する方法を説明して、WordPress REST APIエンドポイントの機能を変更して、検索をより最適化します。プラグインはGitHubで利用できます。私のビルドプロセスを理解するために、コミットログを閲覧する必要があるかもしれません。

このシリーズでは、最新のオブジェクト指向PHPを使用してプラグインとクラスを構築する方法と、テスト可能にする方法と、自動テストを作成する方法について説明します。ユニットテスト、統合テスト、受け入れテストの違いをカバーし、各タイプのテストの書き込みと自動化の方法を示します。この記事では、最初にオブジェクト指向の方法を使用して、フィルターを使用してWordPress REST APIを変更する方法を紹介します。

キーポイント

オブジェクト指向PHPを使用してWordPress REST APIエンドポイントを強化し、検索機能を向上させ、ElasticSearchなどの高度な検索ツールと統合します。

    REST APIエンドポイントパラメーターとWP_QUERYインタラクションを変更して、デフォルトのWordPress検索の制限をバイパスし、複雑なクエリの応答品質を向上させます。
  • 単体テスト、統合テスト、および受容テストを使用して、各コンポーネントがWordPressエコシステムで正しく実行されることを確認します。
  • 依存関係の注入とPHP特性を使用して、クラスの依存関係をきれいに管理し、メンテナンスとテストコードを容易にします。
  • REST APIエンドポイントモードをカスタマイズして、より柔軟で強力な検索機能を可能にするための追加のパラメーターを含めます。
  • 特定のREST API要求を使用してWP_QUERYパラメーターを動的に調整し、フィルターを使用して検索結果とエンドポイントの動作を効果的に改善します。
  • post_type
  • REST APIを使用したWordPress検索の改善

通常、SearchWPやRelevansiなどのプラグイン、またはElasticSearchとの統合(WordPressとはまったく異なるスタックを使用するテクノロジー)との統合を使用して、WordPress Searchを改善します。これらのタイプのプラグインは、より良い検索結果を提供し、多面的な検索インターフェイスでよく使用されます。これは、eコマースアプリケーションに非常に役立ちます。 WordPress REST APIを検索して、これらすべての同じ問題と同じソリューションを継承します。この投稿では、最初に検索の仕組みとその制限を紹介します。次に、検索を変更し、2つの異なる方法を使用してSearchWPと統合する方法を検討します。

WordPressの組み込み検索機能には、通常、外部サービスを使用して改善が必要です。この記事は、WordPress REST APIの投稿ルーティングがどのように機能するかを変更するためのオブジェクト指向のアプローチに関するものですが、実際の例は検索を改善することです。

WordPressがフロントエンド(VUE、React、またはAngularを使用して構築されるネイティブモバイルアプリケーションやWebアプリケーションなど)を切り離すためのバックエンドとして使用される場合、残りの部分で高品質の検索を行うことが重要ですAPI。この記事に示されているコードは、アプリケーションユーザーが適切な製品バリアントを見つけたり、複数の分類法に基づいて複雑なアルゴリズムに基づいてコンテンツを検索したり、プラグインをインストールする代わりにカスタムコードを作成したりする必要がある場合に役立ちます。

WordPress REST APIを使用して投稿を検索します

1つのサイトに投稿タイプの「製品」を含むすべての投稿を検索する場合は、「Taco Shirts」の検索用語を使用すると、 endpointにリクエストを行います。結果の品質を向上させたい場合は、上記のソリューションが役立ちます。 /wp/v2/product?s=Taco Shirt 上記のように、

wp_query(WordPress REST APIの投稿エンドポイントで使用されるもの)は、適切な検索ツールではありません。より具体的には、wp_queryは、mysqlに依存するため、nosqlデータベースを使用して構築される傾向がある専用の検索ツールよりも低くなる可能性が低い場合があります。

最初に、REST APIリクエストを行うときにWP_QueryのWordPressデータベースとの相互作用をバイパスする方法を見てみましょう。

これは、独自の検索システムの結果を置き換えるために多くの検索プラグインが使用する戦略です(wp_queryのデフォルトで生成されます)。検索システムは同じデータベースを使用できます。また、ElasticSearchやApache Solrサーバーなど、API要求を介して他のデータベースに接続することもできます。

WordPressコアコードを見ると、フィルター「post_pre_query」がwp_queryクエリデータベースの前に実行されるが、SQLクエリの準備ができた後に実行されることがわかります。このフィルターはデフォルトでnullを返します。値がNULLの場合、WordPressはデフォルトの動作を継続します。WordPressデータベースをクエリし、結果をWP_POSTオブジェクトの単純な配列として返します。

一方、このフィルターの戻り値が配列(WP_POSTオブジェクトを含めることを希望する)である場合、WordPressのデフォルト動作は使用されません。

post_pre_queryを使用してシミュレートされたwp_postを返す方法を見てみましょう。この戦略はテストに非常に役立ちますが、同じスキーマのより複雑なバージョンを使用して、別のデータベースをWordPressサイトと統合できます。

この例では、モックデータを使用していますが、SearchWPのクエリクラスなどを使用できます。このコードについて注意すべきもう1つのことは、WordPress REST APIによって作成されたWP_QUERYオブジェクトだけでなく、wp_Queryで実行されることです。 WordPress REST APIリクエストでない限り、フィルターを使用しないように変更しましょう。

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
WordPress REST APIエンドポイントパラメーターを変更

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
WordPress REST APIリクエストのために生成された検索結果を変更する方法を検討しました。これにより、クエリを最適化して検索結果を向上させることができますが、エンドポイントの異なるパターンが必要になる可能性があります。

たとえば、

製品エンドポイントの検索を許可したい場合は、オプションで他の投稿タイプを検索に含めることを許可する場合、昨年同じ問題の別のソリューションを紹介しました。

水平フォーカス

許可されたエンドポイントパラメーターを変更する方法と、WP_QUERYパラメーターを作成するためにそれらを使用する方法を検討しようとしています。これらは2つの個別の懸念であり、単一の責任の原則は、各懸念に対してクラスを作成する必要があると述べています。しかし、これらの2つのクラスは懸念を共有します。

たとえば、さまざまな投稿タイプでクエリを許可する場合は、どのパブリックポストタイプと、SLUGおよびREST_BASEパラメーターが何であるかを知る必要があります。このすべての情報は、関数get_post_typesから入手できます。

この関数の出力は、まさに必要なものではありません。それでは、クラスを設計して、私がリストしたばかりの要件に従ってデータをフォーマットし、アクセスするヘルパーの方法を提供しましょう。

利用可能なコンテナで使用する必要があるすべてのポストタイプデータの共通の形状と考えてください:

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
クラスでget_post_types()を呼び出す代わりに、コンストラクターを介して注入された依存関係として使用することに注意してください。したがって、このクラスは、WordPressをロードせずにテストできます。

これが、私がこの種類を「ユニットテスト可能」と表現する理由です。それは他のAPIに依存しておらず、副作用について心配することはありません。別の孤立したユニットとしてテストできます。フォーカスを分離し、その機能を小さな部分に分離し、ユニットテストのカバレッジを取得したら、コードを維持しやすくすることができます。次の投稿でこのタイプのクラスをテストする方法について説明します。

このクラスはwp_post_typeに依存していることを忘れないでください。統合テストのみがWordPressまたはその他の外部依存関係を使用できるため、私の単体テストではクラスを定義しません。このクラスは、アクションを実行するためではなく、データを表すためにのみ使用されます。したがって、その使用には副作用がないと言えます。したがって、実際のWP_POST_TYPEの代わりに、ユニットテストでモックを使用したいと思います。

依存関係の注入について言えば、この新しいクラスのオブジェクトを必要とするクラスは、同じパターンに従いたいと考えています。それらを必要とするクラスにredidposttypesをインスタンス化する代わりに、私たちは例を通過します。これは、rediverPosttypesとreportPosttypeを使用したクラスが分離されたままであり、個別にテストできることを意味します。

また、依存関係の注入を可能にし、このオブジェクトのプロパティを設定する必要があるため、コードの再利用を引き起こす可能性があります。カットと貼り付けを使用することも、PHP特性を使用して、クラス間でメソッドとプロパティをコピーするためのより高度で拡張可能な方法です。

これは、predPosttypesオブジェクトを他のクラスに注入するためのパターンを確立する特性です。

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

私たちの懸念の1つは、複数の場所でポストタイプに関する情報を知る必要があることです。たとえば、ポストタイプのスラグ。これは、以前のクロスカットの懸念とはわずかに異なります。最後に解決した問題には、動的データが含まれます。これで、1つの場所で複数の場所で使用する文字列を変更する必要があります。

クラス定数を持つクラスは、私たちにとってこの問題を単純に解決しました:

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここで、コード全体でこれらの文字列を一貫させることができます。これは不必要なステップのようです。しかし、私のサンプルコードは投稿のポストタイプで動作します。使用している投稿タイプを変更する場合は、このクラスを変更せずに変更する必要があります。これは、トム・マクファーリンが「クラスには変更する理由が1つしかないはずです」と書いたときの単一責任原則の好ましい定義に従っています。

REST APIエンドポイントモードを変更します

次に、ポストタイプのエンドポイントのパターンを変更する必要があります。そうすることで、WordPressはREST APIエンドポイントに、Post Typeパラメーターが許可され、リクエストを解析するときに新しいエンドポイントパラメーターが許可されることを通知します。

これは、post_typeプロパティを追加するクラスです。説明したばかりの特性useSspreparedPosttypesを使用していることに注意してください。

このプロパティの設定では、このプロパティが配列プロパティであることをWordPressに伝え、配列の「列挙」インデックスを使用して許可された値を指定します。
// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

「enum」では、許可された値を列挙します。この場合、PredPosttypesクラスは、これが以前に解決されたクロスカットの懸念であるため、許可された値の配列を提供します。

このクラスは、ポストタイプまたはこの特定のユースケースと結合されていないことに注意してください。すぐに、このクラスを特定のポストタイプで機能させるために使用するフックに戻ります。

REST API WP_QUERYパラメーターを変更します

前のセクションでは、新しいエンドポイントプロパティPOST_TYPEを利用可能にする方法について説明します。これは、実際には、WordPress REST APIによって生成されたWP_QUERYパラメーターを変更しません。最後のフィルターを除いて、すでに必要なものはすべて揃っています。

投稿タイプは、Coreコードが特にREST APIリクエストの変更を許可しないWP_QUERYパラメーターです。動的に名前が付けられたフィルター-Rest _ {$ post_type} _Query - wp_queryパラメーターをオーバーライドできます。

これは私たちのクラスであり、Post_Typeパラメーターを注入しますが、以前は許可されていませんでした。

そのほとんどは、変更を行う必要があることを確認し、wp_rest_requestのget_paramメソッドを使用してリクエストから値を取得することです。そのほとんどは、最初に一致するようにパターンを変更するため、自動です。

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

WordPress REST API

によって要求されたwp_queryオブジェクトを変更します この記事の最初の部分でこれを行う方法についてはすでに取り上げました。これは同じパターンを実装するクラスです。

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このコードはWordPressと密接に関連しており、テストできないことに気付いてください。 WordPressのWP_POSTを使用します。WordPressは、WordPressの定数をチェックし、WordPressのプラグインAPIと対話しています。 wp_postをシミュレートでき、定数を自分で設定できます。しかし、プラグインのAPI-これはテストする必要がある重要な機能です。次のいくつかの投稿では、このクラスをリファクタリングする方法については、そのフィルターを削除する効果以外のすべてをカバーし、統合テストを使用してその効果を確認できるように、このクラスをリファクタリングする方法について説明します。

2つの理由で静的方法を使用することを選択しました。まず、複数の場所で簡単に追加して削除できます。たとえば、ModifyQueryクラスでは、必要に応じてこのフィルターのみをフックします。

また、このフィルターを使用するときに再帰ループを作成するのは簡単です。この例コードのように簡単に削除できるのは素晴らしいことです。
// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

静的方法を使用することを選択したもう1つの理由は、関数が他のAPIと相互作用することです。本当にユニットテスト可能なものになることはありません。このパターンは、静的な方法を備えたクラスであり、統合テストでクラスを簡単にシミュレートすることができるため、このシステムの一部での強い分離の欠如の影響を最小限に抑えます。

すべてのコンテンツを一緒に動作させる

これまで見たコードは、WordPressから非常に組み合わされています。これには多くの利点があります。しかし、それはそれ自体で何もしないことを意味します。これはとても良いです。これまでのところ、ビジネスロジック要件のみを扱ってきました。次に、統合を検討する必要があります。

これは難しくありません。フックを追加するだけです。どんなフック? ModifyQueryおよびModifyschemaクラス用に設計したのとまったく同じ2つのフック。ビジネスロジックを切り離したいという欲求は、公開インターフェイスを設計する際にコードを作成する実際の理由を考慮することができないという意味ではありません。それ以外の場合は、理由もなくコードに余分な複雑さを追加するだけです。

一般的に言えば、私はソフトウェアの複雑さをそれが人生を楽にするときにのみ増加しようとします。私は過去にこの道から逸脱しました。私たちは皆それを持っています、それは重要ではなく、赦しを練習します。

フックしようとしているクラスのメソッドは、まったく同じパラメーターとフックとまったく同じパラメーターを使用します。彼らの仕事は、これらの値を他のコンポーネントに割り当てることです。

// ... (代码示例与原文相同) ...
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
次のステップ:テスト

これは十分に近いです。それは機能します。フックを追加するための正式なシステムがないため、これは初期化のためにできる最善のことです。これはとても良いです。 WordPress統合テストに関する将来の記事で、より複雑でスケーラブルなブートプロセスを作成する方法について説明します。

この記事では、スキーマ、wp_queryパラメーター生成、および投稿タイプを変更するコードを作成するための基礎となるwp_queryを調べます。このコードをプラグインに変換し、自動負荷にコンポーザーを使用することをお勧めします。私の次の投稿では、これらのクラスをカバーするためにユニットテストを調べます。

(以下は元のFAQパーツであり、擬似オリジナルの作成は元のコンテンツに基づいて行われています)

ワードプレスの高度なOOPおよびカスタムREST APIエンドポイントに関するFAQ WordPressのオブジェクト指向プログラミング(OOP)の意味は何ですか?

オブジェクト指向プログラミング(OOP)は、「オブジェクト」を使用してアプリケーションとソフトウェアを設計するためのプログラミングパラダイムです。 WordPress環境では、OOPは複雑なアプリケーションを開発するためのシンプルで効率的で堅牢な方法を提供します。開発者は、関連するタスクをクラスやオブジェクトにグループ化できるようになり、コードの読み取り、再利用、保守が容易になります。 OOPは、データをカプセル化し、直接的な外部アクセスを防ぐことにより、アプリケーションセキュリティを強化します。

WordPressでREST APIエンドポイントをカスタマイズする方法は?

WordPress REST APIは、さまざまなタイプのデータに対してデフォルトエンドポイントのセットを提供します。ただし、これらのエンドポイントをカスタマイズしたり、特定のニーズに合わせて新しいエンドポイントを作成したりできます。これは、プラグインまたはテーマのregister_rest_route()関数を使用して実行できます。この関数を使用すると、エンドポイントのルートまたはURLを指定し、応答する方法(取得、投稿など)を定義できます。

WordPress REST APIエンドポイントをカスタマイズすることの利点は何ですか?

カスタムWordPress REST APIエンドポイントを使用すると、より効率的で柔軟な、安全なアプリケーションを作成できます。エンドポイントによって返されたデータを調整して、ネットワーク上で送信される不要なデータの量を減らすことができます。また、フォームの送信やレポートの生成など、特定のタスクを実行するエンドポイントを作成して、アプリケーションをよりインタラクティブでユーザーフレンドリーにすることもできます。

OOPはWordPressアプリケーションのセキュリティをどのように強化しますか?

oopは、データとメソッドをオブジェクトにカプセル化することにより、WordPressアプリケーションのセキュリティを強化します。これは、オブジェクトのプロパティ(データ)とメソッド(関数)が残りのアプリケーションから隠され、オブジェクトのメソッドからのみアクセスできることを意味します。これにより、不正アクセスとデータの操作が防止され、セキュリティ侵害のリスクが減少します。

oopをWordPressの古いバージョンで使用できますか?

はい、WordPressの古いバージョンでOOPを使用できます。ただし、WordPressの新しいバージョンがOOPのサポートを改善し、このパラダイムを使用して開発を容易にするための多くの機能を含んでいることに注意することが重要です。したがって、OOPは古いバージョンで使用できますが、一般的に、WordPressの最新バージョンを使用して、最良の開発エクスペリエンスを使用することをお勧めします。

OOPのクラスとオブジェクトの役割は何ですか?

oopでは、クラスはオブジェクトを作成するための青写真またはテンプレートです。オブジェクトが持つべきプロパティ(データ)とメソッド(関数)を定義します。一方、オブジェクトはクラスのインスタンスです。同じクラスの他のオブジェクトとは異なる可能性のある独自のプロパティと方法のセットがあります。クラスとオブジェクトを使用すると、コードがより整理され、再利用可能で、メンテナンスが簡単になります。

WordPressで新しいクラスを作成する方法は?

classキーワードを使用して、クラス名と巻き毛のブレースのセットを使用して、WordPressで新しいクラスを作成できます。括弧では、クラスのプロパティと方法を定義できます。クラスのオブジェクトを作成するには、{}キーワードに続いてクラス名を使用できます。 new

WordPressのREST APIは何ですか?

WordPressのREST APIは、HTTPリクエストを使用してWordPressサイトと対話できるインターフェイスです。 Get、Post、Put、Deleteなどの標準のHTTPメソッドを使用してアクセスできる投稿、コメント、ユーザーなど、さまざまな種類のデータのエンドポイントのセットを提供します。 REST APIを使用すると、外部アプリケーションからWordPressサイトからデータを作成、読み取り、更新、削除しやすくなります。

WordPressでREST APIにアクセスする方法は?

対応するエンドポイントにHTTPリクエストを送信することにより、WordPressのREST APIにアクセスできます。各エンドポイントは特定のタイプのデータに対応し、特定のHTTPメソッドをサポートします。たとえば、投稿リストを取得するには、/wp/v2/postsエンドポイントにGETリクエストを送信できます。 REST APIはJSON形式でデータを返し、アプリケーションで処理および表示できます。

ワードプレス以外のアプリケーションでREST APIを使用できますか?

はい、WordPress以外のアプリケーションでREST APIを使用できます。 REST APIはプラットフォームに依存しています。つまり、HTTPリクエストを送信してJSONデータを処理できるアプリケーションで使用できます。これにより、WordPressサイトをモバイルアプリ、デスクトップアプリ、その他のWebサービスなどの他のアプリケーションと統合するための強力なツールになります。

以上がWordPress用のAdvanced OOP:REST APIエンドポイントのカスタマイズの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート