web-dev-qa-db-ja.com

いくつのフィルタ/アクションフックは健康的ですか?

私のプラグインを拡張可能にすることは、ほとんどの人の問題を解決するための次の方法です。そして、もっと動的にするためにたくさんのフィルタやアクションフックをあちこちに配置できることを私は知っています。しかし、私にとっては、それは面倒です。

最近私のプラグインのユーザーが最後にツールチップのテキストを変更するよう依頼しましたが、彼らの場合はそれほど悪い理由ではありません。そのページには6-8個のツールチップがあります。それぞれにフィルタフックを配置できることは知っています。しかし、私はいいですか?

多くのフックを配置することに関して何か問題、パフォーマンスの問題はありますか?

7
Mayeenul Islam

フックに何もフックされていない限り、それらはノーオペレーションです。つまり、ほとんど何も実行されず、ランタイムに大きな影響はありません。 areフックされ、a)の呼び出しがあると、まったく異なります。

文字列のカスタマイズについて説明しているので、良い例はコアのgettextフックです。ローカライズされたすべての文字列が通過します。

理論上これは非常に柔軟なフックであり、ほとんどどこでもテキストをフィルタリングできます。 実際には発火する可能性があります数千何回もフックしてしまうと、複雑なサイトをすぐに停止させてしまいます。

特定の実装を推奨するほど十分に詳細にユースケースをカバーしていない。一般に、これを整理する方法には複数の選択肢があります。

  • apply_filters( 'prefix_tooltip', $text )は基本的なケースです。フィルターは、コンテキストを決定するためにテキストが正確に一致するかどうかを把握する必要があるため、脆弱です。
  • apply_filters( 'prefix_tooltip', $text, 'type/location' )追加の引数を使用すると、ツールチップのタイプを指定でき、どのフィルターをターゲットにできます。したがって、テキストが変更されても、タイプはそれを識別します。
  • apply_filters( 'prefix_tooltip_' . $type, $text )動的なフック名。変数値で変化します。これは、多くの/生成された型の場合に非常に柔軟です。問題は、主に動的フックがコード内で発見するのが難しく、自己文書化がはるかに悪いことです。
  • apply_filters( 'prefix_tooltips', $texts_array )完全なset使用されるツールチップの単一フィルター。

6〜8エントリのカウントでは、これらの間に有意なパフォーマンスの違いはほとんどありません。

ここで学ぶことが重要なのは、そこにどのようなアプローチがあるかですareそして、あなた自身と下流の開発者にとって有意義で便利なものにするために、あらゆる場合に最も適切なものを慎重に選ぶ必要があります。

6
Rarst

ここには本当に2つの質問があります。1.フックを持つことの影響は何ですか?あなたはちょうどどこでもフックを広げるべきである

  1. 影響はゼロに近くなります。 action/filterにフックしたものが何もなければ、do_action/apply_filtersの呼び出しはほぼ即座に返されるので、フックを使用しない人々に大きな影響を与えることはないので、それらを追加することは技術的に悪いことではありません。あなたがコアにフックを追加することに何らかの合理的な理由を与えるなら、それはたぶんコアテーマによって追加されるでしょう)。

  2. しかし、ソフトウェア開発のプラクティスとしては賢いのでしょうか。いいえ。フックはAPIであり、APIは長期的にそれらを維持するというあなたの側のコミットメントを意味します。そのため、あなたが作成した "公式の" APIのように、長期的にはあなたのプラグインにとって意味のあるものであると考えるべきであり、あなたはただ一人のプラグインユーザーを幸せにするためにそれをしません。

説明から、カスタマイズが必要なテキストがあると思われる場合は、そのために何らかの設定画面を使用することを検討してください。これは明らかにある種のAPIでもありますが、エンドユーザーにとってはより見やすくアクセス可能です。

3
Mark Kaplun

カスタマイズは常につまずきます(苦痛なプロセス)。一方から私たちは常に重要なユーザーからの本当の要求(問題)を持っています。その一方で、この追加オプションのすべてがあなたの素敵なテーマ、プラグイン、あるいは抽象的な製品を地獄に向けることができます。それでは、開発者として何ができるでしょうか。

まず第一に。 拡張可能なコードを書く あなたのコードの一部を変更する機会を得て - 再利用可能なコード。クラス、インタフェース、トレイト、そして単に間違ったコードを小さなメソッド(関数)に分割するだけです。一部のユーザーは、製品を変更することなく簡単に使用できます。例えば、誰かが自分のニーズに合わせてウィジェットを作成し、内部プラグイン関数please_echo_the_plugin_awesome_stuff()を使うことができます。

新しいフィルタとアクションを追加することは悪い考えではありません 。 JetpackやbbPressのような一般的なプラグインの多くは、コード内に何百ものフィルタを持っています。時には過度に。ハンドラを持たないそれぞれの新しいフィルタ(またはアクション)は、通常、大きなオーバーヘッドをかけません。それはマイクロ秒です。

10 ^ −3秒ミリ秒ms 10 ^ −6秒マイクロ秒µs

さらに重要なことは、add_action()またはadd_filter()を介して新しいハンドラを追加することによって、このアクションに対して行っていることです。たとえば、データベースサーバへの要求(get_option()による自動ロード以外のオプションの取得など、わかりにくい場合もあります)。そしてあなたはそれを測定することができます。最も簡単な例:

$start = microtime(true);
// Do some stuff here
$end = microtime(true);
echo $start, PHP_EOL, $end, PHP_EOL, $end - $start, PHP_EOL,

コードのプロファイルを作成するのは、非常に単純で、時には最も適切な手法です。ちなみにWordPressには「ストップウォッチ」が内蔵されており、timer_start()timer_stop()をチェックアウトしてください。

あるいはXDebugを使うこともできます。設定が非常に複雑に見えるかもしれません。しかし、 _ vvv _ またはその他のすぐに使えるサーバーを使用できます。それらのすべてはすでに適切にXdebugを設定していて、あなたはそれを使うことができます - 素晴らしいですね。 VVVを使用している場合は、いくつかのコマンドを押すだけです。

vagrant ssh
xdebung_on

それで全部です!自分のIDEに切り替えて、自分のコードをプロファイルします。またはWebGrindのようなVVV内部サービスを使用してください。このテクニックについての詳細は Code Debugging Wiki にあります。 Xdebugを使用するとパフォーマンスに影響することを忘れないでくださいが、遅いコードを見つけることができます(ボトルネック)。

そして三番目。最後のこと。 WordPressの哲学は 決定であり、Options ではありません。

3