Indeks Hook WordPress
Indeks yang bisa dicari untuk action dan filter WordPress yang benar-benar dipakai pengembang — lengkap dengan signature add_action/add_filter yang tepat, kapan ia dipicu, contoh yang berfungsi, dan hal yang sering menjebak orang.
39 hook, lengkap dengan signature add_action / add_filter yang persis, kapan ia dipicu, contoh yang berfungsi, dan hal yang sering bikin orang tersandung. 1 ditandai belum terverifikasi — kami belum mencocokkan jumlah argumennya dengan source WordPress, dan kami lebih memilih menandainya ketimbang menyajikan tebakan sebagai fakta.
Daftar ini tidak lengkap dan memang tidak berpura-pura begitu — WordPress punya ribuan hook. Yang tercakup adalah hook yang benar-benar sering dipakai orang.
Berjalan setelah WordPress selesai dimuat tetapi sebelum header apa pun dikirim. Tempat standar untuk mendaftarkan custom post type, taxonomy, dan aturan rewrite.
Dipicu
Pada setiap permintaan, front end maupun admin, setelah core, plugin, dan tema dimuat.
Signature
add_action( 'init', 'my_callback' );Contoh
add_action( 'init', function () {
register_post_type( 'book', array(
'public' => true,
'label' => 'Books',
'show_in_rest' => true, // required for the block editor
) );
} );Jebakannya
init berjalan pada SETIAP permintaan, termasuk AJAX, REST, dan cron. Melakukan apa pun yang lambat di sini (permintaan HTTP, query berat) membebani setiap kali halaman dimuat. Selain itu: pengguna saat ini sudah tersedia di sini, tetapi Anda belum bisa menampilkan apa pun — header belum dikirim, tapi hampir akan dikirim.
Berjalan sekali setelah tema dimuat. Tempat yang tepat untuk add_theme_support(), add_image_size(), dan mendaftarkan menu navigasi.
Dipicu
Setelah functions.php tema dimuat, SEBELUM init.
Signature
add_action( 'after_setup_theme', 'my_callback' );Contoh
add_action( 'after_setup_theme', function () {
add_theme_support( 'post-thumbnails' );
add_theme_support( 'title-tag' );
add_image_size( 'card', 600, 400, true ); // true = hard crop
} );Jebakannya
Mendaftarkan ukuran gambar di init alih-alih di sini kebetulan berfungsi dalam banyak kasus lalu gagal secara misterius dalam beberapa kasus. Gunakan after_setup_theme — memang untuk itulah ia dibuat.
Berjalan setelah semua plugin aktif dimuat. Titik aman paling awal untuk berinteraksi dengan plugin lain.
Dipicu
Setelah setiap berkas plugin disertakan, sebelum tema dimuat.
Signature
add_action( 'plugins_loaded', 'my_callback' );Jebakannya
Pengguna saat ini BELUM tersedia di sini — wp_get_current_user() tidak akan bekerja dengan andal. Jika Anda membutuhkan pengguna, gunakan init.
Berjalan setelah WordPress dimuat sepenuhnya — plugin, tema, init, dan pengguna semuanya sudah siap.
Dipicu
Setelah init dan setelah pengguna saat ini disiapkan.
Signature
add_action( 'wp_loaded', 'my_callback' );Berjalan di awal setiap permintaan admin. Dipakai untuk register_setting(), pemeriksaan izin, dan pengalihan admin.
Dipicu
Pada setiap permintaan sisi admin.
Signature
add_action( 'admin_init', 'my_callback' );Jebakannya
Ia juga dipicu pada permintaan admin-ajax.php, yang sebenarnya bukan \"layar admin\". Jika callback Anda mengasumsikan ada sebuah layar, jagai dengan wp_doing_ajax().
Satu-satunya tempat yang tepat untuk meng-enqueue CSS dan JavaScript front-end.
Dipicu
Saat halaman front-end dimuat, sebelum head dirender.
Signature
add_action( 'wp_enqueue_scripts', 'my_callback' );Contoh
add_action( 'wp_enqueue_scripts', function () {
wp_enqueue_style(
'child-style',
get_stylesheet_uri(),
array( 'parent-style' ), // load AFTER the parent
wp_get_theme()->get( 'Version' ) // cache-bust on version change
);
} );Jebakannya
Meski namanya begitu, ia menangani STYLE sekaligus script — tidak ada hook wp_enqueue_styles, dan banyak orang membuang waktu mencarinya. Selain itu: hook ini tidak dipicu di admin (gunakan admin_enqueue_scripts) atau di editor blok (gunakan enqueue_block_editor_assets).
Meng-enqueue CSS/JS di admin. Menerima hook suffix layar saat ini sehingga Anda bisa memuat aset hanya pada satu layar.
Dipicu
Saat halaman admin dimuat.
Signature
add_action( 'admin_enqueue_scripts', 'my_callback' ); // receives $hook_suffixContoh
add_action( 'admin_enqueue_scripts', function ( $hook ) {
if ( 'settings_page_my-plugin' !== $hook ) {
return; // do not load our JS on every admin screen
}
wp_enqueue_script( 'my-admin', plugins_url( 'admin.js', __FILE__ ), array(), '1.0', true );
} );Jebakannya
Tidak menjagai berdasarkan $hook adalah penyebab paling umum sebuah plugin merusak layar admin lain yang tidak terkait. Muat aset Anda di tempat yang membutuhkannya saja dan tidak di tempat lain.
Meng-enqueue aset ke editor blok (Gutenberg) saja — bukan front end, bukan bagian admin lainnya.
Dipicu
Saat editor blok dimuat.
Signature
add_action( 'enqueue_block_editor_assets', 'my_callback' );Mencetak keluaran ke dalam <head>. Dipakai untuk tag meta dan CSS kritis inline.
Dipicu
Di dalam <head>, pada front end.
Signature
add_action( 'wp_head', 'my_callback' );Jebakannya
JANGAN meng-enqueue script atau style di sini — gunakan wp_enqueue_scripts, yang membuat WordPress menangani dependensi dan deduplikasi. Mencetak tag <script> ke dalam wp_head melewati semua itu dan itulah sebabnya banyak situs memuat jQuery tiga kali.
Mencetak keluaran tepat sebelum </body>. Tempat yang tepat untuk cuplikan analitik dan markup yang ditangguhkan.
Dipicu
Di akhir halaman front-end.
Signature
add_action( 'wp_footer', 'my_callback' );Jebakannya
Tema yang lupa memanggil wp_footer() merusak admin bar, merusak plugin mana pun yang meng-enqueue script footer, dan otomatis ditolak dalam tinjauan tema wordpress.org.
Memfilter konten pos tepat sebelum ditampilkan. Tempat lazim untuk menambahkan markup di depan atau belakang sebuah pos.
Dipicu
Setiap kali the_content() dipanggil.
Signature
add_filter( 'the_content', 'my_callback' ); // receives $contentContoh
add_filter( 'the_content', function ( $content ) {
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
return $content; // <- the guard everyone forgets
}
return $content . '<p class="cta">Enjoyed this? Read more.</p>';
} );Jebakannya
Ini berjalan jauh lebih sering daripada yang Anda kira — di widget, di respons REST, di pembuatan ringkasan sebagian plugin, dan sekali per pos dalam loop di halaman arsip. Tanpa penjaga is_singular / in_the_loop / is_main_query, CTA Anda muncul lima belas kali di indeks blog dan di dalam feed RSS. Ini adalah filter yang paling sering disalahgunakan di WordPress.
Memfilter judul pos sebelum ditampilkan.
Dipicu
Setiap kali the_title() atau get_the_title() dipanggil.
Signature
add_filter( 'the_title', 'my_callback', 10, 2 ); // receives $title, $post_idJebakannya
Ia juga dipicu untuk judul di menu admin, di menu navigasi, dan di <title> dokumen. Memfilternya tanpa syarat akan mengubah nama di tempat-tempat yang tidak Anda maksudkan.
Menentukan berapa banyak KATA yang dimuat oleh ringkasan yang dibuat otomatis. Bawaannya 55.
Dipicu
Saat WordPress membuat ringkasan untuk pos yang tidak punya ringkasan manual.
Signature
add_filter( 'excerpt_length', 'my_callback' ); // receives $length (words)Contoh
add_filter( 'excerpt_length', function ( $length ) {
return 25;
}, 999 ); // high priority: many themes set this too, and last one winsJebakannya
Ia tidak berpengaruh pada pos yang punya ringkasan MANUAL — ringkasan itu dipakai apa adanya. Selain itu, banyak tema menetapkan filter ini sendiri, jadi Anda sering perlu angka prioritas tinggi untuk menang.
Mengubah string yang ditambahkan pada ringkasan yang dipotong. Bawaannya \" […]\".
Dipicu
Saat ringkasan yang dibuat otomatis dipotong.
Signature
add_filter( 'excerpt_more', 'my_callback' ); // receives $moreMengubah sebuah query SEBELUM ia berjalan. Cara yang tepat untuk mengubah apa yang tampil di arsip — jauh lebih baik daripada WP_Query kedua.
Dipicu
Setelah query var diurai, sebelum SQL dibangun.
Signature
add_action( 'pre_get_posts', 'my_callback' ); // receives WP_Query $query (by reference)Contoh
add_action( 'pre_get_posts', function ( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return; // <- both guards are mandatory
}
if ( $query->is_category() ) {
$query->set( 'posts_per_page', 12 );
}
} );Jebakannya
Ia juga berjalan di ADMIN, dan berjalan untuk SETIAP query, termasuk menu, widget, dan pustaka media. Hilangkan penjaga is_admin() dan is_main_query() maka Anda akan diam-diam mengubah apa yang ditampilkan daftar pos admin — bug yang benar-benar sulit dilacak. Perhatikan juga: ubah $query, jangan mengembalikan apa pun.
Memfilter klausa SQL WHERE mentah dari sebuah query.
Dipicu
Saat SQL query sedang dirakit.
Signature
add_filter( 'posts_where', 'my_callback', 10, 2 ); // receives $where, WP_Query $queryJebakannya
Anda menulis SQL mentah. Selalu jagai dengan $query->is_main_query() dan selalu gunakan $wpdb->prepare() untuk input pengguna apa pun. Ini adalah cara tercepat memasukkan SQL injection ke situs WordPress.
Memfilter jumlah total pos yang ditemukan sebuah query — yang menjadi dasar penghitungan paginasi.
Dipicu
Setelah query berjalan, sebelum paginasi dihitung.
Signature
add_filter( 'found_posts', 'my_callback', 10, 2 ); // receives $found_posts, WP_Query $queryMenentukan ukuran piksel di atas mana WordPress memperkecil unggahan dan menyajikan salinan \"-scaled\" alih-alih berkas asli Anda. Bawaannya 2560.
Dipicu
Saat unggahan, ketika WordPress memutuskan apakah sebuah gambar tergolong \"besar\".
Signature
add_filter( 'big_image_size_threshold', 'my_callback' ); // receives int $thresholdContoh
// Serve originals at full resolution — no -scaled copy.
add_filter( 'big_image_size_threshold', '__return_false' );
// Or just raise the ceiling:
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );Jebakannya
Ini adalah penyebab paling umum dari \"gambar saya terlihat buram setelah diunggah ke WordPress\", dan hampir tidak ada yang tahu ia ada. Gambar asli Anda masih ada di disk — hanya saja tidak pernah disajikan. Perhatikan bahwa ini berlaku pada sisi TERPANJANG, dan hanya memengaruhi gambar yang diunggah setelah filter aktif.
Memfilter larik ukuran gambar yang akan dihasilkan WordPress untuk sebuah unggahan. Hapus (unset) sebuah ukuran untuk menghentikan pembuatannya.
Dipicu
Saat unggahan, sebelum berkas turunan dibuat.
Signature
add_filter( 'intermediate_image_sizes_advanced', 'my_callback', 10, 2 ); // receives $sizes, $metadataContoh
add_filter( 'intermediate_image_sizes_advanced', function ( $sizes ) {
unset( $sizes['1536x1536'] );
unset( $sizes['2048x2048'] );
return $sizes;
} );Jebakannya
Menghapus ukuran yang sebenarnya DIPAKAI tema Anda berarti WordPress jatuh kembali ke gambar asli ukuran penuh — yang lebih buruk daripada ruang disk yang Anda hemat. Selain itu, ini hanya menghentikan pembuatan berkas BARU; berkas yang ada tetap sampai Anda membuatnya ulang.
Menentukan kualitas JPEG saat WordPress meng-encode ulang gambar yang diunggah. Bawaannya 82.
Dipicu
Setiap kali WordPress menulis JPEG.
Signature
add_filter( 'jpeg_quality', 'my_callback', 10, 2 ); // receives $quality, $contextJebakannya
Kualitas 82 baik untuk foto tetapi terlihat buruk untuk tangkapan layar, logo, dan grafik datar — objek itu punya tepi yang tajam dan tidak ada noise fotografis untuk menyembunyikan artefak. Selain itu: wp_editor_set_quality adalah filter yang lebih modern dan mencakup kelas image editor secara langsung; menyetel keduanya adalah hal yang umum.
Menentukan kualitas keluaran yang dipakai oleh kelas WP_Image_Editor (GD dan Imagick).
Dipicu
Saat sebuah instance image editor menyetel kualitasnya.
Signature
add_filter( 'wp_editor_set_quality', 'my_callback', 10, 2 ); // receives $quality, $mime_typeMenambahkan ukuran gambar kustom Anda ke dropdown ukuran di modal media dan editor blok.
Dipicu
Saat UI media membangun pemilih ukurannya.
Signature
add_filter( 'image_size_names_choose', 'my_callback' ); // receives $sizesContoh
add_filter( 'image_size_names_choose', function ( $sizes ) {
return array_merge( $sizes, array( 'card' => __( 'Card', 'textdomain' ) ) );
} );Jebakannya
add_image_size() mendaftarkan ukuran tetapi TIDAK membuatnya bisa dipilih di editor. Setiap pertanyaan \"ukuran gambar kustom saya tidak muncul di dropdown\" adalah karena filter ini tidak ada.
Memeriksa atau menolak sebuah berkas SEBELUM dipindahkan ke folder unggahan.
Dipicu
Selama unggahan, sebelum berkas ditulis.
Signature
add_filter( 'wp_handle_upload_prefilter', 'my_callback' ); // receives $fileJebakannya
Untuk menolak berkas, setel $file['error'] ke sebuah string pesan lalu kembalikan $file. Mengembalikan false atau melempar exception tidak akan melakukan yang Anda inginkan.
Memfilter larik metadata (termasuk ukuran yang dihasilkan) setelah sebuah attachment diproses.
Dipicu
Setelah gambar turunan dibuat saat unggahan.
Signature
add_filter( 'wp_generate_attachment_metadata', 'my_callback', 10, 2 ); // receives $metadata, $attachment_idJebakannya
Ini adalah hook yang dipakai plugin optimasi gambar. Ia bisa lambat — berjalan setelah setiap ukuran gambar ditulis, dan melakukan permintaan HTTP di sini membuat setiap unggahan harus menunggunya.
Memfilter kandidat srcset yang dihasilkan WordPress untuk gambar responsif.
Dipicu
Saat gambar responsif dirender.
Signature
add_filter( 'wp_calculate_image_srcset', 'my_callback', 10, 5 );Jebakannya
Menghapus ukuran medium_large (768w) di tempat lain diam-diam menurunkan kualitas srcset — ukuran itu ada hampir sepenuhnya untuk menyajikannya.
Kami belum memverifikasi jumlah argumen persis hook ini terhadap source WordPress. Periksa developer.wordpress.org sebelum mengandalkannya. Kami lebih memilih menandai ketidakpastian ini ketimbang diam-diam menyajikan tebakan sebagai fakta.
Mendaftarkan halaman menu dan submenu admin.
Dipicu
Saat menu admin sedang dibangun.
Signature
add_action( 'admin_menu', 'my_callback' );Contoh
add_action( 'admin_menu', function () {
add_options_page(
'My Plugin',
'My Plugin',
'manage_options', // capability — NOT a role
'my-plugin',
'my_render_settings_page'
);
} );Jebakannya
Argumen capability adalah sebuah CAPABILITY, bukan role. Meneruskan \"administrator\" tampak berfungsi (karena admin punya capability dengan nama itu di sebagian konfigurasi) lalu diam-diam memberi akses kepada orang yang salah. Gunakan manage_options.
Mencetak sebuah notice di bagian atas layar admin.
Dipicu
Saat halaman admin dirender.
Signature
add_action( 'admin_notices', 'my_callback' );Jebakannya
Ia dipicu di SETIAP layar admin. Plugin yang menampilkan notice \"terima kasih telah memasang!\" tanpa syarat di semua layar adalah pola yang paling dibenci di admin WordPress. Jagai, dan buat bisa ditutup.
Berjalan setiap kali sebuah pos dibuat atau diperbarui. Tempat lazim untuk menyimpan data meta box.
Dipicu
Setelah sebuah pos ditulis ke basis data.
Signature
add_action( 'save_post', 'my_callback', 10, 3 ); // receives $post_id, $post, $updateContoh
add_action( 'save_post', function ( $post_id ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
if ( wp_is_post_revision( $post_id ) ) return;
if ( ! current_user_can( 'edit_post', $post_id ) ) return;
// ... now it is safe to save
}, 10, 1 );Jebakannya
Ia dipicu pada AUTOSAVE dan REVISI selain penyimpanan sungguhan. Tanpa tiga penjaga di atas, meta Anda tertimpa dengan nilai kosong setiap kali editor melakukan autosave — bug yang terlihat seperti data hilang secara acak.
Mendaftarkan meta box di layar edit pos.
Dipicu
Saat layar edit dibangun.
Signature
add_action( 'add_meta_boxes', 'my_callback', 10, 2 ); // receives $post_type, $postJebakannya
Meta box klasik tidak muncul di editor blok kecuali editor blok jatuh ke mode kompatibilitas. Untuk situs yang native editor blok, daftarkan post meta dengan show_in_rest dan bangun panel sidebar sebagai gantinya.
Berjalan setelah seorang pengguna berhasil masuk.
Dipicu
Saat autentikasi berhasil.
Signature
add_action( 'wp_login', 'my_callback', 10, 2 ); // receives $user_login, WP_User $userBerjalan segera setelah pengguna baru dibuat.
Dipicu
Saat pendaftaran.
Signature
add_action( 'user_register', 'my_callback', 10, 2 ); // receives $user_id, $userdataMemfilter hasil autentikasi. Kembalikan sebuah WP_Error untuk memblokir login.
Dipicu
Selama percobaan login.
Signature
add_filter( 'authenticate', 'my_callback', 30, 3 ); // receives $user, $username, $passwordJebakannya
Prioritas sangat penting di sini. Core WordPress memasang pemeriksaannya sendiri di prioritas 20 dan 30 — pasang terlalu awal maka Anda berjalan sebelum kata sandi sempat diperiksa.
Mendaftarkan route dan field REST.
Dipicu
Saat REST API diinisialisasi.
Signature
add_action( 'rest_api_init', 'my_callback' );Contoh
add_action( 'rest_api_init', function () {
register_rest_route( 'myplugin/v1', '/items', array(
'methods' => 'GET',
'callback' => 'my_get_items',
'permission_callback' => '__return_true', // BE DELIBERATE ABOUT THIS
) );
} );Jebakannya
permission_callback WAJIB — sejak WP 5.5 menghilangkannya memicu sebuah notice, dan menyetelnya ke __return_true membuat endpoint sepenuhnya publik. Itu tidak masalah untuk data yang memang publik dan merupakan lubang serius untuk yang lain. Putuskan, jangan biarkan default.
Menambahkan interval perulangan kustom untuk wp_schedule_event().
Dipicu
Saat WordPress membangun daftar jadwal yang tersedia.
Signature
add_filter( 'cron_schedules', 'my_callback' ); // receives $schedulesContoh
add_filter( 'cron_schedules', function ( $schedules ) {
$schedules['every_five_minutes'] = array(
'interval' => 300, // seconds
'display' => __( 'Every 5 minutes', 'textdomain' ),
);
return $schedules;
} );Jebakannya
WP-Cron bukan cron sungguhan. Ia hanya dipicu saat ada yang mengunjungi situs, jadi situs dengan trafik rendah tidak akan menjalankan jadwal lima menit setiap lima menit. Jika waktunya benar-benar penting, matikan WP-Cron (DISABLE_WP_CRON) dan panggil wp-cron.php dari cron sistem sungguhan.
Berjalan segera setelah sebuah komentar disimpan.
Dipicu
Saat komentar dikirim.
Signature
add_action( 'comment_post', 'my_callback', 10, 3 ); // receives $comment_id, $approved, $commentdataMemfilter data komentar sebelum disimpan. Dipakai untuk pemeriksaan spam dan validasi.
Dipicu
Sebelum komentar ditulis.
Signature
add_filter( 'preprocess_comment', 'my_callback' ); // receives $commentdataJebakannya
Untuk menolak komentar di sini, panggil wp_die() dengan sebuah pesan — mengembalikan false tidak menghentikannya.
Berjalan di halaman pesanan-diterima setelah checkout berhasil.
Dipicu
Saat pelanggan tiba di halaman terima kasih.
Signature
add_action( 'woocommerce_thankyou', 'my_callback' ); // receives $order_idJebakannya
Ini BUKAN tempat yang andal untuk memicu pemenuhan pesanan. Ia hanya dipicu jika pelanggan benar-benar sampai di halaman terima kasih — jika mereka menutup tab setelah membayar, ia tidak pernah berjalan. Gunakan woocommerce_payment_complete atau hook transisi status pesanan untuk apa pun yang wajib terjadi.
Menghasilkan markup tepat sebelum tombol tambah-ke-keranjang di halaman produk.
Dipicu
Saat halaman produk dirender.
Signature
add_action( 'woocommerce_before_add_to_cart_button', 'my_callback' );Menambahkan, menghapus, atau menyusun ulang field di checkout klasik.
Dipicu
Saat formulir checkout dibangun.
Signature
add_filter( 'woocommerce_checkout_fields', 'my_callback' ); // receives $fieldsJebakannya
Ini hanya memengaruhi checkout KLASIK (shortcode). Checkout berbasis blok yang lebih baru sepenuhnya mengabaikannya dan dikustomisasi melalui Slot & Fill di JavaScript. Ini menjebak hampir semua orang pada percobaan pertama.