Bagaimana menggunakan WooCommerce Hook untuk mengimplementasikan fungsi keranjang belanja kustom dan manajemen pesanan tingkat lanjut.

3 menit baca
2026-03-17
2026-06-03
2,495
Saya mendapatkan komisi ketika Anda berbelanja melalui tautan di bawah ini, tanpa biaya tambahan untuk Anda.

Memahami dasar-dasar sistem Hook di WooCommerce

WooCommerce dibangun berdasarkan platform WordPress dan mewarisi arsitektur plugin yang kuat dari WordPress. Mekanisme ekspansi intinya adalah “hook” (pautan/koneksi). Hook memungkinkan pengembang untuk “menyisipkan” kode kustom pada titik-titik tertentu dalam proses eksekusi WooCommerce, sehingga mereka dapat melakukan penyesuaian mendalam terhadap fungsionalitas tanpa perlu mengubah file inti dari WooCommerce itu sendiri. Pendekatan ini sesuai dengan prinsip “Open-Closed” (Terbuka-Tertutup), yang menjaga stabilitas WooCommerce, sementara semua kebutuhan personalisasi dapat dipenuhi melalui penggunaan hook.

WooCommerce terutama menyediakan dua jenis hook: action hooks dan filter hooks. Action hooks digunakan untuk… do_action() Fungsi tersebut digunakan untuk memicu suatu proses tertentu, dan menyediakan “titik eksekusi” yang memungkinkan pengembang menambahkan fitur tambahan, seperti mengirim surel khusus setelah pesanan dibuat. Fungsi ini tidak mengembalikan nilai apa pun, dan hanya berfungsi untuk menjalankan operasi tambahan tersebut. Hook filter (penyambung filter) digunakan dalam konteks pengelolaan data atau alur proses tertentu. apply_filters() Fungsi tersebut memungkinkan pengguna untuk “mengubah nilai suatu variabel”, misalnya dengan menerapkan perhitungan diskon yang kompleks sebelum harga barang ditampilkan. Filter wajib mengembalikan sebuah nilai.

Memahami perbedaan antara kedua jenis “hook” (pengait/pemanggil fungsi) ini merupakan kunci untuk menggunakan keduanya secara efektif. Secara sederhana, “action” berfungsi untuk “melakukan sesuatu”, sedangkan “filter” berfungsi untuk “mengubah sesuatu”. Para pengembang dapat memanfaatkan perbedaan ini untuk mengatur alur eksekusi kode dengan lebih tepat. add_action()add_filter() Fungsi tersebut menggantungkan fungsi penyeru balik (callback function)nya pada “hook”-hook tertentu, sehingga dapat ikut serta dalam alur kerja standar WooCommerce.

推荐阅读 WooCommerce Advanced Data Pivot: Cara Menyesuaikan Atribut Produk dan Bidang Manajemen Inventaris

(Menggunakan action hooks untuk menyesuaikan perilaku keranjang belanja)

Keranjang belanja merupakan bagian inti dari pengalaman berbelanja di toko online. WooCommerce menyediakan berbagai hook aksi (action hooks) yang memungkinkan pengembang untuk memantau dan merespons setiap aktivitas pengguna di dalam keranjang belanja.

UltaHost – Hosting untuk WordPress
Jaminan pengembalian uang dalam 30 hari, bandwidth dan basis data yang tidak terbatas, perlindungan DDoS gratis, diskon 50% untuk pembelian selama 3 tahun (dari harga normal: 50%).

Salah satu hook dasar dan penting adalah… woocommerce_add_to_cartKetika sebuah barang berhasil ditambahkan ke keranjang belanja, hook ini akan teraktivasi. Para pengembang dapat memanfaatkannya untuk melacak perilaku pengguna, memperbarui peringatan stok, atau menyinkronkan data dengan sistem pihak ketiga. Sebagai contoh, Anda dapat mencatat barang-barang yang sering ditambahkan dan kemudian dihapus oleh pengguna, guna menganalisis rekomendasi yang lebih personalisasi di kemudian hari.

