Де найкраще використовувати add_filter


12

Чи варто використовувати функцію add_filterв гачці initдій мого плагіна або просто в основному скрипті плагіна?

Оскільки іноді я знаходив, що люди використовують фільтр повсюдно, і якщо я покладу його на initгачок, для певного випадку було б пізно.

Чи є якісь загальні поради щодо переваги action& filterгака, щоб ми могли мати більш послідовний стиль коду?

Відповіді:


15

add_filter()і add_action()доступні перед завантаженням будь-якого плагіна. Таким чином, ви можете використовувати обидва в першому рядку свого плагіна або теми.

Для читабельності я рекомендую групувати дії та фільтрувати реєстрації у верхній частині основного файлу:

  • у плагіні - файл із заголовком плагіна
  • в темі functions.php

З цього правила є винятки:

  • Прикуті зворотні дзвінки . У цьому прикладі я реєструю дію shutdownлише тоді, коли wp_nav_menu_objectsбув викликаний перший фільтр для . Отже, другий зворотний виклик не може бути зареєстрований одночасно з першим.
  • Стиль 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.