Suatu hari kamu menempelkan potongan kode ke functions.php untuk menambahkan teks di bawah judul artikel. Kode itu jalan. Beberapa minggu kemudian tema diperbarui, file functions.php tertimpa, dan modifikasi kamu hilang. Kejadian seperti ini yang membuat banyak orang akhirnya belajar cara kerja hook WordPress. Hook memberi titik sisip resmi, jadi kode tambahanmu tidak perlu menempel langsung ke file inti.
Hook WordPress dan Masalah yang Diselesaikannya
Inti WordPress berisi ribuan baris kode yang mengatur cara halaman dirender, cara data disimpan, dan cara pengguna masuk ke dashboard. Kalau setiap penyesuaian kecil harus dilakukan dengan mengedit file di folder wp-includes, WordPress akan mustahil dirawat. Setiap pembaruan keamanan berpotensi menghapus semua perubahan yang pernah kamu buat.
Hook memutus rantai masalah itu. Di berbagai titik penting, WordPress menyediakan semacam pintu yang bisa dibuka oleh kode lain. Kode milikmu tinggal mendaftarkan diri ke pintu tersebut, lalu WordPress memanggilnya pada waktu yang tepat. Isi folder inti tetap utuh, pembaruan bisa dijalankan kapan saja.
Ada dua jenis pintu. Action memanggil fungsimu saat suatu peristiwa terjadi, misalnya setelah artikel disimpan atau sebelum bagian footer dicetak. Filter memberimu kesempatan mengubah nilai yang sedang diproses sebelum nilai itu dipakai, misalnya menambah atribut pada tag gambar atau mengubah panjang kutipan otomatis.
Perbedaan Action dan Filter
Cara paling gampang membedakannya: action tidak mengembalikan apa pun, filter mengembalikan nilai. Kalau fungsimu hanya perlu menjalankan sesuatu, seperti menyimpan data tambahan atau mengirim email, pakai action. Kalau kamu perlu memodifikasi data lalu mengembalikannya, pakai filter.
| Aspek | Action | Filter |
|---|---|---|
| Tujuan | Menjalankan kode saat peristiwa tertentu | Mengubah nilai sebelum dipakai |
| Nilai kembalian | Tidak ada | Wajib mengembalikan nilai |
| Fungsi pendaftar | add_action() |
add_filter() |
| Contoh hook | wp_footer, save_post |
the_content, excerpt_length |
Kesalahan yang sering terjadi: memakai add_filter() untuk fungsi yang tidak mengembalikan nilai. Hasilnya konten bisa berubah jadi kosong karena filter menerima null sebagai pengganti nilai asli.
Struktur Dasar add_action dan add_filter
Kedua fungsi ini punya pola argumen yang mirip. Kamu menyebutkan nama hook, nama fungsi milikmu, prioritas, dan jumlah argumen yang ingin diterima.
add_action( 'wp_footer', 'webdeki_tambah_teks_footer' );
function webdeki_tambah_teks_footer() {
echo '<p>Dibuat dengan sabar.</p>';
}
Prioritas default-nya 10. Angka lebih kecil berarti dijalankan lebih dulu. Kalau kamu perlu fungsi berjalan setelah fungsi lain yang prioritasnya 10, pakai 20. Ini berguna saat ada plugin yang memproses data yang sama.
Untuk filter, fungsimu menerima nilai masukan dan mengembalikannya dalam bentuk yang sudah disesuaikan.
add_filter( 'excerpt_length', 'webdeki_ubah_panjang_kutipan' );
function webdeki_ubah_panjang_kutipan( $length ) {
return 25;
}
Perhatikan parameter $length. Filter selalu mengirim nilai asli ke fungsimu, dan kamu bertanggung jawab mengembalikannya. Kalau lupa menulis return, nilai yang dipakai WordPress berikutnya menjadi kosong.
Menerima Lebih dari Satu Argumen
Beberapa hook mengirim lebih dari satu nilai. Contohnya save_post, yang memberi ID pos dan objek pos. Untuk mengaksesnya, deklarasikan jumlah argumen di parameter keempat.
add_action( 'save_post', 'webdeki_simpan_meta_tambahan', 10, 2 );
function webdeki_simpan_meta_tambahan( $post_id, $post ) {
if ( 'post' !== $post->post_type ) {
return;
}
// proses penyimpanan data tambahan
}
Tanpa angka 2 di akhir, fungsi tetap jalan tapi argumen kedua berisi null. Banyak orang bingung kenapa variabel $post selalu kosong, padahal penyebabnya cuma parameter yang kurang lengkap.
Kapan Memakai Hook, Kapan Tidak
Hook tepat dipakai kalau kamu ingin menambah atau mengubah perilaku tanpa menyentuh file tema atau plugin lain. Beberapa situasi yang cocok:
- Menambahkan skrip atau gaya ke bagian tertentu situs, misalnya hanya di halaman arsip.
- Mengubah format tanggal, panjang kutipan, atau teks tombol.
- Menyimpan data tambahan ke tabel meta saat pos disimpan.
- Menonaktifkan fitur bawaan yang tidak kamu butuhkan, seperti emoji atau oEmbed tertentu.
Sebaliknya, jangan pakai hook untuk hal yang sebenarnya sudah punya API resmi atau pengaturan di dashboard. Menyisipkan CSS lewat wp_head memang jalan, tapi kalau temanya sudah menyediakan opsi pengaturan, cara itu lebih rapi dan lebih mudah dirawat.
Sebelum menulis kode, pastikan kamu nyaman dengan alat editornya. Panduan memilih editor kode untuk WordPress membahas opsi yang mendukung pengecekan sintaks PHP, jadi kesalahan tanda kurung atau titik koma bisa ketahuan sebelum file diunggah. Kalau kode kamu mulai berkaitan dengan tipe konten baru, langkah lanjutannya ada di cara membuat custom post type di WordPress tanpa plugin, yang memanfaatkan hook init untuk mendaftarkan struktur data.
Cara Mencari Nama Hook yang Tepat
Masalah utama pemula biasanya bukan cara menulis hook, melainkan tahu hook apa yang harus dipakai. Ada beberapa jalan untuk menemukannya.
- Telusuri dokumentasi resmi WordPress. Bagian plugin API memuat daftar action dan filter lengkap dengan penjelasan parameternya.
- Lihat source code fungsi yang ingin kamu ubah. Di dalamnya biasanya ada baris
apply_filters()ataudo_action()yang menyebut nama hook dan nilai yang dikirim. - Pakai plugin pemeriksa hook yang menampilkan daftar hook aktif di halaman tertentu. Cara ini berguna saat kamu bekerja dengan tema pihak ketiga yang kodenya cukup rumit.
- Cari di repositori plugin lain. Coba lihat bagaimana plugin populer memakai hook yang sama, terutama soal prioritas dan jumlah argumen.
Nama hook selalu ditulis dalam huruf kecil dengan garis bawah sebagai pemisah, misalnya wp_enqueue_scripts atau the_content. Salah satu huruf saja bisa membuat fungsimu tidak pernah dipanggil, dan WordPress tidak menampilkan pesan kesalahan apa pun. Kalau kode terasa tidak berjalan, cek ejaan nama hook lebih dulu sebelum menelusuri hal lain.
Melepas Hook dengan remove_action
Hook yang sudah terdaftar bisa dicabut. Ini sering dipakai untuk menonaktifkan perilaku bawaan tema atau plugin tanpa mengedit file mereka.
add_action( 'init', 'webdeki_lepas_hook_bawaan' );
function webdeki_lepas_hook_bawaan() {
remove_action( 'wp_head', 'wp_generator' );
}
Syaratnya, prioritas dan nama fungsi saat pencabutan harus sama persis dengan saat pendaftaran. Kalau hook aslinya didaftarkan dengan prioritas 15 dan kamu mencabutnya dengan prioritas default 10, pencabutan gagal tanpa pemberitahuan.
Ringkasan
Hook WordPress terdiri dari dua jenis: action untuk menjalankan kode saat peristiwa tertentu, dan filter untuk mengubah nilai sebelum dipakai. Keduanya didaftarkan lewat add_action() atau add_filter(), dengan prioritas yang menentukan urutan eksekusi. Kunci menghindari bug adalah mengembalikan nilai pada filter, mencantumkan jumlah argumen yang benar, dan menulis nama hook dengan ejaan yang tepat.
Pertanyaan yang Sering Diajukan
Apakah hook bisa dipakai di luar functions.php?
Bisa. Pendaftaran hook biasanya diletakkan di functions.php tema anak atau di file utama sebuah plugin, tapi secara teknis bisa dijalankan dari file PHP mana pun yang dimuat WordPress. Yang penting, kode tersebut dieksekusi sebelum hook yang dituju berjalan.
Kenapa fungsi filter saya membuat konten jadi kosong?
Hampir selalu karena fungsinya tidak mengembalikan nilai. Filter meneruskan hasil fungsi milikmu ke proses berikutnya, jadi kalau tidak ada return, yang diteruskan adalah null dan konten pun hilang.
Bagaimana kalau dua plugin memakai hook yang sama?
Keduanya akan dijalankan sesuai prioritas masing-masing. Kalau prioritasnya sama, urutannya mengikuti kapan masing-masing didaftarkan. Untuk menghindari konflik, gunakan prioritas yang berbeda atau bungkus fungsi milikmu dalam pemeriksaan function_exists() supaya tidak terjadi duplikasi nama fungsi.
