Di mana tempat terbaik untuk menggunakan add_filter

12

Haruskah saya menggunakan fungsi ini add_filterdi initkait tindakan plugin saya atau hanya di skrip plugin utama?

Karena kadang-kadang saya menemukan orang menggunakan filter di semua tempat dan jika saya memasukkannya init, akan terlambat untuk beberapa kasus.

Apakah ada saran umum tentang presedensi action& filterhook sehingga kita dapat memiliki gaya kode yang lebih konsisten?

Yoga
sumber

Jawaban:

15

add_filter()dan add_action()tersedia sebelum plugin apa pun dimuat. Jadi Anda bisa menggunakan keduanya di baris pertama plugin atau tema Anda.

Agar mudah dibaca, saya sarankan untuk melakukan aksi grup dan memfilter pendaftaran di bagian paling atas file utama Anda:

  • dalam sebuah plugin, file dengan header plugin
  • dalam sebuah tema functions.php

Ada pengecualian untuk aturan itu:

  • Callback dirantai . Dalam contoh ini saya mendaftarkan tindakan shutdownhanya ketika filter pertama untuk wp_nav_menu_objectsdipanggil. Jadi panggilan balik kedua tidak dapat didaftarkan pada saat yang sama dengan yang pertama.
  • Gaya OOP. Kadang-kadang Anda harus mengatur anggota kelas sebelum Anda dapat mendaftarkan panggilan balik. Menggunakan contoh yang sangat mirip ...

    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
        }
    }

    ... kita melihat contoh kelas dapat dihentikan dengan plugin lain, dan kelas anak dapat mendaftarkan lebih banyak atau berbeda filter dan tindakan.

Selain pengelompokan, Anda dapat melangkah lebih jauh dan menawarkan tindakan khusus untuk membuat penyesuaian untuk pengembang lain lebih mudah.
Berikut adalah contoh dari tema yang saya kerjakan:

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' );

Baris terakhir penting: Tema anak atau plugin dapat menghubungkan ke tindakan t5_theme_hooks_registeredsekarang dan membatalkan registrasi setiap kait sebelumnya. Itu akan menghemat perjuangan dengan prioritas , dan saya bebas untuk mengubah prioritas panggilan balik saya kapan saja.

Tetapi jangan mengandalkan pesanan kode sumber saja. Dokumentasikan kait yang Anda gunakan di blok dokumen Anda. Saya menggunakan tag khusus wp-hookuntuk itu. Berikut adalah contoh dengan kait berantai dari tema yang sama:

/**
 * 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 );
}

Anda tidak perlu menggulir ke atas untuk melihat di mana fungsi-fungsi ini dipanggil, satu kali melihat blok doc sudah cukup. Ini membutuhkan beberapa upaya, karena Anda harus tetap sinkron, registrasi dan komentar, tetapi dalam jangka panjang menghemat waktu yang berharga.

fuxia
sumber
2
+1. Untuk "gaya OOP", preferensi saya adalah menyerahkan kontrol ke kelas / objek yang kemudian mendaftarkan tindakan / filter dalam konstruktornya (atau lebih baru jika sesuai). Ini memberikan enkapsulasi (OOP!) Yang lebih baik, dan menolak pendaftaran kait sampai kelas digunakan / dipakai.
webaware