フックの優先順位に制限はありますか?


9

フィルターフックまたはアクションフックで他のすべてのフックを上書きしたい場合は、優先度を割り当て999ます。ただし、最近、優先順位に極端な値を使用する人20000もいます。99999

この高い優先度を使用するのはばかげているという事実に加えて、それらは実際に機能しますか?フックの優先順位に制限はありますか?制限を超えるとどうなりますか?極端な優先度を使用するとパフォーマンスに違いがありますか?

更新: @harke、スタックオーバーフローで数が制限されることを示唆ていますPHP_INT_MAX


これについて話した@hakreの Answerにリンクしていませんか?それはQの一部である必要があり、さらに、彼が与えたリードに従ってください、彼は1つまたは2つのことを真剣に知っていると
思い

あなたはどの答えに言及していますか?
シア

回答:


13

制限やパフォーマンスの低下はありません。その理由を理解するには、すべてのフックがWPエコシステムにどのように格納されるかを理解する必要があります。

まず最初に、すべてのフックがどこに保存され、どのように実行されるかを理解する必要があります。フィルターとアクションのすべてのフックはと呼ばれるグローバル変数に保存されwp_filter、はいはいアクションフックもこの変数に保存されます。この変数は関連付けられた配列です。keyはアクションまたはフィルターの名前、valueは別の連想配列です。たとえば、「init」アクションを見てみましょう。この段階では、次の構造が表示されます。

$wp_filter = array(
    'init' => array(...),
);

このサブ配列には、配列として数値キーと値があります。数字キーは私たちの優先事項です。数値キーに関連付けられた配列には、同じ優先順位のフックのリストが含まれています。したがって、を呼び出しadd_action( 'init', 'wpse8170_my_first_init', 20 )、次にを呼び出しadd_action( 'init', 'wpse8170_my_second_init', 20 )、最後にを呼び出すadd_action( 'init', 'wpse8170_my_third_init', 10 )と、例は次のようになります。

$wp_filter = array(
    'init' => array(
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
    ),
);

とき今、initアクションがトリガーされたすべてのフックはの使用にソートされksort、今の機能と私たちの配列になります。

    array(
        10 => array(
            'wpse8170_my_third_init' => array(...),
        ),
        20 => array(
            'wpse8170_my_first_init' => array(
                'accepted_args' => 1, // the number of accepted arguments by your hook
                'function' => 'wpse8170_my_first_init', // callback function
            ),
            'wpse8170_my_second_init' => array(...),
        ),
    ),

そして、すべてのフックはこのキューで実行されます:最初'wpse8170_my_third_init'に、'wpse8170_my_first_init'そして最後に'wpse8170_my_second_init'

したがって、制限やペナルティがないこと、そしてPHP環境によって関連付けられた配列のキーとして許容される任意の値を使用できることがわかります。


2
max( $priorities ) + 1最後の数値がに等しい場合は失敗しPHP_INT_MAXます。その場合、値を文字列に変換して何かを追加する必要があります。
fuxia

@toschoはい、同意します。ボーナススニペットを更新しました。
Eugene Manuilov 2013年

2
「ボーナス」は、$wp_filterこれまでの定義が変わる場合に備えて、悪い考えです。プラグインで直接使用するためのものではありません。私たちは過去に変更を加えました(主にパフォーマンス上の理由で、ついでに)。
Andrew Nacin 2013年

@AndrewNacinわかりました。質問が多すぎるため、削除しました:)
Eugene

6

これは整数なので、32ビットのPHPシステムでは-2147483648〜2147483647に制限され、64ビットのPHPでは-9223372036854775808〜9223372036854775807に制限されます。

編集:パフォーマンスの低下はありません。整数です。

しかし...真剣に?:)


整数だとわかりましたが、実際のフックメカニズムについて話していました。フックが大きすぎるとフックが完全に失敗し、コールバックが実行されないと人々が言うのを聞いたことがあります
shea

WHO?いつ?これは単に配列へのインデックスであり、スパース配列なので、影響はほとんどありません。しかし正直なところ、大きな数字は問題を理解していないことを示すかなりの指標です(例:熱狂的にはうまくいくかもしれない何かを必死にしようとしている!)
webaware

1

@shea-WordPressアクションは、あなたが想定した反対の方法で正確に機能します。優先度の高い数値は他の値を上書きすることはなく、PHP_INT_MAXの使用は、このアクション/フィルターを他のどの値よりも先に実行させる「極端な」試みではありません。

アクション/フィルターを実行順序のトップに配置するには、優先度0を使用する必要があります。

PHP_INT_MAXは単に反対側にあります。他のすべての(通常の優先度)フックが完了した後でアクション/フィルターを実行する場合に使用します。


1
うん、それはまさにアイデアです。フックで実行される最後のフィルターは、それ以上の変更を心配することなく変数を変更できます
shea

負の整数値もに使用できるため$priority、優先順位でフックされたコールバック0は必ずしも実行順序の先頭にあるとは限りません。
Dave Romsey、2018年

0

制限はなく、パフォーマンスの低下はありません。コードを調べることから、優先順位として文字列を使用することもできますが、私はそうすることはお勧めしません;)

アクションを最後にする必要がある$wp_actions[your hook]場合は、アクションが呼び出されたときにグローバルのインデックスを調べて割り当てられた優先度を調べ、必要に応じてより高い優先度で再度追加できますが、実際にこの種のことをする理由がわかりませんものの。


0

フックは実際には配列として格納され、優先順位は数値インデックスであるため、「実質的に」制限はありません。

ただし、実際には、配列サイズはスクリプトの実行に割り当てられたメモリの量によって制限されます。

だから、私はとんでもなく大きな優先順位番号を設定する-これはフックされた関数が格納されている配列の数値インデックスに変換されるだけです-ワードプレスをクラッシュさせるべきではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.