Ketika Anda memiliki suatu mainan atau alat, Anda akan lebih merasa nyaman terhadap mainan / alat tersebut ketika Anda mengerti bagaimana cara kerjanya.
Artikel ini tidak mengajak Anda memahami kode yang ada di dalam plugin WooCommerce JNE Shipping Pack, tetapi hanyalah deskripsi. Deskripsi secara singkat bagaimana plugin tersebut bekerja di toko online Anda yang dibuat dengan WordPress dan WooCommerce.
Component
Di Woocommerce, extension yang memberikan fitur “shipping” biasanya cuma membuat class
yang extend WC_Shipping_Method
. Kemudian meloadnya di file plugin, bersamaan dengan itu mendaftarkan class tersebut ke Woocommerce.
Tetapi Woocommerce JNE Shipping tidak hanya melakukan hal tersebut di toko online Anda. Ada beberapa komponen di dalam plugin tersebut yang juga diloading, seperti template untuk menampilkan kecamatan di halaman cart, check out dan my account, daftar kota dan kecamatan, Repository daftar ongkos kirim kota dan kecamatan, Session untuk mencatat aktivitas user dll.
Daftar ongkos kirim di Woocommerce JNE Shipping Pack, baik yang Anda masukkan dari importer mau pun manual disimpan di database dalam bentuk custom post type. Artinya daftar itu ada di table wp_posts dan wp_post_meta.
Jadi, mari kita ringkas. Plugin WooCommerce JNE Shipping Pack mempunyai komponen:
- Shipping method yang didaftarkan ke Woocommerce
- Daftar kota dan kecamatan
- Repository ongkos kirim
- Session
Jadi anda sudah tahu apa saja yang ada di dalam Woocommerce JNE Shipping Pack. Mari kita lebih mengenalnya melalui bagaimana ongkos kirim tersebut muncul.
Lifecycle
Seperti yang saya katakan di atas, kami mendaftarkan sebuah shipping method (JNE) ke Woocommerce melalui wordpress hook/filter. Kemudian Woocommerce menyimpannya di dalam class WC_Shipping
.
Ketika anda atau customer Anda mengisi data diri di form checkout. Data tersebut secara otomotis dikirim oleh file javascript yang terloading di halaman tersebut ke server melalui ajax request. Data tersebut berisi nama, kota, kecamatan, provinsi, dll. File javascript itu seperti berkata kepada server, “hei, ada perubahan data yang ditulis oleh client. Ini datanya”.
Server menanggapinya dan mengelola data tersebut. Dan menyuruh class WC_Cart
untuk menghitung kembali total belanja. WC_Cart
yang tahu produk apa saja yang mau dibeli customer menghitung ulang, kemudian memanggil WC_Shipping
untuk menghitung kembali opsi ongkos kirim yang harus ditampilkan.
WC_Shipping
kemudian memanggil semua class yang didaftarkan. class WC_JNE_Shipping
yang didaftarkan ke WC_Shipping
mengalkulasi ongkos kirim berdasarkan berat produk-poduk yang ada di cart dan lokasi customer. WC_JNE_Shipping
memanggil komponen lain untuk mengalkulasinya, yaitu Repository ongkos kirim. Dan mengirimkan hasilnya ke WC_Shipping
, diteruskan ke WC_Cart
.
Setelah proses tersebut, respon server terhadap request Javscpript tersebut (AJAX) adalah data HTML hasil dari kalkulasi ulang dari data yang diberikan Javasciprt. Kemudian kode Javascript tersebut mengganti tampilan lama dengan respon server.
Filter Respon WC_JNE_Shipping
Ketika WC_Shipping
ingin memanggil opsi ongkos kirim dari WC_JNE_Shipping
, sebelum itu WC_Shipping
memanggil method is_available
yang ada di WC_JNE_Shipping
. Method is_available
ini menentukan apakah “Available” di kondisi terakhir berdasarkan data parameter yang dikirim. Method is_available
akan mengembalikan response bolean, artinya hanya akan merespon true atau false saja. True jika available dan false jika tidak.
Dan kami menyediakan sebuah filter, sehingga Anda bisa memfilternya. Secara default, kami akan merespon true terus sepanjang anda mengaktifkannya di settings.
Tetapi Anda bisa memfilternya, untuk merespon hal-hal spesifik lainnya.
Contoh: Anda menawarkan free shipping kepada customer Anda jika total belanja customer lebih dari satu juta, dan syarat lain yang Anda setting. Anda mungkin tidak ingin plugin kami menampilkan opsi ongkos kirim jika syarat yang anda setting terpenuhi oleh customer.
Berikut contoh kode yang bisa Anda masukkan ke theme Anda. Copy paste ke file functions.php theme Anda
add_filter( 'woocommerce_shipping_jne_shipping_is_available', function( $is_available, $package ) {
//get instance of WC_Shipping_Free_Shipping from WC_Shipping
$free_shipping = WC()->shipping->shipping_methods['free_shipping'];
//check this was an instanceof WC_Shipping_Free_Shipping, if not just instance it
if( false === ( $free_shipping instanceof WC_Shipping_Free_Shipping ) )
$free_shipping = new WC_Shipping_Free_Shipping;
// check all rules in wc_shipping, if it available,
// we will make our JNE Shipping is not available for the customer
// so change it to false
if( $free_shipping->is_available( $package ) )
$is_available = false;
return $is_available;
}, 10, 2 );
Warning: Jika versi PHP Anda masih di bawah 5.3. Kode di atas akan membuat error. Untuk mengatasinya copy kode di atas dan beri nama. Kemudian masukkan nama fungsi tersebut di parameter dua di add_filter.