add_action('woocommerce_add_to_cart', 'track_product_addition', 10, 6);
function track_product_addition($cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data) {
    $user_id = get_current_user_id();
    if ($user_id) {
        $viewed_products = get_user_meta($user_id, '_tracked_cart_additions', true) ?: array();
        array_unshift($viewed_products, $product_id);
        $viewed_products = array_slice(array_unique($viewed_products), 0, 20); // 保留最近20条
        update_user_meta($user_id, '_tracked_cart_additions', $viewed_products);
    }
}

Hook kunci lainnya adalah… woocommerce_before_calculate_totalsFungsi tersebut dipanggil pada halaman keranjang belanja, halaman pembayaran, serta setiap saat jumlah total dan subtotal dihitung. Ini merupakan waktu yang paling tepat untuk mengubah harga barang secara dinamis atau menambahkan diskon/kontribusi biaya secara global. Sebagai contoh, Anda dapat menetapkan diskon bertingkat berdasarkan jumlah total barang di keranjang belanja.

add_action('woocommerce_before_calculate_totals', 'apply_volume_discount', 20);
function apply_volume_discount($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    if (did_action('woocommerce_before_calculate_totals') >= 2) return;

$total_quantity = 0;
    foreach ($cart->get_cart() as $cart_item) {
        $total_quantity += $cart_item['quantity'];
    }

// 如果总数量超过10件,所有商品打9折
    if ($total_quantity > 10) {
        foreach ($cart->get_cart() as $cart_item) {
            $original_price = $cart_item['data']->get_price();
            $cart_item['data']->set_price($original_price * 0.9);
        }
    }
}

Menggunakan filter hook untuk memproses data barang dan pesanan

Filter hooks memberikan para pengembang kemampuan untuk mengontrol data secara detail; mulai dari item di keranjang belanja hingga tampilan pesanan akhir, semuanya dapat disesuaikan sesuai keinginan.

woocommerce_add_cart_item_data Filter tersebut diaktifkan saat barang ditambahkan ke keranjang belanja, dan memungkinkan pengembang untuk menambahkan data khusus (custom data) ke dalam item keranjang belanja tersebut. Data tersebut akan disimpan bersama dengan item keranjang belanja dalam sesi (session) dan terus ditransfer ke dalam detail pesanan (order). Hal ini sangat penting untuk mewujudkan personalisasi barang, seperti penulisan teks atau pemilihan warna yang diinginkan oleh pelanggan.

推荐阅读 Dari Nol ke Satu: Panduan Teknis Lengkap untuk Membangun Situs Toko Online WooCommerce yang Berkinerja Tinggi

add_filter('woocommerce_add_cart_item_data', 'add_engraving_text_to_cart_item', 10, 3);
function add_engraving_text_to_cart_item($cart_item_data, $product_id, $variation_id) {
    if (!empty($_POST['engraving_text'])) {
        $cart_item_data['engraving'] = sanitize_text_field($_POST['engraving_text']);
        // 为具有不同雕刻文本的相同产品生成唯一ID
        $cart_item_data['unique_key'] = md5($product_id . serialize($cart_item_data));
    }
    return $cart_item_data;
}

Ketika diperlukan untuk menampilkan data kustom tersebut di keranjang belanja dan pesanan, Anda dapat menggunakannya. woocommerce_get_item_data Filter. Fungsi ini mengubah format data khusus yang disimpan dalam item keranjang belanja menjadi array yang dapat ditampilkan di antarmuka pengguna (frontend).

Di backend manajemen pesanan, untuk menampilkan informasi dengan lebih jelas, kita mungkin perlu memformat metadata dari setiap item pesanan.woocommerce_order_item_get_formatted_meta_data Filter memungkinkan kita untuk mengontrol metode penampilan data meta tertentu. Misalnya, kita dapat menyembunyikan metadata teknis yang diawali dengan karakter “_”, sehingga hanya informasi khusus yang berkaitan dengan bisnis yang ditampilkan kepada pemilik toko.

add_filter('woocommerce_order_item_get_formatted_meta_data', 'format_order_item_meta_for_display', 10, 2);
function format_order_item_meta_for_display($formatted_meta, $item) {
    $display_meta = array();
    foreach ($formatted_meta as $meta_id => $meta) {
        // 不显示以下划线开头的“隐藏”元数据
        if (!empty($meta->key) && substr($meta->key, 0, 1) !== '_') {
            $display_meta[$meta_id] = $meta;
        }
    }
    return $display_meta;
}

