add_filterを使用するのに最適な場所はどこですか


12

add_filterプラグインのinitアクションフックで関数を使用する必要がありますか、それともメインのプラグインスクリプトで使用する必要がありますか?

時々人がフィルターをいたるところに使用しているのを見つけたので、initフックに入れた場合、場合によっては手遅れになります。

actionfilterフックの優先順位に関する一般的なアドバイスはありますか?

回答:


15

add_filter()そしてadd_action()どのプラグインがロードされる前にご利用いただけます。したがって、プラグインまたはテーマの最初の行で両方を使用できます。

読みやすくするために、メインファイルの最上部でアクションとフィルター登録をグループ化することをお勧めします。

  • プラグインでは、プラグインヘッダーを含むファイル
  • テーマで functions.php

そのルールには例外があります。

  • 連鎖したコールバック。で、この例で、私はのためのアクションを登録するshutdownための最初のフィルタはときにのみwp_nav_menu_objects呼ばれてきました。したがって、2番目のコールバックを最初のコールバックと同時に登録することはできません。
  • OOPスタイル。コールバックを登録する前に、クラスメンバーを設定する必要がある場合があります。非常によく似た例を使用して…

    add_action(
        'plugins_loaded',
        array ( T5_Plugin_Class_Demo::get_instance(), 'plugin_setup' )
    );
    class T5_Plugin_Class_Demo
    {
        public function plugin_setup()
        {
            $this->plugin_url    = plugins_url( '/', __FILE__ );
            $this->plugin_path   = plugin_dir_path( __FILE__ );
            $this->load_language( 'plugin_unique_name' );
    
            // more stuff: register actions and filters
        }
    }

    …クラスのインスタンス化は別のプラグインによって停止できることがわかり、子クラスはより多くのまたは異なるフィルターとアクションを登録できます。

グループ化に加えて、さらに一歩進んでカスタムアクションを提供し、他の開発者によるカスタマイズを容易にすることができます。
これは私が取り組んでいるテーマの例です:

add_action( 'activate_header',      't5_activate_screen' );
// wp_loaded is too late, WP customizer would not detect the features then.
add_action( 'after_setup_theme',    't5_setup_custom_background' );
add_action( 'after_setup_theme',    't5_setup_custom_header' );
add_filter( 'body_class',           't5_enhance_body_class' );
add_action( 'comment_form_before',  't5_enqueue_comment_reply' );
add_action( 'content_before',       't5_frontpage_widget' );
add_action( 'footer_before',        't5_loop_navigation' );
add_action( 'get_the_excerpt',      't5_excerpt_clean_up', 1 );
add_action( 'header_before',        't5_skiplink', 0, 0 );
add_filter( 'the_title',            't5_fill_empty_title', 20, 1 );
add_action( 'wp_enqueue_scripts',   't5_enqueue_style' );
add_action( 'wp_enqueue_scripts',   't5_enqueue_script' );
add_action( 'wp_loaded',            't5_setup' );
add_action( 'wp_loaded',            't5_page_enhancements' );
add_action( 'wp_loaded',            't5_post_format_support' );
add_action( 'wp_loaded',            't5_load_theme_language' );
add_action( 'wp_loaded',            't5_setup_sidebars' );
add_filter( 'wp_nav_menu_items',    't5_customize_top_menu', 10, 2 );
add_filter( 'wp_nav_menu_args',     't5_nav_menu_args', 10, 1 );
add_filter( 'wp_title',             't5_wp_title_filter', 20, 2 );

add_shortcode( 'gallery',    't5_shortcode_gallery' );
add_shortcode( 'wp_caption', 't5_shortcode_img_caption' );
add_shortcode( 'caption',    't5_shortcode_img_caption' );

// Use this action to unregister theme actions and filters.
do_action( 't5_theme_hooks_registered' );

最後の行は重要です。子テーマまたはプラグインは、t5_theme_hooks_registered今すぐアクションにフックして、以前のフックを登録解除できます。それは保存されます優先順位に苦しんで、私は自由に変更しています私のコールバックの優先順位の任意の時間を。

ただし、ソースコードの順序だけに依存しないでください。使用しているフックをドキュメントブロックに文書化します。wp-hookそのためにカスタムタグを使用しています。同じテーマのチェーンフックの例を次に示します。

/**
 * Register handler for auto-generated excerpt.
 *
 * @wp-hook get_the_excerpt
 * @param   string $excerpt
 * @return  string
 */
function t5_excerpt_clean_up( $excerpt )
{
    if ( ! empty ( $excerpt ) )
        return $excerpt;

    add_filter( 'the_content', 't5_excerpt_content' );

    return $excerpt;
}
/**
 * Strip parts from auto-generated excerpt.
 *
 * @wp-hook the_content
 * @param   string $content
 * @return  string
 */
function t5_excerpt_content( $content )
{
    remove_filter( current_filter(), __FUNCTION__ );

    return preg_replace( '~<(pre|table).*</\1>~ms', '', $content );
}

これらの関数が呼び出される場所を確認するために上にスクロールする必要はありません。docブロックを一目見れば十分です。登録とコメントの両方を同期させる必要があるため、これには多少の努力が必要ですが、長期的には貴重な時間を節約できます。


2
+1。"OOPスタイル"の場合、代わりに、クラス/オブジェクトに制御を渡すことが優先されます。クラス/オブジェクトは、コンストラクターにアクションまたはフィルターを登録します(後で適切な場合)。それはより良い(OOP!)カプセル化を提供し、クラスが利用/インスタンス化されるまでフックの登録を延期します。
webaware 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.