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
shutdown
hanya ketika filter pertama untuk wp_nav_menu_objects
dipanggil. 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_registered
sekarang 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-hook
untuk 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.