Membuat proses manajemen pesanan tingkat lanjut

Proses status pesanan default di WooCommerce mungkin tidak dapat memenuhi semua kebutuhan bisnis, seperti status “Menunggu Pemeriksaan Kualitas” atau “Sedang Diantarkan”. Dengan menggunakan hook (fungsi tambahan dalam kode program), kita dapat memperluas proses tersebut.

hosting.com hosting bersama
Kinerja tinggi, dilengkapi dengan CPU AMD EPYC, penyimpanan SSD NVMe, dan LiteSpeed, dukungan internal ahli 24 jam sehari, langkah-langkah keamanan canggih termasuk SSL, brute force, malware, dan perlindungan DDoS, menghemat hingga 731 TB/bulan.

Pertama-tama, Anda perlu mendaftarkan status pesanan khusus (custom order status) tersebut. Hal ini biasanya dilakukan di… init Proses dilakukan selama aksi berlangsung, kemudian selesai melalui… wc_order_statuses Filter tersebut menambahkannya ke dalam daftar status.

add_action('init', 'register_custom_order_statuses');
function register_custom_order_statuses() {
    register_post_status('wc-quality-check', array(
        'label'                     => '质检中',
        'public'                    => true,
        'exclude_from_search'       => false,
        'show_in_admin_all_list'    => true,
        'show_in_admin_status_list' => true,
        'label_count'               =&gt; _n_noop('质检中 <span class="count">(%s)</span>'Pemeriksaan kualitas sedang berlangsung.' <span class="count">(%s)</span>')
    ));
}

add_filter('wc_order_statuses', 'add_custom_status_to_list');
function add_custom_status_to_list($order_statuses) {
    $order_statuses['wc-quality-check'] = '质检中';
    return $order_statuses;
}

Selanjutnya, perlu mendefinisikan perilaku (aksi) yang akan diambil terkait perubahan status.woocommerce_order_status_changed Action hooks dapat menangkap perubahan status pesanan apa pun. Kita dapat memanfaatkannya untuk secara otomatis mengirim pemberitahuan tugas ke departemen pemeriksaan kualitas ketika pesanan memasuki status “Dalam Pemeriksaan Kualitas”.

add_action('woocommerce_order_status_changed', 'handle_custom_order_status_change', 10, 4);
function handle_custom_order_status_change($order_id, $old_status, $new_status, $order) {
    if ($new_status == 'quality-check') {
        // 获取订单信息
        $order_number = $order->get_order_number();
        $admin_email = get_option('admin_email');
        // 发送邮件通知(此处为示例,实际应用可能需要更复杂的逻辑)
        wp_mail($admin_email, '新订单待质检', "订单 #{$order_number} 已进入质检环节,请及时处理。");
    }
}

Selain itu, kita juga dapat menggunakan… woocommerce_admin_order_actions Pada halaman daftar pesanan di backend, ditambahkan tombol aksi cepat untuk status yang disesuaikan, seperti “Lulus Pemeriksaan Kualitas”. Dengan satu klik, status pesanan dapat diubah ke tahap berikutnya, sehingga sangat meningkatkan efisiensi manajemen.

推荐阅读 Panduan Lengkap Pengembangan Tema WordPress: Teknologi Inti dan Praktik dari Pemula hingga Ahli

Menyimpulkan.

Sistem hook (pautan) di WooCommerce merupakan fondasi utama dari solusi e-commerce ini, yang memberikan kemampuan ekspansi yang luas kepada para pengembang. Mulai dari mendengarkan dan merespons peristiwa di keranjang belanja melalui hook aksi (action hooks), hingga mengontrol secara detail produk, harga, dan data tampilan dengan hook filter (filter hooks), serta membuat alur status pesanan yang disesuaikan dengan logika bisnis yang kompleks, hook menyediakan titik akses yang terstandarisasi sepanjang proses pengembangan. Memahami konteks penggunaan dan cara penerapan hook-hook inti ini memungkinkan pengembang untuk melampaui keterbatasan fitur bawaan, menciptakan toko WooCommerce yang sangat disesuaikan dengan kebutuhan, otomatis, dan efisien, yang cocok untuk berbagai skenario e-commerce—baik ritel maupun grosir, baik produk fisik maupun layanan digital.

