Jawaban Singkat / Key Takeaways

Strict typing WooCommerce bikin bug lama yang dulu diam-diam lewat jadi fatal error di PHP baru. Fokus perbaikannya bukan sekadar tambah (int), tapi bikin kontrak tipe data dari input checkout sampai order meta.

Checkout aman di staging, lalu meledak di production setelah upgrade PHP. Error-nya kecil: null masuk ke fungsi yang minta string, false dianggap array, atau ID order dari form masih berbentuk string. Namun efeknya besar: pelanggan gagal bayar, agency kena komplain, dan log server penuh TypeError.

Kalau kamu sering nulis custom checkout WooCommerce, masalah ini makin sering muncul sejak ekosistem WordPress bergerak ke PHP 8.x. Strict typing WooCommerce bukan cuma topik rapi-rapian kode. Ini soal menjaga funnel revenue tetap hidup saat runtime PHP makin tegas.

Kenapa Bug Lama Baru Sekarang Kelihatan?

Dulu, banyak kode PHP “baik-baik saja” karena coercion terlalu murah hati. String "123" bisa terasa seperti integer, nilai kosong bisa lolos sebagai falsey, dan callback hook sering menerima apa pun dari plugin lain.

Namun, PHP 8 membuat banyak kesalahan tipe jadi lebih eksplisit. Selain itu, WooCommerce checkout penuh input dinamis: session, request POST, coupon, shipping method, payment gateway, user meta, dan order meta. Jadi, satu asumsi tipe yang salah bisa menjalar cepat.

Sumber Paling Sering: Null, False, dan String-Int

1. Null yang Disangka String

Field checkout opsional sering menghasilkan null. Masalah muncul saat kamu langsung kirim ke fungsi internal yang butuh string.

$note = $data['delivery_note'] ?? null;
$clean = sanitize_text_field($note); // rawan TypeError di pola tertentu

Fix lebih sehat:

$note = isset($data['delivery_note']) ? (string) $data['delivery_note'] : '';
$clean = sanitize_text_field($note);

2. False dari API WooCommerce

Banyak function WordPress dan WooCommerce mengembalikan object saat sukses, tetapi false saat gagal. Kalau kamu langsung chaining, checkout bisa fatal.

$product = wc_get_product($product_id);
$price = $product->get_price(); // fatal kalau false

Gunakan guard clause, karena lebih jelas dan lebih gampang dites:

$product = wc_get_product($product_id);
if (! $product instanceof WC_Product) {
    return new WP_Error('invalid_product', 'Produk checkout tidak valid.');
}

3. String-Int dari Request

Semua data dari $_POST datang sebagai string. Jadi "42" bukan 42. Ini kelihatan remeh, namun bisa merusak validasi kuantitas, fee, stock rule, dan lookup order.

Pakai “Boundary Casting”, Bukan Casting Sembarangan

Kesalahan umum dev WooCommerce: menabur (int), (string), dan (float) di mana-mana sampai bug terlihat hilang. Padahal, itu sering cuma memindahkan bug ke tempat lain.

Cara yang lebih kuat: lakukan casting hanya di boundary. Artinya, normalisasi tipe saat data masuk dari luar sistem, seperti $_POST, REST API, session, webhook, atau metadata lama. Setelah itu, fungsi internal menerima data yang sudah bersih dan konsisten.

  • Request boundary: ubah string ke int, bool, decimal, atau enum-like string.
  • Storage boundary: saat baca order meta, anggap hasilnya belum tepercaya.
  • Integration boundary: gateway pembayaran, courier API, dan ERP wajib divalidasi ulang.

Template Validasi Checkout yang Lebih Tahan PHP Baru

function hz_get_checkout_int(array $source, string $key, int $default = 0): int {
    if (! isset($source[$key])) {
        return $default;
    }

    $value = filter_var($source[$key], FILTER_VALIDATE_INT);
    return $value === false ? $default : $value;
}

function hz_get_checkout_string(array $source, string $key): string {
    return isset($source[$key]) ? sanitize_text_field((string) $source[$key]) : '';
}

Dengan helper kecil seperti ini, kamu mengurangi duplikasi dan membuat aturan tipe data checkout lebih mudah diaudit. Selain itu, tim agency bisa punya standar yang sama di semua project klien.

Checklist Audit Strict Typing WooCommerce

  • Cari semua akses langsung ke $_POST, $_GET, dan $_REQUEST.
  • Audit pemakaian wc_get_product(), wc_get_order(), dan get_user_by() sebelum method call.
  • Pastikan order meta lama tidak diasumsikan selalu string atau array.
  • Jalankan test di PHP 8.1, 8.2, 8.3, dan 8.4 jika stack mendukung.
  • Aktifkan logging error di staging, bukan di production display.

Untuk performa checkout, kamu juga bisa baca panduan internal tentang WooCommerce Core Web Vitals dan checkout. Jika masalahmu lebih ke lonjakan traffic, lanjutkan ke object cache untuk WooCommerce.

Referensi Teknis yang Layak Kamu Bookmark

FAQ Strict Typing WooCommerce

Apakah harus pakai declare(strict_types=1) di plugin WooCommerce?

Boleh, tetapi hati-hati di file yang banyak berinteraksi dengan hook WordPress. Mulai dari service class internal dulu, lalu pastikan boundary input sudah dinormalisasi.

Kenapa checkout rusak hanya setelah upgrade PHP?

Karena PHP baru lebih tegas terhadap tipe yang salah. Bug lama sebenarnya sudah ada, namun runtime lama sering membiarkannya lewat.

Apa prioritas audit pertama?

Mulai dari callback checkout, payment gateway custom, dan order meta. Tiga area ini paling sering menerima data campuran dari user, plugin, dan integrasi eksternal.

Penutup: Checkout Butuh Kontrak, Bukan Tebakan

Strict typing WooCommerce memaksa kamu berhenti menebak bentuk data. Justru itu kabar baik. Dengan boundary casting, guard clause, dan test matrix PHP, checkout custom jadi lebih stabil, lebih aman, dan lebih siap menghadapi upgrade berikutnya.

About the Author

Dzul Qurnain

Suka nonton Anime, ngoding dan bagi-bagi tips kalau tahu.. Oh iya, suka baca ( tapi yang menarik menurutku aja)... Praktisi WordPress, web development, SEO, dan server administration yang membagikan tutorial teknis dan catatan implementasi nyata.

View All Articles