WordPressのアクションやフィルタの適用を最小限にする

WordPress

「add_action」や「add_filter」によってフックすることでWordPressの機能を拡張することができますが、闇雲に追加すると他で追加されたものと競合したり不要な箇所でフックされたりして予期せぬ動作になってしまうことがあります。

以下のような記述をすると適用範囲を最小限にとどめ、他への影響も少なくなります。

(PHP5.3以上)

$func = function ( $wp_query ) use ( &$func ) {
   /** @var \WP_Query $wp_query */
   $wp_query->set( 'posts_per_page', 6 );
   remove_action( 'pre_get_posts', $func );
};
add_action( 'pre_get_posts', $func );

必ずしも無名関数を使用する必要はなく、普通に関数を定義して「add_action」や「remove_action」を呼べば同じように適用を最小限にすることもできます。

function test_function( $wp_query ) {
   /** @var \WP_Query $wp_query */
   $wp_query->set( 'posts_per_page', 6 );
   remove_action( 'pre_get_posts', 'test_function' );
}
add_action( 'pre_get_posts', 'test_function' );

その場合はPHP5.3未満にも対応可能ですが、ちょっとした適用をしたい場合も将来にわたって他と被らない関数名をいちいち考える必要があります。

 

例に挙げたpre_get_postsはメインで表示するための投稿の取得やナビゲーションメニューの取得など、たいてい一回のページの表示で複数回呼ばれます。

特定のフィルタやアクションの後の一回だけで適用されればよい場合は、そのフィルタやアクション内で上のような記述にしておけば別の個所で適用される心配はなくなります。

さらに不要なフィルタやアクションを消すことで不要なプログラムが実行されなくなり、多少の高速化も望めます。

ただし上記のような対応が全く不要なアクションやフィルタもあります。

「init」や「template_redirect」のような一度だけしか呼ばれることがないものがそれにあたります。

そういうことも考慮して適切にremoveも行い、ほかのプラグインなどに影響を与えないようなよいプラグインを作っていきたいものです。

コメント