アクションとフィルターの削除

時には、他のプラグイン、テーマ、または WordPress コアによって登録されたフックからコールバック関数を削除したい場合があります。

フックからコールバック関数を削除するには、コールバック関数がアクションとして追加されたかフィルターとして追加されたかに応じて、remove_action() または remove_filter() を呼び出す必要があります。

remove_action() / remove_filter() に渡されるパラメータは、add_action() / add_filter() に渡されたパラメータと同一でなければならず、そうでないと削除は機能しません。

コールバック関数を正常に削除するには、コールバック関数が登録された後に削除を実行する必要があります。実行の順序が重要です。

大きなテーマのパフォーマンスを向上させるために、不要な機能を削除したいとしましょう。

functions.php を見てテーマのコードを分析してみましょう。

  1. function wporg_setup_slider() {
  2. // ...
  3. }
  4. add_action( 'template_redirect', 'wporg_setup_slider', 9 );

wporg_setup_slider 関数は、私たちが必要としないスライダーを追加しており、おそらく巨大な CSS ファイルと、1MB のサイズのカスタムライブラリを使用する JavaScript 初期化ファイルを読み込んでいます。それを取り除くことができます。

wporg_setup_slider コールバック関数が登録された後(functions.php が実行された後)に WordPress にフックしたいので、私たちの最良のチャンスは after_setup_theme フックになります。

  1. function wporg_disable_slider() {
  2. // Make sure all parameters match the add_action() call exactly.
  3. remove_action( 'template_redirect', 'wporg_setup_slider', 9 );
  4. }
  5. // Make sure we call remove_action() after add_action() has been called.
  6. add_action( 'after_setup_theme', 'wporg_disable_slider' );

すべてのコールバックの削除

remove_all_actions() / remove_all_filters() を使用して、フックに関連付けられたすべてのコールバック関数を削除することもできます。

現在のフックの特定

時には、複数のフックでアクションまたはフィルターを実行したいが、どのフックが現在呼び出しているかに基づいて異なる動作をさせたい場合があります。

current_action() / current_filter() を使用して、現在のアクション / フィルターを特定できます。

  1. function wporg_modify_content( $content ) {
  2. switch ( current_filter() ) {
  3. case 'the_content':
  4. // Do something.
  5. break;
  6. case 'the_excerpt':
  7. // Do something.
  8. break;
  9. }
  10. return $content;
  11. }
  12. add_filter( 'the_content', 'wporg_modify_content' );
  13. add_filter( 'the_excerpt', 'wporg_modify_content' );

フックが実行された回数の確認

いくつかのフックは実行中に複数回呼び出されますが、コールバック関数を一度だけ実行したい場合があります。

この状況では、did_action() を使用してフックが何回実行されたかを確認できます。

  1. function wporg_custom() {
  2. // If save_post has been run more than once, skip the rest of the code.
  3. if ( did_action( 'save_post' ) !== 1 ) {
  4. return;
  5. }
  6. // ...
  7. }
  8. add_action( 'save_post', 'wporg_custom' );

「all」フックを使用したデバッグ

すべてのフックでコールバック関数を発火させたい場合は、all フックに登録できます。これは、特定のイベントが発生しているときやページがクラッシュしているときを特定するのに役立つデバッグ状況で便利です。

  1. function wporg_debug() {
  2. echo '<p>' . current_action() . '</p>';
  3. }
  4. add_action( 'all', 'wporg_debug' );