FAQ - Pertanyaan yang Sering Diajukan.

Di mana saya sebaiknya menulis kode hook kustom saya?

Untuk penyesuaian satu kali yang sangat terkait dengan tampilan tema, hal tersebut dapat ditulis di dalam subtema (subtopic). functions.php Di dalam file tersebut. Ini merupakan tempat yang sering digunakan untuk melakukan pengujian cepat dan modifikasi sederhana.

Hosting bersama InterServer.
Hosting bersama seharga $2,50 USD per bulan, diskon $0,1 USD untuk bulan pertama dengan kode promo tryinterserver, serta 461 skrip aplikasi cloud yang dapat diinstal dengan sekali klik.

Namun, demi modularitas, kemudahan pemeliharaan, dan independensi kode (untuk menghindari hilangnya fitur akibat perubahan tema), praktik terbaik adalah dengan membuat sebuah plugin fungsi khusus. Letakkan semua kode kustom WooCommerce (seperti hook, shortcode, dll.) di dalam plugin tersebut, sehingga fitur toko online Anda dapat berjalan dengan stabil, terlepas dari tema yang digunakan.

Bagaimana cara mendeteksi apakah kode hook saya diaktifkan dengan benar?

Pertama-tama, pastikan bahwa mode debug di WordPress telah diaktifkan (di…). wp-config.php Di dalam pengaturan define('WP_DEBUG', true);Hal ini membantu dalam mendeteksi kesalahan tata bahasa.

Untuk mendebug logika pemicuan hook, Anda dapat menambahkan kode pencatatan log sementara di awal fungsi callback Anda. error_log() Fungsi tersebut akan menulis informasi debug ke log server, atau menggunakan… wc_get_logger() Menulis file log khusus untuk WooCommerce. Dengan memeriksa apakah ada output yang diharapkan dalam log, kita dapat menentukan apakah hook tersebut terpicu dan apakah fungsi tersebut telah dieksekusi.

Apa yang harus saya lakukan jika kode diskon khusus saya bertentangan dengan beberapa plugin (seperti kupon)?

Prioritas eksekusi hook (hook execution priority)add_action Parameter ketiga merupakan kunci untuk menyelesaikan konflik. Prioritas defaultnya adalah 10; semakin kecil angkanya, semakin cepat proses tersebut dieksekusi. Jika perhitungan diskon Anda bergantung pada status akhir keranjang belanja, Anda sebaiknya menetapkan prioritas yang lebih tinggi (misalnya 20) untuk memastikan bahwa logika Anda dieksekusi setelah plugin lain (seperti plugin kupon, yang mungkin memiliki prioritas 10) telah memodifikasi harga terlebih dahulu.

Jika konfliknya kompleks, mungkin diperlukan penggunaan penilaian kondisional untuk memeriksa apakah sudah ada diskon lain yang diterapkan dalam fungsi Anda, atau menggunakan… did_action()doing_action() Fungsi ini digunakan untuk menentukan lingkungan eksekusi saat ini, sehingga dapat mencegah perhitungan yang berulang atau terjadinya siklus logika yang tidak berujung (logika dead loop).

Setelah menambahkan status pesanan khusus, mengapa status tersebut tidak terlihat dalam filter drop-down daftar pesanan di backend?

Hanya dengan… wc_order_statuses Status pendaftaran filter terkadang tidak cukup untuk memastikan bahwa filter tersebut akan muncul dalam daftar drop-down di semua antarmuka manajemen. Hal ini dapat disebabkan oleh masalah dengan cache atau mekanisme pembuatan daftar tersebut.

Pastikan kode Anda telah terload dengan benar. Selain itu, Anda dapat mencoba memperbarui cache halaman backend (Shift+F5), atau menggunakan… woocommerce_register_shop_order_post_statuses Filter tersebut melakukan proses pendaftaran pada tingkat yang lebih dasar (lebih mendasar). Jika masalah masih terjadi, periksa apakah ada plugin atau kode tema lain yang menimpa (menggantikan fungsi) filter Anda. Anda dapat mencoba menyelesaikan masalah ini dengan sementara waktu menonaktifkan plugin lainnya.