Wordpress Hooks Actions Filters Priorities Callbacks
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama WordPress untuk melanjutkan topik lainnya.
Kembali ke rujukan utama WordPress untuk melanjutkan topik lainnya.
Hooks di WordPress adalah mekanisme untuk menyisipkan kode tanpa mengubah core, theme, atau plugin lain secara langsung. Dengan hooks, WordPress membuka titik sambung di alur eksekusi: ada yang dipakai untuk menjalankan aksi pada momen tertentu, ada yang dipakai untuk mengubah nilai sebelum dipakai lebih lanjut.
Secara praktis, hooks adalah salah satu alasan ekosistem WordPress bisa sangat extensible. Plugin, theme, dan child theme bisa saling menambah perilaku tanpa saling menimpa file inti.
WordPress punya dua jenis hook utama:
Pakai action kalau tujuanmu adalah efek samping, misalnya:
Action cocok ketika kamu tidak perlu mengembalikan nilai untuk dipakai alur berikutnya.
Contoh:
add_action('wp_enqueue_scripts', function () {
wp_enqueue_style('theme-main', get_stylesheet_uri());
});Di sini callback hanya menjalankan pekerjaan. Tidak ada nilai yang harus diteruskan kembali.
Pakai filter kalau kamu ingin mengubah data yang sedang lewat, misalnya:
Filter harus mengembalikan nilai. Kalau tidak return, hasilnya bisa rusak atau jadi null.
Contoh:
add_filter('the_title', function ($title) {
return '[Draft] ' . $title;
});Kalau yang dibutuhkan adalah transformasi nilai, filter adalah pilihan yang benar. Kalau hanya menjalankan proses samping, action lebih tepat.
Urutan dasarnya begini:
Secara mental model:
Callback adalah fungsi yang dipanggil saat hook aktif. Callback bisa berupa:
Contoh named function:
function mytheme_add_body_class($classes) {
$classes[] = 'has-custom-banner';
return $classes;
}
add_filter('body_class', 'mytheme_add_body_class');Contoh object method:
class Theme_Hooks {
public function register() {
add_action('init', [$this, 'register_post_types']);
}
public function register_post_types() {
register_post_type('book', []);
}
}
Callback yang sehat biasanya:
remove_action() / remove_filter() bila perluKalau callback terlalu besar, susah ditebak efeknya dan susah di-debug.
Priority menentukan urutan eksekusi callback pada hook yang sama.
10Contoh:
add_action('wp_head', 'mytheme_output_meta', 5);
add_action('wp_head', 'mytheme_output_ads', 20);mytheme_output_meta dijalankan sebelum mytheme_output_ads.
Priority penting saat:
Untuk filter, urutan ini bahkan lebih terasa karena hasil callback pertama menjadi input callback berikutnya.
Contoh filter dengan beberapa tahap:
add_filter('the_content', 'add_notice', 5);
add_filter('the_content', 'wrap_content', 20);Kalau add_notice() menambahkan markup di awal, wrap_content() akan menerima hasil yang sudah dimodifikasi.
Jebakan umum:
10 selalu “paling akhir” — padahal cuma defaultKalau urutan itu penting, tulis eksplisit priority-nya dan beri komentar singkat.
Beberapa hook WordPress yang sering muncul di theme/plugin work:
init — register post type, taxonomy, rewrite, atau inisialisasi ringanwp_enqueue_scripts — enqueue asset frontendadmin_enqueue_scripts — enqueue asset adminafter_setup_theme — setup theme supportwidgets_init — register widget areasave_post — reaksi saat post disimpanadmin_init — setup admin-side behaviorwp_head / wp_footer — output markup tambahanthe_title — ubah judul sebelum renderthe_content — ubah konten sebelum tampilexcerpt_length — ubah panjang excerptbody_class — tambah class bodyupload_mimes — tambah tipe file uploadredirect_canonical — kontrol canonical redirectposts_where / posts_join / posts_clauses — ubah query SQL level tertentuDebugging hook sering terasa susah karena masalahnya bukan di syntax, tapi di kapan hook jalan, siapa yang mendaftar, dan priority mana yang menang.
Kadang callback benar, tapi hook-nya tidak pernah terpanggil karena dipasang di tempat yang salah.
Contoh: wp_enqueue_scripts hanya relevan untuk frontend, bukan untuk semua context.
Tambahkan error_log() sementara untuk memastikan callback dipanggil.
add_action('init', function () {
error_log('init dipanggil');
});Masalah umum adalah callback menerima argumen yang salah jumlahnya.
add_filter('the_content', function ($content, $post_id) {
return $content;
}, 10, 2);Kalau kamu lupa angka 2 di akhir, WordPress tidak akan mengirim argumen tambahan ke callback.
Callback yang sama bisa terdaftar dua kali tanpa sadar, terutama kalau file include dipanggil berulang.
remove_action() / remove_filter()Removal harus cocok dengan:
Kalau salah satu beda, hook tidak terhapus.
Beberapa pendekatan yang biasa dipakai:
error_log() untuk cek runtimeadd_action() / add_filter()Kalau kamu perlu mengubah nilai dan justru memakai action, hasilnya tidak akan masuk ke alur data.
Contoh salah:
add_action('the_title', function ($title) {
return 'X ' . $title;
});the_title adalah filter, bukan action. Harus pakai add_filter().
Ini salah satu bug paling sering.
add_filter('the_content', function ($content) {
$content .= '<p>Catatan tambahan</p>';
});Callback di atas tidak mengembalikan apa pun. Hasil akhirnya bisa kacau.
Ada hook yang baru aman dipakai setelah WordPress selesai inisialisasi tertentu.
Contoh:
Kalau sistemmu bergantung pada plugin pihak ketiga, priority dan presence plugin lain harus dianggap sebagai dependency nyata.
Closure kecil itu oke. Tapi kalau logic-nya besar, lebih baik pindahkan ke method atau function bernama supaya:
remove_action() gagal karena callback tidak identikClosure anonim yang dibuat inline sulit dihapus karena referensinya tidak sama.
Kalau kamu tahu hook akan di-remove, pakai named function atau method class.
Hook sering jalan di banyak context: frontend, admin, AJAX, REST, cron. Kalau callback tidak cek context, theme/plugin bisa memunculkan side effect yang aneh.
after_setup_theme untuk theme supportwp_enqueue_scripts untuk assethooks.phpKalau plugin/theme kamu menyediakan extensibility, kamu bisa membuat hook sendiri:
do_action('myplugin_before_render');
$value = apply_filters('myplugin_price', $value);Gunakan do_action() untuk action custom dan apply_filters() untuk filter custom.
add_action() / add_filter() / do_action() / apply_filters() di dokumentasi WordPress